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
This commit is contained in:
Vadim Zeitlin 2013-02-10 16:14:03 +00:00
parent 2aee45f63a
commit 208717f64e
3 changed files with 23 additions and 2 deletions

View File

@ -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.

View File

@ -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()

View File

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