Merge branch 'rtl-fixes'
Fix appearance of wxNotebook children background when using RTL locales.
This commit is contained in:
@@ -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
|
||||||
|
@@ -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
|
||||||
);
|
);
|
||||||
|
|
||||||
|
MemoryHDC hDCMem(hDC);
|
||||||
|
CompatibleBitmap hBmp(hDC, rc.right, rc.bottom);
|
||||||
|
|
||||||
|
{
|
||||||
|
SelectInHDC selectBmp(hDCMem, hBmp);
|
||||||
wxUxThemeEngine::Get()->DrawThemeBackground
|
wxUxThemeEngine::Get()->DrawThemeBackground
|
||||||
(
|
(
|
||||||
theme,
|
theme,
|
||||||
(HDC) hDC,
|
hDCMem,
|
||||||
9 /* TABP_PANE */,
|
9 /* TABP_PANE */,
|
||||||
0,
|
0,
|
||||||
&rc,
|
&rc,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
} // deselect bitmap from the memory HDC before using it
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
WXHBRUSH wxNotebook::QueryBgBitmap()
|
|
||||||
{
|
|
||||||
wxRect r = GetPageSize();
|
|
||||||
if ( r.IsEmpty() )
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
WindowHDC hDC(GetHwnd());
|
|
||||||
MemoryHDC hDCMem(hDC);
|
|
||||||
CompatibleBitmap hBmp(hDC, r.x + r.width, r.y + r.height);
|
|
||||||
|
|
||||||
SelectInHDC selectBmp(hDCMem, hBmp);
|
|
||||||
|
|
||||||
if ( !DoDrawBackground((WXHDC)(HDC)hDCMem) )
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return (WXHBRUSH)::CreatePatternBrush(hBmp);
|
return (WXHBRUSH)::CreatePatternBrush(hBmp);
|
||||||
}
|
}
|
||||||
@@ -1180,15 +1162,7 @@ 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) )
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// If we're using a solid colour (for example if we've switched off
|
|
||||||
// theming for this notebook), paint it
|
|
||||||
if (UseBgCol())
|
|
||||||
{
|
|
||||||
wxRect r = GetPageSize();
|
|
||||||
if ( r.IsEmpty() )
|
if ( r.IsEmpty() )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -1199,6 +1173,10 @@ bool wxNotebook::MSWPrintChild(WXHDC hDC, wxWindow *child)
|
|||||||
if ( child )
|
if ( child )
|
||||||
::MapWindowPoints(GetHwnd(), GetHwndOf(child), (POINT *)&rc, 2);
|
::MapWindowPoints(GetHwnd(), GetHwndOf(child), (POINT *)&rc, 2);
|
||||||
|
|
||||||
|
// If we're using a solid colour (for example if we've switched off
|
||||||
|
// theming for this notebook), paint it
|
||||||
|
if (UseBgCol())
|
||||||
|
{
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user