X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/345c78ca5fa57ea6c7dc7e6a05496a8e82aa2b50..1e5b533ec0a5b459fe2ac58abd6f21e5b1e51a92:/src/msw/mdi.cpp diff --git a/src/msw/mdi.cpp b/src/msw/mdi.cpp index 101e33ea65..309002bb01 100644 --- a/src/msw/mdi.cpp +++ b/src/msw/mdi.cpp @@ -62,9 +62,17 @@ namespace // 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"); @@ -190,7 +198,7 @@ bool wxMDIParentFrame::Create(wxWindow *parent, msflags &= ~WS_HSCROLL; if ( !wxWindow::MSWCreate(wxApp::GetRegisteredClassName(wxT("wxMDIFrame")), - title.wx_str(), + title.t_str(), pos, size, msflags, exflags) ) @@ -420,11 +428,14 @@ void wxMDIParentFrame::DoMenuUpdates(wxMenu* menu) wxMenuItem *wxMDIParentFrame::FindItemInMenuBar(int menuId) const { - wxMenuItem *item = wxFrame::FindItemInMenuBar(menuId); - if ( !item && GetActiveChild() ) - { - item = GetActiveChild()->FindItemInMenuBar(menuId); - } + // We must look in the child menu first: if it has an item with the same ID + // as in our own menu bar, the child item should be used to determine + // whether it's currently enabled. + wxMenuItem *item = GetActiveChild() + ? GetActiveChild()->FindItemInMenuBar(menuId) + : NULL; + if ( !item ) + item = wxFrame::FindItemInMenuBar(menuId); if ( !item && m_windowMenu ) item = m_windowMenu->FindItem(menuId); @@ -562,8 +573,9 @@ WXLRESULT wxMDIParentFrame::MSWWindowProc(WXUINT message, 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; @@ -628,9 +640,7 @@ void wxMDIParentFrame::OnMDIChild(wxCommandEvent& event) int childId = wxGetWindowId(child->GetHWND()); if ( childId == event.GetId() ) { - ::SendMessage( GetWinHwnd(GetClientWindow()), - WM_MDIACTIVATE, - (WPARAM)child->GetHWND(), 0); + wxStaticCast(child, wxMDIChildFrame)->Activate(); return; } } @@ -688,20 +698,6 @@ void wxMDIParentFrame::OnMDICommand(wxCommandEvent& event) #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) @@ -795,8 +791,8 @@ bool wxMDIChildFrame::Create(wxMDIParentFrame *parent, if ( !(style & wxFULL_REPAINT_ON_RESIZE) ) className += wxApp::GetNoRedrawClassSuffix(); - mcs.szClass = className.wx_str(); - mcs.szTitle = title.wx_str(); + mcs.szClass = className.t_str(); + mcs.szTitle = title.t_str(); mcs.hOwner = wxGetInstance(); if (x != wxDefaultCoord) mcs.x = x; @@ -1037,6 +1033,11 @@ void wxMDIChildFrame::Activate() 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); } @@ -1473,7 +1474,7 @@ void MDIInsertWindowMenu(wxWindow *win, WXHMENU hMenu, HMENU menuWin) inserted = true; ::InsertMenu(hmenu, i, MF_BYPOSITION | MF_POPUP | MF_STRING, (UINT_PTR)menuWin, - wxString(wxGetTranslation(WINDOW_MENU_LABEL)).wx_str()); + wxString(wxGetTranslation(WINDOW_MENU_LABEL)).t_str()); break; } } @@ -1482,7 +1483,7 @@ void MDIInsertWindowMenu(wxWindow *win, WXHMENU hMenu, HMENU menuWin) { ::AppendMenu(hmenu, MF_POPUP, (UINT_PTR)menuWin, - wxString(wxGetTranslation(WINDOW_MENU_LABEL)).wx_str()); + wxString(wxGetTranslation(WINDOW_MENU_LABEL)).t_str()); } }