diff --git a/xvaga/oswin32.cpp b/xvaga/oswin32.cpp index 438535cc3..4a7bbef4e 100755 --- a/xvaga/oswin32.cpp +++ b/xvaga/oswin32.cpp @@ -199,16 +199,31 @@ void* OsWin32_GetPrinterInfo(int& size, const char* printer) return pdm; } -void OsWin32_SetCaptionStyle(WXHWND handle, bool set) +void OsWin32_SetCaptionStyle(WXHWND handle, long style) { - HWND hwnd = (HWND)handle; - DWORD s = ::GetWindowLong(hwnd, GWL_STYLE); - if (set) + HWND hWnd = (HWND)handle; + LONG s = ::GetWindowLong(hWnd, GWL_STYLE); + + if (style & wxSYSTEM_MENU) s |= WS_CAPTION; else s &= ~WS_CAPTION; + + if (style & wxCLOSE_BOX) + s |= WS_SYSMENU; + else + s &= ~WS_SYSMENU; + s |= WS_CLIPSIBLINGS; // Forzatura necessaria da wx261 - ::SetWindowLong(hwnd, GWL_STYLE, s); + ::SetWindowLong(hWnd, GWL_STYLE, s); + + if (style & wxCLOSE_BOX) + { + HMENU hMenu = ::GetSystemMenu(hWnd, FALSE); + ::EnableMenuItem(hMenu, SC_CLOSE, MF_BYCOMMAND | MF_ENABLED); + HICON hIcon = ::ExtractIcon(NULL, "res/campo.ico", 0); + ::SendMessage(hWnd, WM_SETICON, ICON_SMALL, (LPARAM)hIcon); + } } /////////////////////////////////////////////////////////// diff --git a/xvaga/oswin32.h b/xvaga/oswin32.h index 62baf4c8a..8aac47ad8 100755 --- a/xvaga/oswin32.h +++ b/xvaga/oswin32.h @@ -12,7 +12,7 @@ unsigned int OsWin32_LoadIcon(const char* file); int OsWin32_EnumerateFamilies(WXHDC hDC, char** families, int max_count); int OsWin32_EnumerateSizes(WXHDC hDC, const char* name, long* sizes, short* scalable, int max_count); -void OsWin32_SetCaptionStyle(WXHWND handle, bool set); +void OsWin32_SetCaptionStyle(WXHWND handle, long style); void* OsWin32_GetPrinterInfo(int& size, const char* printer); void OsWin32_PlaceProcessInWindow(unsigned int instance, const char* name, unsigned int parent); diff --git a/xvaga/xvaga.cpp b/xvaga/xvaga.cpp index 1d75e7714..08fcb9435 100755 --- a/xvaga/xvaga.cpp +++ b/xvaga/xvaga.cpp @@ -4158,7 +4158,7 @@ RCT* xvt_vobj_get_outer_rect(WINDOW win, RCT *rctp) return rctp; } -XVT_PALETTE xvt_vobj_get_palet(WINDOW win) +XVT_PALETTE xvt_vobj_get_palet(WINDOW WXUNUSED(win)) { return NULL; } WINDOW xvt_vobj_get_parent(WINDOW win) @@ -4208,9 +4208,9 @@ BOOLEAN xvt_vobj_is_focusable(WINDOW win) void xvt_vobj_maximize(WINDOW win) { - wxFrame* pMain = wxDynamicCast((wxObject*)win, wxFrame); - if (pMain != NULL) - pMain->Maximize(); + XVT_ASSERT(win != NULL_WIN && _task_win != NULL); + if (win == TASK_WIN) + _task_win->Maximize(); else { CAST_WIN(win, w); @@ -4312,7 +4312,7 @@ WINDOW xvt_win_create(WIN_TYPE wtype, const RCT* rct_p, const char* title, int m const wxRect rct = NormalizeRCT(rct_p); const wxString caption = title; - long style = wxCLIP_CHILDREN | wxCLIP_SIBLINGS | wxWANTS_CHARS; + long style = wxCLIP_SIBLINGS | wxCLIP_CHILDREN | wxWANTS_CHARS; if (win_flags & WSF_VSCROLL) style |= wxVSCROLL; if (win_flags & WSF_HSCROLL) @@ -4324,6 +4324,8 @@ WINDOW xvt_win_create(WIN_TYPE wtype, const RCT* rct_p, const char* title, int m case W_DOC: if (!caption.IsEmpty()) style |= wxSYSTEM_MENU; + if (win_flags & WSF_CLOSE) + style |= wxSYSTEM_MENU | wxCLOSE_BOX; break; case W_PLAIN: // style |= wxBORDER; // Non attivare MAI il bordo! @@ -4342,9 +4344,9 @@ WINDOW xvt_win_create(WIN_TYPE wtype, const RCT* rct_p, const char* title, int m w->SetBackgroundStyle(wxBG_STYLE_CUSTOM); // Lo sfondo viene disegnato nella OnPaint #ifdef WIN32 - OsWin32_SetCaptionStyle(w->GetHWND(), wtype == W_DOC); + OsWin32_SetCaptionStyle(w->GetHWND(), style); #else - OsLinux_SetCaptionStyle((wxWindow*)w, style); + OsLinux_SetCaptionStyle(w, style); #endif if (menu_rid > 0 && menu_rid != 8000) // 8000 = NULL_MENU_RID diff --git a/xvaga/xvtwin.cpp b/xvaga/xvtwin.cpp index 2f1d604d9..c07f58bcf 100755 --- a/xvaga/xvtwin.cpp +++ b/xvaga/xvtwin.cpp @@ -468,13 +468,33 @@ bool TDCMapper::HasValidDC(WINDOW owner) const IMPLEMENT_DYNAMIC_CLASS(TwxWindowBase, wxWindow) +#ifdef WIN32 +WXLRESULT TwxWindowBase::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) +{ + WXLRESULT rc = 0; + bool processed = false; + + switch (nMsg) + { + case WM_CLOSE: + processed = !Close(); + break; + default: + break; + } + + if ( !processed ) + rc = wxWindow::MSWWindowProc(nMsg, wParam, lParam); + + return rc; +} +#endif + bool TwxWindowBase::CreateBase(wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint &pos, const wxSize &size, long style) { - // Evita inutili sfarfallamenti in quanto wxWidgets crea le finestre visibili per default - wxWindowBase::Show(false); - bool ok = Create(parent, id, pos, size, style, title); - return ok; + wxWindowBase::Show(false); // Evita inutili sfarfallamenti + return Create(parent, id, pos, size, style, title); } TwxWindowBase::TwxWindowBase(wxWindow *parent, wxWindowID id, const wxString &title, diff --git a/xvaga/xvtwin.h b/xvaga/xvtwin.h index 14a5d81e6..d172e6b26 100755 --- a/xvaga/xvtwin.h +++ b/xvaga/xvtwin.h @@ -118,6 +118,10 @@ private: virtual wxString GetTitle() const { return m_strTitle; } #endif +#ifdef WIN32 + virtual WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); +#endif + public: bool CreateBase(wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint &pos, const wxSize &size, long style); @@ -125,7 +129,6 @@ public: TwxWindowBase() { } TwxWindowBase(wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint & pos, const wxSize & size, long style); - virtual ~TwxWindowBase() { } DECLARE_DYNAMIC_CLASS(TwxWindowBase) };