]> git.saurik.com Git - wxWidgets.git/commitdiff
implemented MSWGetBgBrush/ColourForChild() to propagate themed notebook background...
authorVadim Zeitlin <vadim@wxwidgets.org>
Mon, 13 Dec 2004 00:11:14 +0000 (00:11 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Mon, 13 Dec 2004 00:11:14 +0000 (00:11 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30977 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/msw/notebook.h
src/msw/notebook.cpp

index c08588371470347ddea081832557a67317f300f2..01e861258ac6df3dc99b8af3f552b13da360c5af 100644 (file)
@@ -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
index f8896e0cc16baea72df08f8b9e3da4e966fae3bc..f4614c1267df3133e92cc9bdd35448244deb220e 100644 (file)
@@ -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