From 208717f64ea751a62f064f86cdb7cf43315bca38 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 10 Feb 2013 16:14:03 +0000 Subject: [PATCH] Account for scrolling when setting the background brush origin in wxMSW. We must use physical coordinates for the brush origin to account for the coordinates offset in scrolled windows, so add MSWAdjustBrushOrg() and call it from MSWGetBgBrushForChild(). Closes #14917. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@73495 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/msw/window.h | 11 +++++++++++ include/wx/scrolwin.h | 8 +++++++- src/msw/window.cpp | 6 +++++- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/include/wx/msw/window.h b/include/wx/msw/window.h index b465d05814..564f78f2d7 100644 --- a/include/wx/msw/window.h +++ b/include/wx/msw/window.h @@ -410,6 +410,17 @@ public: // weird wxToolBar case and MSWGetBgBrushForChild() itself is used by // MSWGetBgBrush() to actually find the right brush to use. + // Adjust the origin for the brush returned by MSWGetBgBrushForChild(). + // + // This needs to be overridden for scrolled windows to ensure that the + // scrolling of their associated DC is taken into account. + // + // Both parameters must be non-NULL. + virtual void MSWAdjustBrushOrg(int* WXUNUSED(xOrg), + int* WXUNUSED(yOrg)) const + { + } + // The brush returned from here must remain valid at least until the next // event loop iteration. Returning 0, as is done by default, indicates // there is no custom background brush. diff --git a/include/wx/scrolwin.h b/include/wx/scrolwin.h index adc7e5a1fc..73d93aaf61 100644 --- a/include/wx/scrolwin.h +++ b/include/wx/scrolwin.h @@ -399,13 +399,19 @@ public: #endif } +#ifdef __WXMSW__ // we need to return a special WM_GETDLGCODE value to process just the // arrows but let the other navigation characters through -#ifdef __WXMSW__ virtual WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) { return FilterMSWWindowProc(nMsg, T::MSWWindowProc(nMsg, wParam, lParam)); } + + // Take into account the scroll origin. + virtual void MSWAdjustBrushOrg(int* xOrg, int* yOrg) const + { + CalcUnscrolledPosition(*xOrg, *yOrg, xOrg, yOrg); + } #endif // __WXMSW__ WX_FORWARD_TO_SCROLL_HELPER() diff --git a/src/msw/window.cpp b/src/msw/window.cpp index 4b07cbdf1d..041edce030 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -4959,7 +4959,11 @@ wxWindowMSW::MSWGetBgBrushForChild(WXHDC hDC, wxWindowMSW *child) ::MapWindowPoints(NULL, GetHwnd(), (POINT *)&rc, 1); - if ( !::SetBrushOrgEx((HDC)hDC, -rc.left, -rc.top, NULL) ) + int x = rc.left, + y = rc.top; + MSWAdjustBrushOrg(&x, &y); + + if ( !::SetBrushOrgEx((HDC)hDC, -x, -y, NULL) ) { wxLogLastError(wxT("SetBrushOrgEx(bg brush)")); }