X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6fa30495b51914b29ca50323d71703cd1c6fb87e..be4da8f0315e36de2322cd312c7184f55c0333f5:/src/msw/mdi.cpp diff --git a/src/msw/mdi.cpp b/src/msw/mdi.cpp index b0ec95a99d..399c30e7a4 100644 --- a/src/msw/mdi.cpp +++ b/src/msw/mdi.cpp @@ -26,33 +26,28 @@ #if wxUSE_MDI && !defined(__WXUNIVERSAL__) +#include "wx/mdi.h" + #ifndef WX_PRECOMP - #include "wx/setup.h" #include "wx/frame.h" #include "wx/menu.h" #include "wx/app.h" #include "wx/utils.h" #include "wx/dialog.h" - #if wxUSE_STATUSBAR - #include "wx/statusbr.h" - #endif + #include "wx/statusbr.h" #include "wx/settings.h" #include "wx/intl.h" #include "wx/log.h" + #include "wx/toolbar.h" #endif #include "wx/stockitem.h" -#include "wx/mdi.h" #include "wx/msw/private.h" #if wxUSE_STATUSBAR && wxUSE_NATIVE_STATUSBAR #include "wx/msw/statbr95.h" #endif -#if wxUSE_TOOLBAR - #include "wx/toolbar.h" -#endif // wxUSE_TOOLBAR - #include // --------------------------------------------------------------------------- @@ -64,11 +59,8 @@ extern wxMenu *wxCurrentPopupMenu; extern const wxChar *wxMDIFrameClassName; // from app.cpp extern const wxChar *wxMDIChildFrameClassName; extern const wxChar *wxMDIChildFrameClassNameNoRedraw; -extern void wxAssociateWinWithHandle(HWND hWnd, wxWindow *win); extern void wxRemoveHandleAssociation(wxWindow *win); -static HWND invalidHandle = 0; - // --------------------------------------------------------------------------- // constants // --------------------------------------------------------------------------- @@ -215,6 +207,8 @@ bool wxMDIParentFrame::Create(wxWindow *parent, return false; } + SetOwnBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE)); + // unlike (almost?) all other windows, frames are created hidden m_isShown = false; @@ -545,6 +539,14 @@ bool wxMDIParentFrame::HandleCommand(WXWORD id, WXWORD cmd, WXHWND hwnd) return win->MSWCommand(cmd, id); } + if (wxCurrentPopupMenu) + { + wxMenu *popupMenu = wxCurrentPopupMenu; + wxCurrentPopupMenu = NULL; + if (popupMenu->MSWCommand(cmd, id)) + return true; + } + // is it one of standard MDI commands? WXWPARAM wParam = 0; WXLPARAM lParam = 0; @@ -743,7 +745,7 @@ bool wxMDIChildFrame::Create(wxMDIParentFrame *parent, msflags |= WS_MINIMIZEBOX; if (style & wxMAXIMIZE_BOX) msflags |= WS_MAXIMIZEBOX; - if (style & wxTHICK_FRAME) + if (style & wxRESIZE_BORDER) msflags |= WS_THICKFRAME; if (style & wxSYSTEM_MENU) msflags |= WS_SYSMENU; @@ -763,7 +765,13 @@ bool wxMDIChildFrame::Create(wxMDIParentFrame *parent, m_hWnd = (WXHWND)::SendMessage(GetWinHwnd(parent->GetClientWindow()), WM_MDICREATE, 0, (LONG)(LPSTR)&mcs); - wxAssociateWinWithHandle((HWND) GetHWND(), this); + if ( !m_hWnd ) + { + wxLogLastError(_T("WM_MDICREATE")); + return false; + } + + SubclassWin(m_hWnd); return true; } @@ -799,6 +807,11 @@ bool wxMDIChildFrame::Show(bool show) if ( show ) ::BringWindowToTop(GetHwnd()); + // we need to refresh the MDI frame window menu to include (or exclude if + // we've been hidden) this frame + wxMDIParentFrame *parent = (wxMDIParentFrame *)GetParent(); + MDISetMenu(parent->GetClientWindow(), NULL, NULL); + return true; } @@ -1084,7 +1097,7 @@ bool wxMDIChildFrame::HandleMDIActivate(long WXUNUSED(activate), bool wxMDIChildFrame::HandleWindowPosChanging(void *pos) { WINDOWPOS *lpPos = (WINDOWPOS *)pos; -#if defined(__WIN95__) + if (!(lpPos->flags & SWP_NOSIZE)) { RECT rectClient; @@ -1098,15 +1111,7 @@ bool wxMDIChildFrame::HandleWindowPosChanging(void *pos) lpPos->cx = rectClient.right - rectClient.left; lpPos->cy = rectClient.bottom - rectClient.top; } -#if wxUSE_TOOLBAR - wxMDIParentFrame* pFrameWnd = (wxMDIParentFrame *)GetParent(); - if (pFrameWnd && pFrameWnd->GetToolBar() && pFrameWnd->GetToolBar()->IsShown()) - { - pFrameWnd->GetToolBar()->Refresh(); - } -#endif } -#endif // Win95 return false; } @@ -1124,14 +1129,14 @@ bool wxMDIChildFrame::HandleGetMinMaxInfo(void *mmInfo) minHeight = GetMinHeight(); // but allow GetSizeHints() to set the min size - if ( minWidth != -1 ) + if ( minWidth != wxDefaultCoord ) { info->ptMinTrackSize.x = minWidth; processed = true; } - if ( minHeight != -1 ) + if ( minHeight != wxDefaultCoord ) { info->ptMinTrackSize.y = minHeight; @@ -1153,7 +1158,9 @@ WXLRESULT wxMDIChildFrame::MSWDefWindowProc(WXUINT message, WXWPARAM wParam, WXL bool wxMDIChildFrame::MSWTranslateMessage(WXMSG* msg) { - return wxFrame::MSWTranslateMessage(msg); + // we must pass the parent frame to ::TranslateAccelerator(), otherwise it + // doesn't do its job correctly for MDI child menus + return MSWDoTranslateMessage((wxMDIChildFrame *)GetParent(), msg); } // --------------------------------------------------------------------------- @@ -1162,8 +1169,6 @@ bool wxMDIChildFrame::MSWTranslateMessage(WXMSG* msg) void wxMDIChildFrame::MSWDestroyWindow() { - invalidHandle = GetHwnd(); - wxMDIParentFrame *parent = (wxMDIParentFrame *)GetParent(); // Must make sure this handle is invalidated (set to NULL) since all sorts @@ -1177,8 +1182,6 @@ void wxMDIChildFrame::MSWDestroyWindow() if (parent->GetActiveChild() == (wxMDIChildFrame*) NULL) ResetWindowStyle((void*) NULL); - invalidHandle = 0; - if (m_hMenu) { ::DestroyMenu((HMENU) m_hMenu); @@ -1192,10 +1195,10 @@ void wxMDIChildFrame::MSWDestroyWindow() // style when a child is maximised (a double border looks silly.) bool wxMDIChildFrame::ResetWindowStyle(void *vrect) { -#if defined(__WIN95__) RECT *rect = (RECT *)vrect; wxMDIParentFrame* pFrameWnd = (wxMDIParentFrame *)GetParent(); wxMDIChildFrame* pChild = pFrameWnd->GetActiveChild(); + if (!pChild || (pChild == this)) { HWND hwndClient = GetWinHwnd(pFrameWnd->GetClientWindow()); @@ -1227,7 +1230,6 @@ bool wxMDIChildFrame::ResetWindowStyle(void *vrect) return true; } } -#endif // Win95 return false; } @@ -1256,11 +1258,7 @@ bool wxMDIClientWindow::CreateClient(wxMDIParentFrame *parent, long style) if ( style & wxVSCROLL ) msStyle |= WS_VSCROLL; -#if defined(__WIN95__) DWORD exStyle = WS_EX_CLIENTEDGE; -#else - DWORD exStyle = 0; -#endif wxWindowCreationHook hook(this); m_hWnd = (WXHWND)::CreateWindowEx @@ -1371,13 +1369,16 @@ void wxMDIChildFrame::OnIdle(wxIdleEvent& event) static void MDISetMenu(wxWindow *win, HMENU hmenuFrame, HMENU hmenuWindow) { - ::SendMessage(GetWinHwnd(win), WM_MDISETMENU, -#ifdef __WIN32__ - (WPARAM)hmenuFrame, (LPARAM)hmenuWindow -#else - 0, MAKELPARAM(hmenuFrame, hmenuWindow) -#endif - ); + if ( hmenuFrame || hmenuWindow ) + { + if ( !::SendMessage(GetWinHwnd(win), + WM_MDISETMENU, + (WPARAM)hmenuFrame, + (LPARAM)hmenuWindow) ) + { + wxLogLastError(_T("SendMessage(WM_MDISETMENU)")); + } + } // update menu bar of the parent window wxWindow *parent = win->GetParent(); @@ -1478,4 +1479,3 @@ static void UnpackMDIActivate(WXWPARAM wParam, WXLPARAM lParam, } #endif // wxUSE_MDI && !defined(__WXUNIVERSAL__) -