}
}
-const wxMenuItem *wxMDIParentFrame::FindItemInMenuBar(int menuId) const
+wxMenuItem *wxMDIParentFrame::FindItemInMenuBar(int menuId) const
{
- const wxMenuItem *item = wxFrame::FindItemInMenuBar(menuId);
+ wxMenuItem *item = wxFrame::FindItemInMenuBar(menuId);
if ( !item && GetActiveChild() )
{
item = GetActiveChild()->FindItemInMenuBar(menuId);
}
+ if ( !item && m_windowMenu )
+ item = m_windowMenu->FindItem(menuId);
+
return item;
}
// ---------------------------------------------------------------------------
WXLRESULT wxMDIParentFrame::MSWWindowProc(WXUINT message,
- WXWPARAM wParam,
- WXLPARAM lParam)
+ WXWPARAM wParam,
+ WXLPARAM lParam)
{
WXLRESULT rc = 0;
bool processed = false;
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:
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;
}
::SendMessage(GetWinHwnd(GetClientWindow()), msg, wParam, lParam);
}
-wxMenuItem *wxMDIParentFrame::MSWFindMenuBarItem(WXWORD id)
-{
- wxMenuItem *mitem = wxFrame::MSWFindMenuBarItem(id);
- if ( !mitem && m_windowMenu )
- mitem = m_windowMenu->FindItem((signed short)id);
-
- return mitem;
-}
-
#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,
// 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
// ---------------------------------------------------------------------------
WXLRESULT wxMDIChildFrame::MSWWindowProc(WXUINT message,
- WXWPARAM wParam,
- WXLPARAM lParam)
+ WXWPARAM wParam,
+ WXLPARAM lParam)
{
WXLRESULT rc = 0;
bool processed = false;
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;
(WPARAM)hmenuFrame,
(LPARAM)hmenuWindow) )
{
-#ifdef __WXDEBUG__
DWORD err = ::GetLastError();
if ( err )
wxLogApiError(_T("SendMessage(WM_MDISETMENU)"), err);
-#endif // __WXDEBUG__
}
}