From: Vadim Zeitlin Date: Mon, 13 Dec 2004 00:11:14 +0000 (+0000) Subject: implemented MSWGetBgBrush/ColourForChild() to propagate themed notebook background... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/c4a95f6f991fa8685625831e52dc021b89727529 implemented MSWGetBgBrush/ColourForChild() to propagate themed notebook background to children git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30977 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/msw/notebook.h b/include/wx/msw/notebook.h index c085883714..01e861258a 100644 --- a/include/wx/msw/notebook.h +++ b/include/wx/msw/notebook.h @@ -162,17 +162,18 @@ public: // ------------------- #if wxUSE_UXTHEME - // handler for child pages erase background event - void DoEraseBackground(wxEraseEvent& event); + virtual bool SetBackgroundColour(const wxColour& colour) + { + if ( !wxNotebookBase::SetBackgroundColour(colour) ) + return false; - // real implementation of the above method - void DoEraseBackground(wxWindow *win, WXHDC hDC); + UpdateBgBrush(); - // get the brush to be used for painting the background for the controls - // which need it in their MSWControlColor() - // - // the brush will be adjusted for use with the given window on this DC - WXHBRUSH GetThemeBackgroundBrush(WXHDC hDC, wxWindow *win) const; + return true; + } + + virtual WXHBRUSH MSWGetBgBrushForChild(WXHDC hDC, wxWindow *win); + virtual wxColour MSWGetBgColourForChild(wxWindow *win); #endif // wxUSE_UXTHEME protected: @@ -189,6 +190,14 @@ 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); + // creates the brush to be used for drawing the tab control background void UpdateBgBrush(); #endif // wxUSE_UXTHEME diff --git a/src/msw/notebook.cpp b/src/msw/notebook.cpp index f8896e0cc1..f4614c1267 100644 --- a/src/msw/notebook.cpp +++ b/src/msw/notebook.cpp @@ -862,26 +862,44 @@ void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event) #if wxUSE_UXTHEME -void wxNotebook::UpdateBgBrush() +WXHANDLE wxNotebook::QueryBgBitmap(wxWindow *win) { - if ( m_hbrBackground ) - ::DeleteObject((HBRUSH)m_hbrBackground); + RECT rc; + GetWindowRect(GetHwnd(), &rc); + + WindowHDC hDC(GetHwnd()); + MemoryHDC hDCMem(hDC); + CompatibleBitmap hBmp(hDC, rc.right - rc.left, rc.bottom - rc.top); + + SelectInHDC selectBmp(hDCMem, hBmp); - if ( wxUxThemeEngine::GetIfActive() ) + ::SendMessage(GetHwnd(), WM_PRINTCLIENT, + (WPARAM)(HDC)hDCMem, + PRF_ERASEBKGND | PRF_CLIENT | PRF_NONCLIENT); + + if ( win ) { - RECT rc; - GetWindowRect(GetHwnd(), &rc); + RECT rc2; + ::GetWindowRect(GetHwndOf(win), &rc2); - WindowHDC hDC(GetHwnd()); - MemoryHDC hDCMem(hDC); - CompatibleBitmap hBmp(hDC, rc.right - rc.left, rc.bottom - rc.top); + COLORREF c = ::GetPixel(hDCMem, rc2.left - rc.left, rc2.top - rc.top); - SelectInHDC selectBmp(hDCMem, hBmp); + return (WXHANDLE)c; + } + else // we are asked to create the brush + { + return (WXHANDLE)::CreatePatternBrush(hBmp); + } +} - SendMessage(GetHwnd(), WM_PRINTCLIENT, (WPARAM)(HDC)hDCMem, - PRF_ERASEBKGND | PRF_CLIENT | PRF_NONCLIENT); +void wxNotebook::UpdateBgBrush() +{ + if ( m_hbrBackground ) + ::DeleteObject((HBRUSH)m_hbrBackground); - m_hbrBackground = (WXHBRUSH)::CreatePatternBrush(hBmp); + if ( !m_hasBgCol && wxUxThemeEngine::GetIfActive() ) + { + m_hbrBackground = (WXHBRUSH)QueryBgBitmap(); } else // no themes { @@ -889,7 +907,7 @@ void wxNotebook::UpdateBgBrush() } } -WXHBRUSH wxNotebook::GetThemeBackgroundBrush(WXHDC hDC, wxWindow *win) const +WXHBRUSH wxNotebook::MSWGetBgBrushForChild(WXHDC hDC, wxWindow *win) { if ( m_hbrBackground ) { @@ -904,30 +922,24 @@ WXHBRUSH wxNotebook::GetThemeBackgroundBrush(WXHDC hDC, wxWindow *win) const { wxLogLastError(_T("SetBrushOrgEx(notebook bg brush)")); } + + return m_hbrBackground; } - return m_hbrBackground; + return wxNotebookBase::MSWGetBgBrushForChild(hDC, win); } -void wxNotebook::DoEraseBackground(wxEraseEvent& event) +wxColour wxNotebook::MSWGetBgColourForChild(wxWindow *win) { - DoEraseBackground((wxWindow *)event.GetEventObject(), - (WXHDC)GetHdcOf(*event.GetDC())); -} + if ( m_hasBgCol ) + return GetBackgroundColour(); -void wxNotebook::DoEraseBackground(wxWindow *win, WXHDC hDC) -{ - // we can either draw the background ourselves or let DrawThemeBackground() - // do it, but as we already have the correct brush, let's do it ourselves - // (note that we use the same code in wxControl::MSWControlColor(), so if - // it breaks, it should at least break in consistent way) - WXHBRUSH hbr = GetThemeBackgroundBrush(hDC, win); - if ( hbr ) - { - RECT rectClient; - ::GetClientRect(GetHwndOf(win), &rectClient); - ::FillRect((HDC)hDC, &rectClient, (HBRUSH)hbr); - } + if ( !wxUxThemeEngine::GetIfActive() ) + return wxNullColour; + + COLORREF c = (COLORREF)QueryBgBitmap(win); + + return c == CLR_INVALID ? wxNullColour : wxRGBToColour(c); } #endif // wxUSE_UXTHEME