X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/921a43c1f69f8763a4b2516586392d4c03f0feaf..53997bc265b691aaf12fafd259a5a2d2a27b0565:/src/msw/mdi.cpp diff --git a/src/msw/mdi.cpp b/src/msw/mdi.cpp index e3db308a0f..5869306dda 100644 --- a/src/msw/mdi.cpp +++ b/src/msw/mdi.cpp @@ -180,12 +180,12 @@ bool wxMDIParentFrame::Create(wxWindow *parent, { m_windowMenu = new wxMenu; - m_windowMenu->Append(IDM_WINDOWCASCADE, wxT("&Cascade")); - m_windowMenu->Append(IDM_WINDOWTILEHOR, wxT("Tile &Horizontally")); - m_windowMenu->Append(IDM_WINDOWTILEVERT, wxT("Tile &Vertically")); + m_windowMenu->Append(IDM_WINDOWCASCADE, _("&Cascade")); + m_windowMenu->Append(IDM_WINDOWTILEHOR, _("Tile &Horizontally")); + m_windowMenu->Append(IDM_WINDOWTILEVERT, _("Tile &Vertically")); m_windowMenu->AppendSeparator(); - m_windowMenu->Append(IDM_WINDOWICONS, wxT("&Arrange Icons")); - m_windowMenu->Append(IDM_WINDOWNEXT, wxT("&Next")); + m_windowMenu->Append(IDM_WINDOWICONS, _("&Arrange Icons")); + m_windowMenu->Append(IDM_WINDOWNEXT, _("&Next")); } m_parentFrameActive = TRUE; @@ -270,19 +270,20 @@ wxMDIParentFrame::~wxMDIParentFrame() } } +#if wxUSE_MENUS_NATIVE + void wxMDIParentFrame::InternalSetMenuBar() { -// HMENU subMenu = GetSubMenu((HMENU) m_windowMenu, 0); - m_parentFrameActive = TRUE; - HMENU subMenu = (HMENU) 0; - if (GetWindowMenu()) - subMenu = (HMENU) GetWindowMenu()->GetHMenu(); + wxMenu *menu = GetWindowMenu(); + HMENU subMenu = menu ? GetHmenuOf(menu) : 0; InsertWindowMenu(GetClientWindow(), m_hMenu, subMenu); } +#endif // wxUSE_MENUS_NATIVE + void wxMDIParentFrame::SetWindowMenu(wxMenu* menu) { if (m_windowMenu) @@ -300,7 +301,10 @@ void wxMDIParentFrame::SetWindowMenu(wxMenu* menu) { m_windowMenu = menu; if (GetMenuBar()) - InsertWindowMenu(GetClientWindow(), m_hMenu, (HMENU) m_windowMenu->GetHMenu()); + { + InsertWindowMenu(GetClientWindow(), m_hMenu, + GetHmenuOf(m_windowMenu)); + } } } @@ -647,6 +651,7 @@ bool wxMDIChildFrame::Create(wxMDIParentFrame *parent, : wxDEFAULT_MDICHILDFRAME_ICON); SetName(name); + wxWindowBase::Show(TRUE); // MDI child frame starts off shown if ( id > -1 ) m_windowId = id; @@ -692,7 +697,7 @@ bool wxMDIChildFrame::Create(wxMDIParentFrame *parent, else mcs.cy = CW_USEDEFAULT; - DWORD msflags = WS_OVERLAPPED | WS_CLIPCHILDREN; + DWORD msflags = WS_OVERLAPPED | WS_CLIPCHILDREN | WS_THICKFRAME | WS_VISIBLE ; if (style & wxMINIMIZE_BOX) msflags |= WS_MINIMIZEBOX; if (style & wxMAXIMIZE_BOX) @@ -723,14 +728,6 @@ bool wxMDIChildFrame::Create(wxMDIParentFrame *parent, wxModelessWindows.Append(this); - // Necessary to make ResetWindowStyle() work - // and will be called eventually anyway - Activate(); - - // Without this, a maximized child will still - // a double border around the child - ResetWindowStyle((void *)NULL); // Set the Client ExStyle right - return TRUE; } @@ -877,10 +874,8 @@ long wxMDIChildFrame::MSWWindowProc(WXUINT message, break; case WM_GETMINMAXINFO: - // let the default window proc calculate the size of MDI children - // frames because it is based on the size of the MDI client window, - // not on the values specified in wxWindow m_min/max variables - return MSWDefWindowProc(message, wParam, lParam); + processed = HandleGetMinMaxInfo((MINMAXINFO *)lParam); + break; case WM_MDIACTIVATE: { @@ -983,7 +978,10 @@ bool wxMDIChildFrame::HandleMDIActivate(long WXUNUSED(activate), parent->m_currentChild = NULL; HMENU parent_menu = (HMENU)parent->GetWinMenu(); - if ( parent_menu ) + + // activate the the parent menu only when there is no other child + // that has been activated + if ( parent_menu && !hwndAct ) { parent->m_parentFrameActive = TRUE; @@ -1008,6 +1006,8 @@ bool wxMDIChildFrame::HandleMDIActivate(long WXUNUSED(activate), wxActivateEvent event(wxEVT_ACTIVATE, activated, m_windowId); event.SetEventObject( this ); + ResetWindowStyle((void *)NULL); + return GetEventHandler()->ProcessEvent(event); } @@ -1039,6 +1039,33 @@ bool wxMDIChildFrame::HandleWindowPosChanging(void *pos) return FALSE; } +bool wxMDIChildFrame::HandleGetMinMaxInfo(void *mmInfo) +{ + MINMAXINFO *info = (MINMAXINFO *)mmInfo; + + // let the default window proc calculate the size of MDI children + // frames because it is based on the size of the MDI client window, + // not on the values specified in wxWindow m_max variables + bool processed = MSWDefWindowProc(WM_GETMINMAXINFO, 0, (LPARAM)mmInfo) != 0; + + // but allow GetSizeHints() to set the min size + if ( m_minWidth != -1 ) + { + info->ptMinTrackSize.x = m_minWidth; + + processed = TRUE; + } + + if ( m_minHeight != -1 ) + { + info->ptMinTrackSize.y = m_minHeight; + + processed = TRUE; + } + + return TRUE; +} + // --------------------------------------------------------------------------- // MDI specific message translation/preprocessing // --------------------------------------------------------------------------- @@ -1103,7 +1130,7 @@ bool wxMDIChildFrame::ResetWindowStyle(void *vrect) // we want to test whether there is a maximized child, so just set // dwThisStyle to 0 if there is no child at all DWORD dwThisStyle = pChild - ? ::GetWindowLong(GetWinHwnd(pChild), GWL_STYLE) : NULL; + ? ::GetWindowLong(GetWinHwnd(pChild), GWL_STYLE) : 0; DWORD dwNewStyle = dwStyle; if ( dwThisStyle & WS_MAXIMIZE ) dwNewStyle &= ~(WS_EX_CLIENTEDGE); @@ -1149,7 +1176,9 @@ bool wxMDIClientWindow::CreateClient(wxMDIParentFrame *parent, long style) ccs.hWindowMenu = (HMENU) parent->GetWindowMenu()->GetHMenu(); ccs.idFirstChild = wxFIRST_MDI_CHILD; - DWORD msStyle = MDIS_ALLCHILDSTYLES | WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN; + DWORD msStyle = MDIS_ALLCHILDSTYLES | WS_VISIBLE | WS_CHILD | + WS_CLIPCHILDREN | WS_CLIPSIBLINGS; + if ( style & wxHSCROLL ) msStyle |= WS_HSCROLL; if ( style & wxVSCROLL ) @@ -1269,7 +1298,10 @@ static void MDISetMenu(wxWindow *win, HMENU hmenuFrame, HMENU hmenuWindow) wxWindow *parent = win->GetParent(); wxCHECK_RET( parent, wxT("MDI client without parent frame? weird...") ); +#ifndef __WIN16__ ::SendMessage(GetWinHwnd(win), WM_MDIREFRESHMENU, 0, 0L); +#endif + ::DrawMenuBar(GetWinHwnd(parent)); }