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
// 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.
#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()
::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)"));
}