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)")); }