X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0598625cb2cbb5dd7662688eaf28bc337ba1383f..43f4e852a1b2ac37c3db6a2b87315192ac549191:/src/msw/mdi.cpp diff --git a/src/msw/mdi.cpp b/src/msw/mdi.cpp index 8c860d0744..e6ea206fac 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"); @@ -138,6 +146,14 @@ END_EVENT_TABLE() // the children // =========================================================================== +void wxMDIParentFrame::Init() +{ +#if wxUSE_MENUS && wxUSE_ACCEL + // the default menu doesn't have any accelerators (even if we have it) + m_accelWindowMenu = NULL; +#endif // wxUSE_MENUS && wxUSE_ACCEL +} + bool wxMDIParentFrame::Create(wxWindow *parent, wxWindowID id, const wxString& title, @@ -162,11 +178,6 @@ bool wxMDIParentFrame::Create(wxWindow *parent, m_windowMenu->Append(wxID_MDI_WINDOW_PREV, _("&Previous")); } -#if wxUSE_MENUS && wxUSE_ACCEL - // the default menu doesn't have any accelerators (even if we have it) - m_accelWindowMenu = NULL; -#endif // wxUSE_MENUS && wxUSE_ACCEL - if (!parent) wxTopLevelWindows.Append(this); @@ -186,8 +197,8 @@ bool wxMDIParentFrame::Create(wxWindow *parent, msflags &= ~WS_VSCROLL; msflags &= ~WS_HSCROLL; - if ( !wxWindow::MSWCreate(wxApp::GetRegisteredClassName(_T("wxMDIFrame")), - title.wx_str(), + if ( !wxWindow::MSWCreate(wxApp::GetRegisteredClassName(wxT("wxMDIFrame")), + title.t_str(), pos, size, msflags, exflags) ) @@ -314,13 +325,23 @@ void wxMDIParentFrame::RemoveMDIChild(wxMDIChildFrame * WXUNUSED(child)) void wxMDIParentFrame::AddWindowMenu() { if ( m_windowMenu ) + { + // For correct handling of the events from this menu we also must + // attach it to the menu bar. + m_windowMenu->Attach(GetMenuBar()); + MDIInsertWindowMenu(GetClientWindow(), m_hMenu, GetMDIWindowMenu(this)); + } } void wxMDIParentFrame::RemoveWindowMenu() { if ( m_windowMenu ) + { MDIRemoveWindowMenu(GetClientWindow(), m_hMenu); + + m_windowMenu->Detach(); + } } void wxMDIParentFrame::UpdateWindowMenu(bool enable) @@ -366,8 +387,7 @@ void wxMDIParentFrame::SetWindowMenu(wxMenu* menu) } #if wxUSE_ACCEL - delete m_accelWindowMenu; - m_accelWindowMenu = NULL; + wxDELETE(m_accelWindowMenu); if ( menu && menu->HasAccels() ) m_accelWindowMenu = menu->CreateAccelTable(); @@ -495,7 +515,7 @@ void wxMDIParentFrame::Cascade() void wxMDIParentFrame::Tile(wxOrientation orient) { wxASSERT_MSG( orient == wxHORIZONTAL || orient == wxVERTICAL, - _T("invalid orientation value") ); + wxT("invalid orientation value") ); ::SendMessage(GetWinHwnd(GetClientWindow()), WM_MDITILE, orient == wxHORIZONTAL ? MDITILE_HORIZONTAL @@ -550,8 +570,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; @@ -571,19 +592,6 @@ WXLRESULT wxMDIParentFrame::MSWWindowProc(WXUINT message, processed = true; break; - - case WM_ERASEBKGND: - processed = true; - - // we erase background ourselves - rc = true; - 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 - break; } if ( !processed ) @@ -629,9 +637,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; } } @@ -696,7 +702,7 @@ bool wxMDIParentFrame::TryBefore(wxEvent& event) if ( event.GetEventType() == wxEVT_COMMAND_MENU_SELECTED ) { wxMDIChildFrame * const child = GetActiveChild(); - if ( child && child->ProcessEventHere(event) ) + if ( child && child->ProcessWindowEventLocally(event) ) return true; } @@ -792,12 +798,12 @@ bool wxMDIChildFrame::Create(wxMDIParentFrame *parent, MDICREATESTRUCT mcs; wxString className = - wxApp::GetRegisteredClassName(_T("wxMDIChildFrame"), COLOR_WINDOW); + wxApp::GetRegisteredClassName(wxT("wxMDIChildFrame"), COLOR_WINDOW); 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; @@ -846,7 +852,7 @@ bool wxMDIChildFrame::Create(wxMDIParentFrame *parent, if ( !m_hWnd ) { - wxLogLastError(_T("WM_MDICREATE")); + wxLogLastError(wxT("WM_MDICREATE")); return false; } @@ -1038,6 +1044,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); } @@ -1122,7 +1133,7 @@ bool wxMDIChildFrame::HandleMDIActivate(long WXUNUSED(activate), WXHMENU hMenuParent = parent->m_hMenu; - // activate the the parent menu only when there is no other child + // activate the parent menu only when there is no other child // that has been activated if ( hMenuParent && !hwndAct ) hMenuToSet = hMenuParent; @@ -1375,7 +1386,7 @@ void wxMDIClientWindow::DoSetSize(int x, int y, int width, int height, int sizeF while (node) { wxWindow *child = node->GetData(); - if (child->IsKindOf(CLASSINFO(wxMDIChildFrame))) + if (wxDynamicCast(child, wxMDIChildFrame)) { ::RedrawWindow(GetHwndOf(child), NULL, @@ -1434,7 +1445,9 @@ void MDISetMenu(wxWindow *win, HMENU hmenuFrame, HMENU hmenuWindow) { DWORD err = ::GetLastError(); if ( err ) - wxLogApiError(_T("SendMessage(WM_MDISETMENU)"), err); + { + wxLogApiError(wxT("SendMessage(WM_MDISETMENU)"), err); + } } } @@ -1472,7 +1485,7 @@ void MDIInsertWindowMenu(wxWindow *win, WXHMENU hMenu, HMENU menuWin) inserted = true; ::InsertMenu(hmenu, i, MF_BYPOSITION | MF_POPUP | MF_STRING, (UINT_PTR)menuWin, - wxGetTranslation(WINDOW_MENU_LABEL).wx_str()); + wxString(wxGetTranslation(WINDOW_MENU_LABEL)).t_str()); break; } } @@ -1481,7 +1494,7 @@ void MDIInsertWindowMenu(wxWindow *win, WXHMENU hMenu, HMENU menuWin) { ::AppendMenu(hmenu, MF_POPUP, (UINT_PTR)menuWin, - wxGetTranslation(WINDOW_MENU_LABEL).wx_str()); + wxString(wxGetTranslation(WINDOW_MENU_LABEL)).t_str()); } }