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
This commit is contained in:
@@ -94,7 +94,6 @@ public:
|
|||||||
void OnIconized(wxIconizeEvent& event);
|
void OnIconized(wxIconizeEvent& event);
|
||||||
|
|
||||||
bool HandleActivate(int state, bool minimized, WXHWND activate);
|
bool HandleActivate(int state, bool minimized, WXHWND activate);
|
||||||
bool HandleCommand(WXWORD id, WXWORD cmd, WXHWND control);
|
|
||||||
|
|
||||||
// override window proc for MDI-specific message processing
|
// override window proc for MDI-specific message processing
|
||||||
virtual WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam);
|
virtual WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam);
|
||||||
@@ -109,6 +108,9 @@ public:
|
|||||||
#endif // wxUSE_MENUS
|
#endif // wxUSE_MENUS
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
// override to pass menu/toolbar events to the active child first
|
||||||
|
virtual bool TryValidator(wxEvent& event);
|
||||||
|
|
||||||
#if wxUSE_MENUS_NATIVE
|
#if wxUSE_MENUS_NATIVE
|
||||||
virtual void InternalSetMenuBar();
|
virtual void InternalSetMenuBar();
|
||||||
#endif // wxUSE_MENUS_NATIVE
|
#endif // wxUSE_MENUS_NATIVE
|
||||||
|
@@ -70,7 +70,10 @@ void wxDocMDIParentFrame::OnMRUFile(wxCommandEvent& event)
|
|||||||
|
|
||||||
bool wxDocMDIParentFrame::TryValidator(wxEvent& 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)
|
void wxDocMDIParentFrame::OnCloseWindow(wxCloseEvent& event)
|
||||||
@@ -135,7 +138,10 @@ wxDocMDIChildFrame::~wxDocMDIChildFrame(void)
|
|||||||
|
|
||||||
bool wxDocMDIChildFrame::TryValidator(wxEvent& event)
|
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)
|
void wxDocMDIChildFrame::OnActivate(wxActivateEvent& event)
|
||||||
|
@@ -540,25 +540,6 @@ WXLRESULT wxMDIParentFrame::MSWWindowProc(WXUINT message,
|
|||||||
}
|
}
|
||||||
break;
|
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:
|
case WM_CREATE:
|
||||||
m_clientWindow = OnCreateClient();
|
m_clientWindow = OnCreateClient();
|
||||||
// Uses own style for client style
|
// Uses own style for client style
|
||||||
@@ -688,13 +669,18 @@ void wxMDIParentFrame::OnMDICommand(wxCommandEvent& event)
|
|||||||
|
|
||||||
#endif // wxUSE_MENUS
|
#endif // wxUSE_MENUS
|
||||||
|
|
||||||
bool wxMDIParentFrame::HandleCommand(WXWORD id, WXWORD cmd, WXHWND hwnd)
|
bool wxMDIParentFrame::TryValidator(wxEvent& event)
|
||||||
{
|
{
|
||||||
wxMDIChildFrame * const child = GetActiveChild();
|
// menu (and toolbar) events should be sent to the active child frame
|
||||||
if ( child && child->HandleCommand(id, cmd, hwnd) )
|
// first, if any
|
||||||
return true;
|
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,
|
WXLRESULT wxMDIParentFrame::MSWDefWindowProc(WXUINT message,
|
||||||
|
Reference in New Issue
Block a user