X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8cc208e39f61bca01cc23c339843891f099d47c5..b85b06e13d22e7fc1604ec1a49caa1227a1b3d36:/src/msw/mdi.cpp diff --git a/src/msw/mdi.cpp b/src/msw/mdi.cpp index 1386635c51..8c860d0744 100644 --- a/src/msw/mdi.cpp +++ b/src/msw/mdi.cpp @@ -522,8 +522,8 @@ void wxMDIParentFrame::ActivatePrevious() // --------------------------------------------------------------------------- WXLRESULT wxMDIParentFrame::MSWWindowProc(WXUINT message, - WXWPARAM wParam, - WXLPARAM lParam) + WXWPARAM wParam, + WXLPARAM lParam) { WXLRESULT rc = 0; bool processed = false; @@ -540,6 +540,25 @@ WXLRESULT wxMDIParentFrame::MSWWindowProc(WXUINT message, } break; + case WM_COMMAND: + // system messages such as SC_CLOSE are sent as WM_COMMANDs to the + // parent MDI frame and we must let the DefFrameProc() have them + // for these commands to work (without it, closing the maximized + // MDI children doesn't work, for example) + { + WXWORD id, cmd; + WXHWND hwnd; + UnpackCommand(wParam, lParam, &id, &hwnd, &cmd); + + if ( cmd == 0 /* menu */ && + id >= SC_SIZE /* first system menu command */ ) + { + MSWDefWindowProc(message, wParam, lParam); + processed = true; + } + } + break; + case WM_CREATE: m_clientWindow = OnCreateClient(); // Uses own style for client style @@ -561,8 +580,9 @@ WXLRESULT wxMDIParentFrame::MSWWindowProc(WXUINT message, 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 + // 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; } @@ -882,6 +902,14 @@ bool wxMDIChildFrame::Show(bool show) return true; } +void +wxMDIChildFrame::DoSetSize(int x, int y, int width, int height, int sizeFlags) +{ + // we need to disable client area origin adjustments used for the child + // windows for the frame itself + wxMDIChildFrameBase::DoSetSize(x, y, width, height, sizeFlags); +} + // Set the client size (i.e. leave the calculation of borders etc. // to wxWidgets) void wxMDIChildFrame::DoSetClientSize(int width, int height) @@ -1020,8 +1048,8 @@ void wxMDIChildFrame::Activate() // --------------------------------------------------------------------------- WXLRESULT wxMDIChildFrame::MSWWindowProc(WXUINT message, - WXWPARAM wParam, - WXLPARAM lParam) + WXWPARAM wParam, + WXLPARAM lParam) { WXLRESULT rc = 0; bool processed = false; @@ -1054,11 +1082,6 @@ WXLRESULT wxMDIChildFrame::MSWWindowProc(WXUINT message, MSWDefWindowProc(message, wParam, lParam); break; - case WM_SYSCOMMAND: - // DefMDIChildProc handles SC_{NEXT/PREV}WINDOW here, so pass it - // the message (the base class version does not) - return MSWDefWindowProc(message, wParam, lParam); - case WM_WINDOWPOSCHANGING: processed = HandleWindowPosChanging((LPWINDOWPOS)lParam); break; @@ -1409,11 +1432,9 @@ void MDISetMenu(wxWindow *win, HMENU hmenuFrame, HMENU hmenuWindow) (WPARAM)hmenuFrame, (LPARAM)hmenuWindow) ) { -#ifdef __WXDEBUG__ DWORD err = ::GetLastError(); if ( err ) wxLogApiError(_T("SendMessage(WM_MDISETMENU)"), err); -#endif // __WXDEBUG__ } }