From cd60273b3d988d2674faf953f7f4372b3b6664a9 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Thu, 26 Feb 2009 15:24:03 +0000 Subject: [PATCH] override TryValidator() in wxMDIParentFrame to implement forwarding of menu/toolbar events to the active child at wx level instead of forwarding the WM_COMMAND itself: this is better as it prevents the same event from being passed twice to wxApp fall back if a handler exists in the child frame but skips the event and also because the code is portable now and can be moved down to the base class; also call the base class TryValidator() from wxDocMDI classes git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@59162 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/msw/mdi.h | 4 +++- src/common/docmdi.cpp | 10 ++++++++-- src/msw/mdi.cpp | 34 ++++++++++------------------------ 3 files changed, 21 insertions(+), 27 deletions(-) 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, -- 2.45.2