Fix wxStaticBox' clipping region in RTL mode.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@76785 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -268,11 +268,26 @@ void wxStaticBox::MSWGetRegionWithoutSelf(WXHRGN hRgn, int w, int h)
|
|||||||
SubtractRectFromRgn(hrgn, w - border, 0, w, h);
|
SubtractRectFromRgn(hrgn, w - border, 0, w, h);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
RECT AdjustRectForRtl(wxLayoutDirection dir, RECT const& childRect, RECT const& boxRect) {
|
||||||
|
RECT ret = childRect;
|
||||||
|
if( dir == wxLayout_RightToLeft ) {
|
||||||
|
// The clipping region too is mirrored in RTL layout.
|
||||||
|
// We need to mirror screen coordinates relative to static box window priot to
|
||||||
|
// intersecting with region.
|
||||||
|
ret.right = boxRect.right - childRect.left - boxRect.left;
|
||||||
|
ret.left = boxRect.right - childRect.right - boxRect.left;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
WXHRGN wxStaticBox::MSWGetRegionWithoutChildren()
|
WXHRGN wxStaticBox::MSWGetRegionWithoutChildren()
|
||||||
{
|
{
|
||||||
RECT rc;
|
RECT boxRc;
|
||||||
::GetWindowRect(GetHwnd(), &rc);
|
::GetWindowRect(GetHwnd(), &boxRc);
|
||||||
HRGN hrgn = ::CreateRectRgn(rc.left, rc.top, rc.right + 1, rc.bottom + 1);
|
HRGN hrgn = ::CreateRectRgn(boxRc.left, boxRc.top, boxRc.right + 1, boxRc.bottom + 1);
|
||||||
bool foundThis = false;
|
bool foundThis = false;
|
||||||
|
|
||||||
// Iterate over all sibling windows as in the old wxWidgets API the
|
// Iterate over all sibling windows as in the old wxWidgets API the
|
||||||
@@ -311,7 +326,9 @@ WXHRGN wxStaticBox::MSWGetRegionWithoutChildren()
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RECT rc;
|
||||||
::GetWindowRect(child, &rc);
|
::GetWindowRect(child, &rc);
|
||||||
|
rc = AdjustRectForRtl(GetLayoutDirection(), rc, boxRc );
|
||||||
if ( ::RectInRegion(hrgn, &rc) )
|
if ( ::RectInRegion(hrgn, &rc) )
|
||||||
{
|
{
|
||||||
// need to remove WS_CLIPSIBLINGS from all sibling windows
|
// need to remove WS_CLIPSIBLINGS from all sibling windows
|
||||||
@@ -346,7 +363,9 @@ WXHRGN wxStaticBox::MSWGetRegionWithoutChildren()
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RECT rc;
|
||||||
::GetWindowRect(child, &rc);
|
::GetWindowRect(child, &rc);
|
||||||
|
rc = AdjustRectForRtl(GetLayoutDirection(), rc, boxRc );
|
||||||
AutoHRGN hrgnChild(::CreateRectRgnIndirect(&rc));
|
AutoHRGN hrgnChild(::CreateRectRgnIndirect(&rc));
|
||||||
::CombineRgn(hrgn, hrgn, hrgnChild, RGN_DIFF);
|
::CombineRgn(hrgn, hrgn, hrgnChild, RGN_DIFF);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user