From: Vadim Zeitlin Date: Wed, 23 Mar 2005 20:59:00 +0000 (+0000) Subject: adjust the rectangle before calling DrawThemeBackground() (patch 1158282) X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/de359565aea29f94464d6c93eee8ed9fdfa5de4a?ds=inline adjust the rectangle before calling DrawThemeBackground() (patch 1158282) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@33005 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/msw/notebook.h b/include/wx/msw/notebook.h index 7261a747a5..ef54ae0aec 100644 --- a/include/wx/msw/notebook.h +++ b/include/wx/msw/notebook.h @@ -202,13 +202,8 @@ protected: void AdjustPageSize(wxNotebookPage *page); #if wxUSE_UXTHEME - // this is a slightly ugly function which gets the bitmap of notebook - // background and either returns the colour under the specified window in it - // or creates a brush from it - // - // so if win == NULL, a brush is created and returned - // win != NULL, returns COLORREF of the pixel under its top left corner - WXHANDLE QueryBgBitmap(wxWindow *win = NULL); + // gets the bitmap of notebook background and returns a brush from it + WXHBRUSH QueryBgBitmap(); // creates the brush to be used for drawing the tab control background void UpdateBgBrush(); diff --git a/src/msw/notebook.cpp b/src/msw/notebook.cpp index 49436dcb63..8e25f3895b 100644 --- a/src/msw/notebook.cpp +++ b/src/msw/notebook.cpp @@ -180,6 +180,23 @@ IMPLEMENT_DYNAMIC_CLASS(wxNotebookPageInfo, wxObject ) #endif IMPLEMENT_DYNAMIC_CLASS(wxNotebookEvent, wxNotifyEvent) +// ---------------------------------------------------------------------------- +// local functions +// ---------------------------------------------------------------------------- + +// apparently DrawThemeBackground() modifies the rect passed to it and if we +// don't call this function there are some drawing artifacts which are only +// visible with some non default themes; so modify the rect here so that it +// still paints the correct area +static void AdjustRectForThemeBg(RECT& rc) +{ + // magic numbers needed to compensate for DrawThemeBackground() + rc.left -= 2; + rc.top -= 2; + rc.right += 4; + rc.bottom += 5; +} + // ============================================================================ // implementation // ============================================================================ @@ -945,33 +962,37 @@ void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event) #if wxUSE_UXTHEME -WXHANDLE wxNotebook::QueryBgBitmap(wxWindow *win) +WXHBRUSH wxNotebook::QueryBgBitmap() { RECT rc; - GetWindowRect(GetHwnd(), &rc); + ::GetClientRect(GetHwnd(), &rc); + + // adjust position + TabCtrl_AdjustRect(GetHwnd(), false, &rc); WindowHDC hDC(GetHwnd()); MemoryHDC hDCMem(hDC); - CompatibleBitmap hBmp(hDC, rc.right - rc.left, rc.bottom - rc.top); + CompatibleBitmap hBmp(hDC, rc.right, rc.bottom); SelectInHDC selectBmp(hDCMem, hBmp); - ::SendMessage(GetHwnd(), WM_PRINTCLIENT, - (WPARAM)(HDC)hDCMem, - PRF_ERASEBKGND | PRF_CLIENT | PRF_NONCLIENT); - - if ( win ) + wxUxThemeHandle theme(this, L"TAB"); + if ( theme ) { - RECT rc2; - ::GetWindowRect(GetHwndOf(win), &rc2); - - COLORREF c = ::GetPixel(hDCMem, rc2.left - rc.left, rc2.top - rc.top); + AdjustRectForThemeBg(rc); - return (WXHANDLE)c; + wxUxThemeEngine::Get()->DrawThemeBackground + ( + theme, + (WXHDC)hDCMem, + 9 /* TABP_PANE */, + 0, + &rc, + NULL + ); } - //else: we are asked to create the brush - return (WXHANDLE)::CreatePatternBrush(hBmp); + return (WXHBRUSH)::CreatePatternBrush(hBmp); } void wxNotebook::UpdateBgBrush() @@ -981,7 +1002,7 @@ void wxNotebook::UpdateBgBrush() if ( !m_hasBgCol && wxUxThemeEngine::GetIfActive() ) { - m_hbrBackground = (WXHBRUSH)QueryBgBitmap(); + m_hbrBackground = QueryBgBitmap(); } else // no themes { @@ -1011,7 +1032,7 @@ WXHBRUSH wxNotebook::MSWGetBgBrushForChild(WXHDC hDC, wxWindow *win) return wxNotebookBase::MSWGetBgBrushForChild(hDC, win); } -wxColour wxNotebook::MSWGetBgColourForChild(wxWindow *win) +wxColour wxNotebook::MSWGetBgColourForChild(wxWindow *WXUNUSED(win)) { if ( m_hasBgCol ) return GetBackgroundColour(); @@ -1030,9 +1051,7 @@ wxColour wxNotebook::MSWGetBgColourForChild(wxWindow *win) if ( !wxUxThemeEngine::GetIfActive() ) return wxNullColour; - COLORREF c = (COLORREF)QueryBgBitmap(win); - - return c == CLR_INVALID ? wxNullColour : wxRGBToColour(c); + return GetThemeBackgroundColour(); } bool @@ -1040,20 +1059,28 @@ wxNotebook::MSWPrintChild(wxWindow *win, WXWPARAM wParam, WXLPARAM WXUNUSED(lParam)) { - // Don't paint the theme for the child if we have a solid - // background - if (m_hasBgCol || HasFlag(wxNB_NOPAGETHEME) || (wxSystemOptions::HasOption(wxT("msw.notebook.themed-background")) && - wxSystemOptions::GetOptionInt(wxT("msw.notebook.themed-background")) == 0)) + // Don't paint the theme for the child if we have a solid background + if ( m_hasBgCol || + wxSystemOptions::IsFalse(wxT("msw.notebook.themed-background")) || + HasFlag(wxNB_NOPAGETHEME) ) + { return false; - + } + + RECT rc; ::GetClientRect(GetHwnd(), &rc); - TabCtrl_AdjustRect(GetHwnd(), true, &rc); - ::MapWindowPoints(GetHwnd(), GetHwndOf(win), (POINT *)&rc, 2); + + // adjust position + TabCtrl_AdjustRect(GetHwnd(), false, &rc); wxUxThemeHandle theme(win, L"TAB"); if ( theme ) { + // map from this client to win client coords + ::MapWindowPoints(GetHwnd(), GetHwndOf(win), (POINT *)&rc, 2); + + AdjustRectForThemeBg(rc); wxUxThemeEngine::Get()->DrawThemeBackground ( theme,