X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/88c49a0f21dab4f2047b2dc8f77abdcce46e012b..a111f2b216a90bacb254644d3cae526eddc9f9f1:/src/msw/mdi.cpp diff --git a/src/msw/mdi.cpp b/src/msw/mdi.cpp index 1967ec43c4..c71a0a8d37 100644 --- a/src/msw/mdi.cpp +++ b/src/msw/mdi.cpp @@ -163,10 +163,6 @@ bool wxMDIParentFrame::Create(wxWindow *parent, long style, const wxString& name) { - m_defaultIcon = (WXHICON) (wxSTD_MDIPARENTFRAME_ICON - ? wxSTD_MDIPARENTFRAME_ICON - : wxDEFAULT_MDIPARENTFRAME_ICON); - m_clientWindow = NULL; m_currentChild = NULL; @@ -270,19 +266,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) @@ -348,6 +345,12 @@ void wxMDIParentFrame::OnSysColourChanged(wxSysColourChangedEvent& event) event.Skip(); } +WXHICON wxMDIParentFrame::GetDefaultIcon() const +{ + return (WXHICON)(wxSTD_MDIPARENTFRAME_ICON ? wxSTD_MDIPARENTFRAME_ICON + : wxDEFAULT_MDIPARENTFRAME_ICON); +} + // --------------------------------------------------------------------------- // MDI operations // --------------------------------------------------------------------------- @@ -646,10 +649,8 @@ bool wxMDIChildFrame::Create(wxMDIParentFrame *parent, long style, const wxString& name) { - m_defaultIcon = (WXHICON)(wxSTD_MDICHILDFRAME_ICON ? wxSTD_MDICHILDFRAME_ICON - : wxDEFAULT_MDICHILDFRAME_ICON); - SetName(name); + wxWindowBase::Show(TRUE); // MDI child frame starts off shown if ( id > -1 ) m_windowId = id; @@ -695,7 +696,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) @@ -726,14 +727,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; } @@ -820,6 +813,12 @@ void wxMDIChildFrame::InternalSetMenuBar() parent->m_parentFrameActive = FALSE; } +WXHICON wxMDIChildFrame::GetDefaultIcon() const +{ + return (WXHICON)(wxSTD_MDICHILDFRAME_ICON ? wxSTD_MDICHILDFRAME_ICON + : wxDEFAULT_MDICHILDFRAME_ICON); +} + // --------------------------------------------------------------------------- // MDI operations // --------------------------------------------------------------------------- @@ -880,10 +879,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: { @@ -986,7 +983,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; @@ -1011,6 +1011,8 @@ bool wxMDIChildFrame::HandleMDIActivate(long WXUNUSED(activate), wxActivateEvent event(wxEVT_ACTIVATE, activated, m_windowId); event.SetEventObject( this ); + ResetWindowStyle((void *)NULL); + return GetEventHandler()->ProcessEvent(event); } @@ -1042,6 +1044,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 // --------------------------------------------------------------------------- @@ -1152,7 +1181,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 ) @@ -1272,7 +1303,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)); }