diff --git a/include/wx/msw/notebook.h b/include/wx/msw/notebook.h index 64d6bfc5d4..6e0ee3af01 100644 --- a/include/wx/msw/notebook.h +++ b/include/wx/msw/notebook.h @@ -178,11 +178,6 @@ protected: // creates the brush to be used for drawing the tab control background 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 // these function are used for reducing flicker on notebook resize diff --git a/src/msw/notebook.cpp b/src/msw/notebook.cpp index 67e5fa2f7f..ce5c20016c 100644 --- a/src/msw/notebook.cpp +++ b/src/msw/notebook.cpp @@ -1102,27 +1102,20 @@ void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event) #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(); if ( r.IsEmpty() ) - return false; + return 0; + + wxUxThemeHandle theme(this, L"TAB"); + if ( !theme ) + return 0; 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); - - // we have the content area (page size), but we need to draw all of the - // background for it to be aligned correctly + WindowHDC hDC(GetHwnd()); wxUxThemeEngine::Get()->GetThemeBackgroundExtent ( theme, @@ -1132,33 +1125,22 @@ bool wxNotebook::DoDrawBackground(WXHDC hDC, wxWindow *child) &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); - CompatibleBitmap hBmp(hDC, r.x + r.width, r.y + r.height); + CompatibleBitmap hBmp(hDC, rc.right, rc.bottom); - SelectInHDC selectBmp(hDCMem, hBmp); - - if ( !DoDrawBackground((WXHDC)(HDC)hDCMem) ) - return 0; + { + SelectInHDC selectBmp(hDCMem, hBmp); + wxUxThemeEngine::Get()->DrawThemeBackground + ( + theme, + hDCMem, + 9 /* TABP_PANE */, + 0, + &rc, + NULL + ); + } // deselect bitmap from the memory HDC before using it return (WXHBRUSH)::CreatePatternBrush(hBmp); } @@ -1180,25 +1162,21 @@ void wxNotebook::UpdateBgBrush() bool wxNotebook::MSWPrintChild(WXHDC hDC, wxWindow *child) { - // solid background colour overrides themed background drawing - if ( !UseBgCol() && DoDrawBackground(hDC, child) ) - return true; + const 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); // 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() ) - 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()); HBRUSH hbr = GetHbrushOf(brush); @@ -1206,6 +1184,34 @@ bool wxNotebook::MSWPrintChild(WXHDC hDC, wxWindow *child) 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); } diff --git a/src/msw/window.cpp b/src/msw/window.cpp index 3cc19e0965..b2cd66a7dc 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -4888,7 +4888,13 @@ wxWindowMSW::MSWGetBgBrushForChild(WXHDC hDC, wxWindowMSW *child) RECT 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, y = rc.top;