From ec06b234d23120bae56c1b0871540cda4945e034 Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Fri, 25 Feb 2000 15:16:39 +0000 Subject: [PATCH] Added fix to wxMDIClientWindow to redisplay contents when window is repositioned git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6285 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/msw/mdi.h | 3 +++ src/msw/mdi.cpp | 32 ++++++++++++++++++++++++++++ utils/ogl/samples/studio/mainfrm.cpp | 7 ++++-- 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/include/wx/msw/mdi.h b/include/wx/msw/mdi.h index 62d3657dd3..319d880da3 100644 --- a/include/wx/msw/mdi.h +++ b/include/wx/msw/mdi.h @@ -197,6 +197,9 @@ public: // Explicitly call default scroll behaviour void OnScroll(wxScrollEvent& event); + virtual void DoSetSize(int x, int y, + int width, int height, + int sizeFlags = wxSIZE_AUTO); protected: void Init() { m_scrollX = m_scrollY = 0; } diff --git a/src/msw/mdi.cpp b/src/msw/mdi.cpp index 4a024cd1a8..a9c6967d63 100644 --- a/src/msw/mdi.cpp +++ b/src/msw/mdi.cpp @@ -1155,6 +1155,38 @@ void wxMDIClientWindow::OnScroll(wxScrollEvent& event) event.Skip(); } +void wxMDIClientWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags) +{ + // Try to fix a problem whereby if you show an MDI child frame, then reposition the + // client area, you can end up with a non-refreshed portion in the client window + // (see OGL studio sample). So check if the position is changed and if so, + // redraw the MDI child frames. + + wxPoint oldPos = GetPosition(); + + wxWindow::DoSetSize(x, y, width, height, sizeFlags); + + wxPoint newPos = GetPosition(); + + if ((newPos.x != oldPos.x) || (newPos.y != oldPos.y)) + { + if (GetParent()) + { + wxNode* node = GetParent()->GetChildren().First(); + while (node) + { + wxWindow* child = (wxWindow*) node->Data(); + if (child->IsKindOf(CLASSINFO(wxMDIChildFrame))) + { + HWND hWnd = (HWND) child->GetHWND(); + ::RedrawWindow(hWnd, NULL, NULL, RDW_FRAME|RDW_ALLCHILDREN|RDW_INVALIDATE ); + } + node = node->Next(); + } + } + } +} + // --------------------------------------------------------------------------- // non member functions // --------------------------------------------------------------------------- diff --git a/utils/ogl/samples/studio/mainfrm.cpp b/utils/ogl/samples/studio/mainfrm.cpp index 77c1751ac3..c1d856c301 100644 --- a/utils/ogl/samples/studio/mainfrm.cpp +++ b/utils/ogl/samples/studio/mainfrm.cpp @@ -187,8 +187,10 @@ void csFrame::OnIdle(wxIdleEvent& event) // window doesn't cause the proper refresh. Just refreshing the // client doesn't work (presumably because it's clipping the // children). - // TODO: how to put this fix in wxWindows, and not the app. - // How about at least having a wxWindow::RedrawWindow? + // FIXED in wxWindows, by intercepting wxMDIClientWindow::DoSetSize + // and checking if the position has changed, before redrawing the + // child windows. +#if 0 wxMDIChildFrame* childFrame = GetActiveChild(); if (childFrame) { @@ -196,6 +198,7 @@ void csFrame::OnIdle(wxIdleEvent& event) ::RedrawWindow(hWnd, NULL, NULL, RDW_FRAME|RDW_ALLCHILDREN|RDW_INVALIDATE ); } +#endif #endif } } -- 2.45.2