diff --git a/include/wx/msw/notebook.h b/include/wx/msw/notebook.h index ac3a69cb5b..70993e4d61 100644 --- a/include/wx/msw/notebook.h +++ b/include/wx/msw/notebook.h @@ -142,9 +142,6 @@ public: return true; } - // return the themed brush for painting our children - virtual WXHBRUSH MSWGetBgBrushForChild(WXHDC hDC, wxWindow *child); - // draw child background virtual bool MSWPrintChild(WXHDC hDC, wxWindow *win); @@ -174,6 +171,9 @@ protected: void AdjustPageSize(wxNotebookPage *page); #if wxUSE_UXTHEME + // return the themed brush for painting our children + virtual WXHBRUSH MSWGetCustomBgBrush() { return m_hbrBackground; } + // gets the bitmap of notebook background and returns a brush from it WXHBRUSH QueryBgBitmap(); diff --git a/include/wx/msw/window.h b/include/wx/msw/window.h index 64b95f9cd5..2a76c1e175 100644 --- a/include/wx/msw/window.h +++ b/include/wx/msw/window.h @@ -388,6 +388,18 @@ public: virtual void MSWDestroyWindow(); + // Functions dealing with painting the window background. The derived + // classes should normally only need to reimplement MSWGetBgBrush() if they + // need to use a non-solid brush for erasing their background. This + // function is called by MSWGetBgBrushForChild() which only exists for the + // weird wxToolBar case and MSWGetBgBrushForChild() itself is used by + // MSWGetBgBrush() to actually find the right brush to use. + + // The brush returned from here must remain valid at least until the next + // event loop iteration. Returning 0, as is done by default, indicates + // there is no custom background brush. + virtual WXHBRUSH MSWGetCustomBgBrush() { return 0; } + // this function should return the brush to paint the children controls // background or 0 if this window doesn't impose any particular background // on its children diff --git a/src/msw/notebook.cpp b/src/msw/notebook.cpp index ea0df3addf..db3df7f538 100644 --- a/src/msw/notebook.cpp +++ b/src/msw/notebook.cpp @@ -1146,28 +1146,6 @@ void wxNotebook::UpdateBgBrush() } } -WXHBRUSH wxNotebook::MSWGetBgBrushForChild(WXHDC hDC, wxWindow *child) -{ - if ( m_hbrBackground ) - { - // before drawing with the background brush, we need to position it - // correctly - RECT rc; - ::GetWindowRect(GetHwndOf(child), &rc); - - ::MapWindowPoints(NULL, GetHwnd(), (POINT *)&rc, 1); - - if ( !::SetBrushOrgEx((HDC)hDC, -rc.left, -rc.top, NULL) ) - { - wxLogLastError(wxT("SetBrushOrgEx(notebook bg brush)")); - } - - return m_hbrBackground; - } - - return wxNotebookBase::MSWGetBgBrushForChild(hDC, child); -} - bool wxNotebook::MSWPrintChild(WXHDC hDC, wxWindow *child) { // solid background colour overrides themed background drawing diff --git a/src/msw/window.cpp b/src/msw/window.cpp index a310475417..d982f3ed22 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -4884,9 +4884,30 @@ bool wxWindowMSW::DoEraseBackground(WXHDC hDC) } WXHBRUSH -wxWindowMSW::MSWGetBgBrushForChild(WXHDC WXUNUSED(hDC), - wxWindowMSW * WXUNUSED(child)) +wxWindowMSW::MSWGetBgBrushForChild(WXHDC hDC, wxWindowMSW *child) { + // Test for the custom background brush first. + WXHBRUSH hbrush = MSWGetCustomBgBrush(); + if ( hbrush ) + { + // We assume that this is either a stipple or hatched brush and not a + // solid one as otherwise it would have been enough to set the + // background colour and such brushes need to be positioned correctly + // in order to align when different windows are painted, so do it here. + RECT rc; + ::GetWindowRect(GetHwndOf(child), &rc); + + ::MapWindowPoints(NULL, GetHwnd(), (POINT *)&rc, 1); + + if ( !::SetBrushOrgEx((HDC)hDC, -rc.left, -rc.top, NULL) ) + { + wxLogLastError(wxT("SetBrushOrgEx(bg brush)")); + } + + return hbrush; + } + + // Otherwise see if we have a custom background colour. if ( m_hasBgCol ) { wxBrush *