Merge branch 'rtl-fixes'

Fix appearance of wxNotebook children background when using RTL locales.
This commit is contained in:
Vadim Zeitlin
2016-04-10 20:51:33 +02:00
3 changed files with 65 additions and 58 deletions

View File

@@ -178,11 +178,6 @@ protected:
// creates the brush to be used for drawing the tab control background // creates the brush to be used for drawing the tab control background
void UpdateBgBrush(); void UpdateBgBrush();
// common part of QueryBgBitmap() and MSWPrintChild()
//
// if child == NULL, draw background for the entire notebook itself
bool DoDrawBackground(WXHDC hDC, wxWindow *child = NULL);
#endif // wxUSE_UXTHEME #endif // wxUSE_UXTHEME
// these function are used for reducing flicker on notebook resize // these function are used for reducing flicker on notebook resize

View File

@@ -1102,27 +1102,20 @@ void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event)
#if wxUSE_UXTHEME #if wxUSE_UXTHEME
bool wxNotebook::DoDrawBackground(WXHDC hDC, wxWindow *child) WXHBRUSH wxNotebook::QueryBgBitmap()
{ {
wxUxThemeHandle theme(child ? child : this, L"TAB");
if ( !theme )
return false;
// get the notebook client rect (we're not interested in drawing tabs
// themselves)
wxRect r = GetPageSize(); wxRect r = GetPageSize();
if ( r.IsEmpty() ) if ( r.IsEmpty() )
return false; return 0;
wxUxThemeHandle theme(this, L"TAB");
if ( !theme )
return 0;
RECT rc; RECT rc;
wxCopyRectToRECT(r, rc); wxCopyRectToRECT(r, rc);
// map rect to the coords of the window we're drawing in WindowHDC hDC(GetHwnd());
if ( child )
::MapWindowPoints(GetHwnd(), GetHwndOf(child), (POINT *)&rc, 2);
// we have the content area (page size), but we need to draw all of the
// background for it to be aligned correctly
wxUxThemeEngine::Get()->GetThemeBackgroundExtent wxUxThemeEngine::Get()->GetThemeBackgroundExtent
( (
theme, theme,
@@ -1132,33 +1125,22 @@ bool wxNotebook::DoDrawBackground(WXHDC hDC, wxWindow *child)
&rc, &rc,
&rc &rc
); );
wxUxThemeEngine::Get()->DrawThemeBackground
(
theme,
(HDC) hDC,
9 /* TABP_PANE */,
0,
&rc,
NULL
);
return true;
}
WXHBRUSH wxNotebook::QueryBgBitmap()
{
wxRect r = GetPageSize();
if ( r.IsEmpty() )
return 0;
WindowHDC hDC(GetHwnd());
MemoryHDC hDCMem(hDC); MemoryHDC hDCMem(hDC);
CompatibleBitmap hBmp(hDC, r.x + r.width, r.y + r.height); CompatibleBitmap hBmp(hDC, rc.right, rc.bottom);
SelectInHDC selectBmp(hDCMem, hBmp); {
SelectInHDC selectBmp(hDCMem, hBmp);
if ( !DoDrawBackground((WXHDC)(HDC)hDCMem) ) wxUxThemeEngine::Get()->DrawThemeBackground
return 0; (
theme,
hDCMem,
9 /* TABP_PANE */,
0,
&rc,
NULL
);
} // deselect bitmap from the memory HDC before using it
return (WXHBRUSH)::CreatePatternBrush(hBmp); return (WXHBRUSH)::CreatePatternBrush(hBmp);
} }
@@ -1180,25 +1162,21 @@ void wxNotebook::UpdateBgBrush()
bool wxNotebook::MSWPrintChild(WXHDC hDC, wxWindow *child) bool wxNotebook::MSWPrintChild(WXHDC hDC, wxWindow *child)
{ {
// solid background colour overrides themed background drawing const wxRect r = GetPageSize();
if ( !UseBgCol() && DoDrawBackground(hDC, child) ) if ( r.IsEmpty() )
return true; return false;
RECT rc;
wxCopyRectToRECT(r, rc);
// map rect to the coords of the window we're drawing in
if ( child )
::MapWindowPoints(GetHwnd(), GetHwndOf(child), (POINT *)&rc, 2);
// If we're using a solid colour (for example if we've switched off // If we're using a solid colour (for example if we've switched off
// theming for this notebook), paint it // theming for this notebook), paint it
if (UseBgCol()) if (UseBgCol())
{ {
wxRect r = GetPageSize();
if ( r.IsEmpty() )
return false;
RECT rc;
wxCopyRectToRECT(r, rc);
// map rect to the coords of the window we're drawing in
if ( child )
::MapWindowPoints(GetHwnd(), GetHwndOf(child), (POINT *)&rc, 2);
wxBrush brush(GetBackgroundColour()); wxBrush brush(GetBackgroundColour());
HBRUSH hbr = GetHbrushOf(brush); HBRUSH hbr = GetHbrushOf(brush);
@@ -1206,6 +1184,34 @@ bool wxNotebook::MSWPrintChild(WXHDC hDC, wxWindow *child)
return true; return true;
} }
else // No solid background colour, try to use themed background.
{
wxUxThemeHandle theme(child, L"TAB");
if ( theme )
{
// we have the content area (page size), but we need to draw all of the
// background for it to be aligned correctly
wxUxThemeEngine::Get()->GetThemeBackgroundExtent
(
theme,
(HDC) hDC,
9 /* TABP_PANE */,
0,
&rc,
&rc
);
wxUxThemeEngine::Get()->DrawThemeBackground
(
theme,
(HDC) hDC,
9 /* TABP_PANE */,
0,
&rc,
NULL
);
return true;
}
}
return wxNotebookBase::MSWPrintChild(hDC, child); return wxNotebookBase::MSWPrintChild(hDC, child);
} }

View File

@@ -4888,7 +4888,13 @@ wxWindowMSW::MSWGetBgBrushForChild(WXHDC hDC, wxWindowMSW *child)
RECT rc; RECT rc;
::GetWindowRect(GetHwndOf(child), &rc); ::GetWindowRect(GetHwndOf(child), &rc);
::MapWindowPoints(NULL, GetHwnd(), (POINT *)&rc, 1); // It is important to pass both points to MapWindowPoints() as in
// addition to converting them to our coordinate system, this function
// will also exchange the left and right coordinates if this window
// uses RTL layout, which is exactly what we need here as the child
// window origin is its _right_ top corner in this case and not the
// left one.
::MapWindowPoints(NULL, GetHwnd(), (POINT *)&rc, 2);
int x = rc.left, int x = rc.left,
y = rc.top; y = rc.top;