diff --git a/include/wx/msw/mdi.h b/include/wx/msw/mdi.h index a2931c069c..63e42eb74b 100644 --- a/include/wx/msw/mdi.h +++ b/include/wx/msw/mdi.h @@ -94,7 +94,6 @@ public: void OnIconized(wxIconizeEvent& event); bool HandleActivate(int state, bool minimized, WXHWND activate); - bool HandleCommand(WXWORD id, WXWORD cmd, WXHWND control); // override window proc for MDI-specific message processing virtual WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); @@ -109,6 +108,9 @@ public: #endif // wxUSE_MENUS protected: + // override to pass menu/toolbar events to the active child first + virtual bool TryValidator(wxEvent& event); + #if wxUSE_MENUS_NATIVE virtual void InternalSetMenuBar(); #endif // wxUSE_MENUS_NATIVE diff --git a/src/common/docmdi.cpp b/src/common/docmdi.cpp index cca56168cb..6d3d3bb2da 100644 --- a/src/common/docmdi.cpp +++ b/src/common/docmdi.cpp @@ -70,7 +70,10 @@ void wxDocMDIParentFrame::OnMRUFile(wxCommandEvent& event) bool wxDocMDIParentFrame::TryValidator(wxEvent& event) { - return m_docManager && m_docManager->ProcessEventHere(event); + if ( m_docManager && m_docManager->ProcessEventHere(event) ) + return true; + + return wxMDIParentFrame::TryValidator(event); } void wxDocMDIParentFrame::OnCloseWindow(wxCloseEvent& event) @@ -135,7 +138,10 @@ wxDocMDIChildFrame::~wxDocMDIChildFrame(void) bool wxDocMDIChildFrame::TryValidator(wxEvent& event) { - return m_childView && m_childView->ProcessEventHere(event); + if ( m_childView && m_childView->ProcessEventHere(event) ) + return true; + + return wxMDIChildFrame::TryValidator(event); } void wxDocMDIChildFrame::OnActivate(wxActivateEvent& event) diff --git a/src/msw/mdi.cpp b/src/msw/mdi.cpp index 7ea3a70a66..c307027bfa 100644 --- a/src/msw/mdi.cpp +++ b/src/msw/mdi.cpp @@ -540,25 +540,6 @@ WXLRESULT wxMDIParentFrame::MSWWindowProc(WXUINT message, } break; - case WM_COMMAND: - { - 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; - } - - // 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: m_clientWindow = OnCreateClient(); // Uses own style for client style @@ -688,13 +669,18 @@ void wxMDIParentFrame::OnMDICommand(wxCommandEvent& event) #endif // wxUSE_MENUS -bool wxMDIParentFrame::HandleCommand(WXWORD id, WXWORD cmd, WXHWND hwnd) +bool wxMDIParentFrame::TryValidator(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::TryValidator(event); } WXLRESULT wxMDIParentFrame::MSWDefWindowProc(WXUINT message,