diff --git a/include/wx/msw/mdi.h b/include/wx/msw/mdi.h index 891aaff8c5..afc3847ecb 100644 --- a/include/wx/msw/mdi.h +++ b/include/wx/msw/mdi.h @@ -159,6 +159,7 @@ public: bool HandleMDIActivate(long bActivate, WXHWND, WXHWND); bool HandleWindowPosChanging(void *lpPos); bool HandleCommand(WXWORD id, WXWORD cmd, WXHWND control); + bool HandleGetMinMaxInfo(void *mmInfo); virtual long MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam); virtual long MSWDefWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam); diff --git a/samples/mdi/mdi.cpp b/samples/mdi/mdi.cpp index 6e84cdb231..f3077f4ade 100644 --- a/samples/mdi/mdi.cpp +++ b/samples/mdi/mdi.cpp @@ -163,7 +163,8 @@ MyFrame::MyFrame(wxWindow *parent, const wxPoint& pos, const wxSize& size, const long style) - : wxMDIParentFrame(parent, id, title, pos, size, style) + : wxMDIParentFrame(parent, id, title, pos, size, + style | wxNO_FULL_REPAINT_ON_RESIZE) { textWindow = new wxTextCtrl(this, -1, "A help window", wxDefaultPosition, wxDefaultSize, @@ -345,7 +346,9 @@ void MyFrame::InitToolBar(wxToolBar* toolBar) // Define a constructor for my canvas MyCanvas::MyCanvas(wxWindow *parent, const wxPoint& pos, const wxSize& size) : wxScrolledWindow(parent, -1, pos, size, - wxSUNKEN_BORDER|wxVSCROLL|wxHSCROLL) + wxSUNKEN_BORDER | + wxNO_FULL_REPAINT_ON_RESIZE | + wxVSCROLL | wxHSCROLL) { SetBackgroundColour(wxColour("WHITE")); @@ -408,10 +411,14 @@ void MyCanvas::OnEvent(wxMouseEvent& event) MyChild::MyChild(wxMDIParentFrame *parent, const wxString& title, const wxPoint& pos, const wxSize& size, const long style) - : wxMDIChildFrame(parent, -1, title, pos, size, style) + : wxMDIChildFrame(parent, -1, title, pos, size, + style | wxNO_FULL_REPAINT_ON_RESIZE) { canvas = (MyCanvas *) NULL; my_children.Append(this); + + // this should work for MDI frames as well as for normal ones + SetSizeHints(100, 100); } MyChild::~MyChild() diff --git a/src/msw/mdi.cpp b/src/msw/mdi.cpp index e2d239595a..a8c09a6952 100644 --- a/src/msw/mdi.cpp +++ b/src/msw/mdi.cpp @@ -873,10 +873,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: { @@ -1040,6 +1038,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); + + // 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 // ---------------------------------------------------------------------------