From: Vadim Zeitlin Date: Fri, 19 Nov 2004 19:53:03 +0000 (+0000) Subject: refactored code to do brush adjustment for bg drawing in only one place X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/5c836c463a8ece980b66ebc9920f1b045d9a8f33 refactored code to do brush adjustment for bg drawing in only one place git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30641 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/msw/notebook.h b/include/wx/msw/notebook.h index caa4a9f710..f732ce9da5 100644 --- a/include/wx/msw/notebook.h +++ b/include/wx/msw/notebook.h @@ -167,7 +167,9 @@ public: // get the brush to be used for painting the background for the controls // which need it in their MSWControlColor() - WXHBRUSH GetThemeBackgroundBrush() const { return m_hbrBackground; } + // + // the brush will be adjusted for use with the given window on this DC + WXHBRUSH GetThemeBackgroundBrush(WXHDC hDC, wxWindow *win) const; #endif // wxUSE_UXTHEME protected: diff --git a/src/msw/control.cpp b/src/msw/control.cpp index 2dc7d3e0e9..30bc08f498 100644 --- a/src/msw/control.cpp +++ b/src/msw/control.cpp @@ -327,24 +327,32 @@ bool wxControl::MSWOnNotify(int idCtrl, } #endif // Win95 -WXHBRUSH wxControl::MSWControlColor(WXHDC pDC) +WXHBRUSH wxControl::MSWControlColorSolid(WXHDC pDC, wxColour colBg) { HDC hdc = (HDC)pDC; if ( m_hasFgCol ) ::SetTextColor(hdc, wxColourToRGB(GetForegroundColour())); - if ( m_hasBgCol ) + if ( colBg.Ok() ) { - wxColour colBack = GetBackgroundColour(); - - ::SetBkColor(hdc, wxColourToRGB(colBack)); + ::SetBkColor(hdc, wxColourToRGB(colBg)); - wxBrush *brush = wxTheBrushList->FindOrCreateBrush(colBack, wxSOLID); + wxBrush *brush = wxTheBrushList->FindOrCreateBrush(colBg, wxSOLID); return (WXHBRUSH)brush->GetResourceHandle(); } - SetBkMode(hdc, TRANSPARENT); + return 0; +} + +WXHBRUSH wxControl::MSWControlColor(WXHDC pDC) +{ + WXHBRUSH hbr = MSWControlColorSolid(pDC, m_hasBgCol ? m_backgroundColour + : wxNullColour); + if ( hbr ) + return hbr; + + ::SetBkMode((HDC)pDC, TRANSPARENT); #if wxUSE_UXTHEME && wxUSE_NOTEBOOK if ( wxUxThemeEngine::GetIfActive() ) @@ -354,22 +362,25 @@ WXHBRUSH wxControl::MSWControlColor(WXHDC pDC) wxNotebook *nbook = wxDynamicCast(win, wxNotebook); if ( nbook ) { - WXHBRUSH hbr = nbook->GetThemeBackgroundBrush(); - if ( hbr ) - { - RECT rc; - GetWindowRect(GetHwnd(), &rc); - - MapWindowPoints(NULL, GetHwndOf(nbook), (POINT *)&rc, 1); - SetBrushOrgEx(hdc, -rc.left, -rc.top, NULL); - return hbr; - } + // return value may be NULL but it is ok: if the first parent + // notebook doesn't use themes, then we don't have to process + // this message at all, so let default processing take place + return nbook->GetThemeBackgroundBrush(pDC, this); } } } #endif // wxUSE_UXTHEME - return GetStockObject(NULL_BRUSH); + return ::GetStockObject(NULL_BRUSH); +} + +WXHBRUSH wxControl::MSWControlColorDisabled(WXHDC pDC) +{ + return MSWControlColorSolid + ( + pDC, + wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE) + ); } // --------------------------------------------------------------------------- diff --git a/src/msw/notebook.cpp b/src/msw/notebook.cpp index 13c06febc0..3741960c93 100644 --- a/src/msw/notebook.cpp +++ b/src/msw/notebook.cpp @@ -888,32 +888,40 @@ void wxNotebook::UpdateBgBrush() } } -void wxNotebook::DoEraseBackground(wxEraseEvent& event) +WXHBRUSH wxNotebook::GetThemeBackgroundBrush(WXHDC hDC, wxWindow *win) const { - // 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) if ( m_hbrBackground ) { // before drawing with the background brush, we need to position it // correctly - wxWindow *win = (wxWindow *)event.GetEventObject(); - RECT rc; ::GetWindowRect(GetHwndOf(win), &rc); ::MapWindowPoints(NULL, GetHwnd(), (POINT *)&rc, 1); - HDC hdc = GetHdcOf(*event.GetDC()); - if ( !::SetBrushOrgEx(hdc, -rc.left, -rc.top, NULL) ) + if ( !::SetBrushOrgEx((HDC)hDC, -rc.left, -rc.top, NULL) ) { wxLogLastError(_T("SetBrushOrgEx(notebook bg brush)")); } + } + + return m_hbrBackground; +} +void wxNotebook::DoEraseBackground(wxEraseEvent& event) +{ + // 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) + wxWindow *win = (wxWindow *)event.GetEventObject(); + HDC hdc = GetHdcOf(*event.GetDC()); + WXHBRUSH hbr = GetThemeBackgroundBrush((WXHDC)hdc, win); + if ( hbr ) + { RECT rectClient; ::GetClientRect(GetHwndOf(win), &rectClient); - ::FillRect(hdc, &rectClient, (HBRUSH)m_hbrBackground); + ::FillRect(hdc, &rectClient, (HBRUSH)hbr); } }