// constants
// ---------------------------------------------------------------------------
-// This range gives a maximum of 500 MDI children. Should be enough :-)
+// First ID for the MDI child menu item in the "Window" menu.
const int wxFIRST_MDI_CHILD = 4100;
-const int wxLAST_MDI_CHILD = 4600;
+
+// There can be no more than 9 children in the "Window" menu as beginning with
+// the tenth one they're not shown and "More windows..." menu item is used
+// instead.
+const int wxLAST_MDI_CHILD = wxFIRST_MDI_CHILD + 8;
+
+// The ID of the "More windows..." menu item is the next one after the last
+// child.
+const int wxID_MDI_MORE_WINDOWS = wxLAST_MDI_CHILD + 1;
// The MDI "Window" menu label
const char *WINDOW_MENU_LABEL = gettext_noop("&Window");
WXHWND hwnd;
UnpackCommand(wParam, lParam, &id, &hwnd, &cmd);
- if ( cmd == 0 /* menu */ &&
- id >= SC_SIZE /* first system menu command */ )
+ if ( id == wxID_MDI_MORE_WINDOWS ||
+ (cmd == 0 /* menu */ &&
+ id >= SC_SIZE /* first system menu command */) )
{
MSWDefWindowProc(message, wParam, lParam);
processed = true;
}
+ else // Not a system command.
+ {
+ // Menu (and toolbar) events should be sent to the active
+ // child first and only be processed by the parent frame if
+ // they're not handled there.
+ if ( wxMDIChildFrame* child = GetActiveChild() )
+ {
+ processed = child->MSWHandleMessage(&rc,
+ message,
+ wParam,
+ lParam);
+ }
+ }
}
break;
int childId = wxGetWindowId(child->GetHWND());
if ( childId == event.GetId() )
{
- ::SendMessage( GetWinHwnd(GetClientWindow()),
- WM_MDIACTIVATE,
- (WPARAM)child->GetHWND(), 0);
+ wxStaticCast(child, wxMDIChildFrame)->Activate();
return;
}
}
#endif // wxUSE_MENUS
-bool wxMDIParentFrame::TryBefore(wxEvent& event)
-{
- // 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->ProcessWindowEventLocally(event) )
- return true;
- }
-
- return wxMDIParentFrameBase::TryBefore(event);
-}
-
WXLRESULT wxMDIParentFrame::MSWDefWindowProc(WXUINT message,
WXWPARAM wParam,
WXLPARAM lParam)
wxMDIParentFrame * const parent = GetMDIParent();
if ( parent && parent->GetClientWindow() )
{
+ // Activating an iconized MDI frame doesn't do anything, so restore it
+ // first to really present it to the user.
+ if ( IsIconized() )
+ Restore();
+
::SendMessage(GetWinHwnd(parent->GetClientWindow()), WM_MDIACTIVATE,
(WPARAM) GetHwnd(), 0);
}