X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3d8dea7e2e10502846e18189a8d894e27effdb23..2b813b73cd79cfb4d275e9628811f379e8c5ee39:/src/msw/mdi.cpp diff --git a/src/msw/mdi.cpp b/src/msw/mdi.cpp index 2aa8a208f7..3c235e7f3d 100644 --- a/src/msw/mdi.cpp +++ b/src/msw/mdi.cpp @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: mdi.cpp -// Purpose: MDI classes +// Name: src/msw/mdi.cpp +// Purpose: MDI classes for wxMSW // Author: Julian Smart // Modified by: // Created: 04/01/98 @@ -304,7 +304,7 @@ void wxMDIParentFrame::SetWindowMenu(wxMenu* menu) } } -void wxMDIParentFrame::OnSize(wxSizeEvent& event) +void wxMDIParentFrame::OnSize(wxSizeEvent&) { if ( GetClientWindow() ) { @@ -722,6 +722,15 @@ bool wxMDIChildFrame::Create(wxMDIParentFrame *parent, //SetWindowLong(GetHwnd(), 0, (long)this); 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; } @@ -1088,25 +1097,31 @@ bool wxMDIChildFrame::ResetWindowStyle(void *vrect) wxMDIChildFrame* pChild = pFrameWnd->GetActiveChild(); if (!pChild || (pChild == this)) { - DWORD dwStyle = ::GetWindowLong(GetWinHwnd(pFrameWnd->GetClientWindow()), GWL_EXSTYLE); - DWORD dwThisStyle = ::GetWindowLong(GetHwnd(), GWL_STYLE); + HWND hwndClient = GetWinHwnd(pFrameWnd->GetClientWindow()); + DWORD dwStyle = ::GetWindowLong(hwndClient, GWL_EXSTYLE); + + // 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) : 0; DWORD dwNewStyle = dwStyle; - if (pChild != NULL && (dwThisStyle & WS_MAXIMIZE)) + if ( dwThisStyle & WS_MAXIMIZE ) dwNewStyle &= ~(WS_EX_CLIENTEDGE); else dwNewStyle |= WS_EX_CLIENTEDGE; if (dwStyle != dwNewStyle) { - HWND hwnd = GetWinHwnd(pFrameWnd->GetClientWindow()); - ::RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); - ::SetWindowLong(hwnd, GWL_EXSTYLE, dwNewStyle); - ::SetWindowPos(hwnd, NULL, 0, 0, 0, 0, + // force update of everything + ::RedrawWindow(hwndClient, NULL, NULL, + RDW_INVALIDATE | RDW_ALLCHILDREN); + ::SetWindowLong(hwndClient, GWL_EXSTYLE, dwNewStyle); + ::SetWindowPos(hwndClient, NULL, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOCOPYBITS); if (rect) - ::GetClientRect(hwnd, rect); + ::GetClientRect(hwndClient, rect); return TRUE; } @@ -1134,7 +1149,7 @@ bool wxMDIClientWindow::CreateClient(wxMDIParentFrame *parent, long style) ccs.hWindowMenu = (HMENU) parent->GetWindowMenu()->GetHMenu(); ccs.idFirstChild = wxFIRST_MDI_CHILD; - DWORD msStyle = WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN; + DWORD msStyle = MDIS_ALLCHILDSTYLES | WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN; if ( style & wxHSCROLL ) msStyle |= WS_HSCROLL; if ( style & wxVSCROLL ) @@ -1254,6 +1269,7 @@ static void MDISetMenu(wxWindow *win, HMENU hmenuFrame, HMENU hmenuWindow) wxWindow *parent = win->GetParent(); wxCHECK_RET( parent, wxT("MDI client without parent frame? weird...") ); + ::SendMessage(GetWinHwnd(win), WM_MDIREFRESHMENU, 0, 0L); ::DrawMenuBar(GetWinHwnd(parent)); } @@ -1300,7 +1316,6 @@ static void RemoveWindowMenu(wxWindow *win, WXHMENU menu) // Try to insert Window menu in front of Help, otherwise append it. HMENU hmenu = (HMENU)menu; int N = GetMenuItemCount(hmenu); - bool success = FALSE; for ( int i = 0; i < N; i++ ) { wxChar buf[256]; @@ -1314,7 +1329,6 @@ static void RemoveWindowMenu(wxWindow *win, WXHMENU menu) if ( wxStripMenuCodes(wxString(buf)).IsSameAs(_("Window")) ) { - success = TRUE; ::RemoveMenu(hmenu, i, MF_BYPOSITION); break; }