X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/79f9ea0541e410d65899631db630e955af3b6a84..5e1d513ea393c769cc83e4bc69cec34c3d0a9507:/src/msw/mdi.cpp?ds=sidebyside diff --git a/src/msw/mdi.cpp b/src/msw/mdi.cpp index 0a72ab2ea7..1e9255d92d 100644 --- a/src/msw/mdi.cpp +++ b/src/msw/mdi.cpp @@ -522,8 +522,8 @@ void wxMDIParentFrame::ActivatePrevious() // --------------------------------------------------------------------------- WXLRESULT wxMDIParentFrame::MSWWindowProc(WXUINT message, - WXWPARAM wParam, - WXLPARAM lParam) + WXWPARAM wParam, + WXLPARAM lParam) { WXLRESULT rc = 0; bool processed = false; @@ -541,22 +541,22 @@ WXLRESULT wxMDIParentFrame::MSWWindowProc(WXUINT message, break; case WM_COMMAND: + // system messages such as SC_CLOSE are sent as WM_COMMANDs to the + // parent MDI frame and we must let the DefFrameProc() have them + // for these commands to work (without it, closing the maximized + // MDI children doesn't work, for example) { WXWORD id, cmd; WXHWND hwnd; UnpackCommand(wParam, lParam, &id, &hwnd, &cmd); - (void)HandleCommand(id, cmd, hwnd); - - // even if the frame didn't process it, there is no need to try it - // once again (i.e. call wxFrame::HandleCommand()) - we just did it, - // so pretend we processed the message anyhow - processed = true; + if ( cmd == 0 /* menu */ && + id >= SC_SIZE /* first system menu command */ ) + { + MSWDefWindowProc(message, wParam, lParam); + processed = true; + } } - - // always pass this message DefFrameProc(), otherwise MDI menu - // commands (and sys commands - more surprisingly!) won't work - MSWDefWindowProc(message, wParam, lParam); break; case WM_CREATE: @@ -580,8 +580,9 @@ WXLRESULT wxMDIParentFrame::MSWWindowProc(WXUINT message, break; case WM_SIZE: - // though we don't (usually) resize the MDI client to exactly fit the - // client area we need to pass this one to DefFrameProc to allow the children to show + // though we don't (usually) resize the MDI client to exactly fit + // the client area we need to pass this one to DefFrameProc to + // allow the children to show break; } @@ -688,13 +689,18 @@ void wxMDIParentFrame::OnMDICommand(wxCommandEvent& event) #endif // wxUSE_MENUS -bool wxMDIParentFrame::HandleCommand(WXWORD id, WXWORD cmd, WXHWND hwnd) +bool wxMDIParentFrame::TryBefore(wxEvent& event) { - wxMDIChildFrame * const child = GetActiveChild(); - if ( child && child->HandleCommand(id, cmd, hwnd) ) - return true; + // menu (and toolbar) events should be sent to the active child frame + // first, if any + if ( event.GetEventType() == wxEVT_COMMAND_MENU_SELECTED ) + { + wxMDIChildFrame * const child = GetActiveChild(); + if ( child && child->ProcessEventHere(event) ) + return true; + } - return wxFrame::HandleCommand(id, cmd, hwnd); + return wxMDIParentFrameBase::TryBefore(event); } WXLRESULT wxMDIParentFrame::MSWDefWindowProc(WXUINT message, @@ -732,7 +738,7 @@ bool wxMDIParentFrame::MSWTranslateMessage(WXMSG* msg) // but it doesn't check for the (custom) accelerators of the window menu // items as it's not part of the menu bar as it's handled by Windows itself // so we need to do this explicitly - if ( m_accelWindowMenu->Translate(this, msg) ) + if ( m_accelWindowMenu && m_accelWindowMenu->Translate(this, msg) ) return true; #endif // wxUSE_MENUS && wxUSE_ACCEL @@ -1034,8 +1040,8 @@ void wxMDIChildFrame::Activate() // --------------------------------------------------------------------------- WXLRESULT wxMDIChildFrame::MSWWindowProc(WXUINT message, - WXWPARAM wParam, - WXLPARAM lParam) + WXWPARAM wParam, + WXLPARAM lParam) { WXLRESULT rc = 0; bool processed = false; @@ -1068,11 +1074,6 @@ WXLRESULT wxMDIChildFrame::MSWWindowProc(WXUINT message, MSWDefWindowProc(message, wParam, lParam); break; - case WM_SYSCOMMAND: - // DefMDIChildProc handles SC_{NEXT/PREV}WINDOW here, so pass it - // the message (the base class version does not) - return MSWDefWindowProc(message, wParam, lParam); - case WM_WINDOWPOSCHANGING: processed = HandleWindowPosChanging((LPWINDOWPOS)lParam); break; @@ -1423,11 +1424,9 @@ void MDISetMenu(wxWindow *win, HMENU hmenuFrame, HMENU hmenuWindow) (WPARAM)hmenuFrame, (LPARAM)hmenuWindow) ) { -#ifdef __WXDEBUG__ DWORD err = ::GetLastError(); if ( err ) wxLogApiError(_T("SendMessage(WM_MDISETMENU)"), err); -#endif // __WXDEBUG__ } }