bool wxMDIChildFrame::HandleMDIActivate(long WXUNUSED(activate), WXHWND hwndAct, WXHWND hwndDeact) { wxMDIParentFrame * const parent = GetMDIParent(); WXHMENU hMenuToSet = 0; bool activated; if ( m_hWnd == hwndAct ) { activated = true; parent->SetActiveChild(this); WXHMENU hMenuChild = m_hMenu; if ( hMenuChild ) hMenuToSet = hMenuChild; } else if ( m_hWnd == hwndDeact ) { wxASSERT_MSG( parent->GetActiveChild() == this, wxT("can't deactivate MDI child which wasn't active!") ); activated = false; parent->SetActiveChild(NULL); WXHMENU hMenuParent = parent->m_hMenu; // activate the the parent menu only when there is no other child // that has been activated if ( hMenuParent && !hwndAct ) hMenuToSet = hMenuParent; } else { // we have nothing to do with it return false; } if ( hMenuToSet ) { MDISetMenu(parent->GetClientWindow(), (HMENU)hMenuToSet, GetMDIWindowMenu(parent)); } wxActivateEvent event(wxEVT_ACTIVATE, activated, m_windowId); event.SetEventObject( this ); ResetWindowStyle(NULL); return HandleWindowEvent(event); }
void wxMDIParentFrame::InternalSetMenuBar() { if ( GetActiveChild() ) { AddWindowMenu(); } else // we don't have any MDI children yet { // wait until we do to add the window menu but do set the main menu for // now (this is done by AddWindowMenu() as a side effect) MDISetMenu(GetClientWindow(), (HMENU)m_hMenu, NULL); } }
bool wxMDIChildFrame::Show(bool show) { if (!wxFrame::Show(show)) return false; // KH: Without this call, new MDI children do not become active. // This was added here after the same BringWindowToTop call was // removed from wxTopLevelWindow::Show (November 2005) if ( show ) ::BringWindowToTop(GetHwnd()); // we need to refresh the MDI frame window menu to include (or exclude if // we've been hidden) this frame wxMDIParentFrame * const parent = GetMDIParent(); MDISetMenu(parent->GetClientWindow(), NULL, NULL); return true; }
static void RemoveWindowMenu(wxWindow *win, WXHMENU menu) { HMENU hMenu = (HMENU)menu; if ( hMenu ) { wxChar buf[1024]; int N = ::GetMenuItemCount(hMenu); for ( int i = 0; i < N; i++ ) { if ( !::GetMenuString(hMenu, i, buf, WXSIZEOF(buf), MF_BYPOSITION) ) { // Ignore successful read of menu string with length 0 which // occurs, for example, for a maximized MDI childs system menu if ( ::GetLastError() != 0 ) { wxLogLastError(wxT("GetMenuString")); } continue; } if ( wxStrcmp(buf, _("&Window")) == 0 ) { if ( !::RemoveMenu(hMenu, i, MF_BYPOSITION) ) { wxLogLastError(wxT("RemoveMenu")); } break; } } } if ( win ) { // we don't change the windows menu, but we update the main one MDISetMenu(win, hMenu, NULL); } }
static void InsertWindowMenu(wxWindow *win, WXHMENU menu, HMENU subMenu) { // Try to insert Window menu in front of Help, otherwise append it. HMENU hmenu = (HMENU)menu; if (subMenu) { int N = GetMenuItemCount(hmenu); bool success = false; for ( int i = 0; i < N; i++ ) { wxChar buf[256]; int chars = GetMenuString(hmenu, i, buf, WXSIZEOF(buf), MF_BYPOSITION); if ( chars == 0 ) { wxLogLastError(wxT("GetMenuString")); continue; } if ( wxStripMenuCodes(wxString(buf)).IsSameAs(_("Help")) ) { success = true; ::InsertMenu(hmenu, i, MF_BYPOSITION | MF_POPUP | MF_STRING, (UINT)subMenu, _("&Window")); break; } } if ( !success ) { ::AppendMenu(hmenu, MF_POPUP, (UINT)subMenu, _("&Window")); } } MDISetMenu(win, hmenu, subMenu); }
bool wxMDIChildFrame::HandleMDIActivate(long WXUNUSED(activate), WXHWND hwndAct, WXHWND hwndDeact) { wxMDIParentFrame *parent = (wxMDIParentFrame *)GetParent(); HMENU menuToSet = 0; bool activated; if ( m_hWnd == hwndAct ) { activated = true; parent->m_currentChild = this; HMENU child_menu = (HMENU)GetWinMenu(); if ( child_menu ) { parent->m_parentFrameActive = false; menuToSet = child_menu; } } else if ( m_hWnd == hwndDeact ) { wxASSERT_MSG( parent->m_currentChild == this, wxT("can't deactivate MDI child which wasn't active!") ); activated = false; parent->m_currentChild = NULL; HMENU parent_menu = (HMENU)parent->GetWinMenu(); // activate the the parent menu only when there is no other child // that has been activated if ( parent_menu && !hwndAct ) { parent->m_parentFrameActive = true; menuToSet = parent_menu; } } else { // we have nothing to do with it return false; } if ( menuToSet ) { MDISetMenu(parent->GetClientWindow(), menuToSet, GetMDIWindowMenu(parent)); } wxActivateEvent event(wxEVT_ACTIVATE, activated, m_windowId); event.SetEventObject( this ); ResetWindowStyle((void *)NULL); return GetEventHandler()->ProcessEvent(event); }