]> git.saurik.com Git - wxWidgets.git/commitdiff
Don't force themed background for wxToolBar under MSW, just use the default.
authorVadim Zeitlin <vadim@wxwidgets.org>
Fri, 18 Dec 2009 20:49:15 +0000 (20:49 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Fri, 18 Dec 2009 20:49:15 +0000 (20:49 +0000)
Native toolbars don't have themed background under Vista/7 and don't look good
with rebar background (which is the same one as used for the menus) as
toolbars don't appear on the top of the window.

Erasing background ourselves also results in flicker and display problems and
makes the code much more complicated. Simply don't do this to avoid all the
problems.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62931 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

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

index 4de16f718040e50708271994408423a5ba21206f..eadf5217c4f4d2adbc60f31237e48bd2ba35dc3b 100644 (file)
@@ -67,7 +67,6 @@ public:
 
     void OnMouseEvent(wxMouseEvent& event);
     void OnSysColourChanged(wxSysColourChangedEvent& event);
-    void OnEraseBackground(wxEraseEvent& event);
 
     void SetFocus() {}
 
@@ -157,12 +156,11 @@ private:
     // have
     void UpdateStretchableSpacersSize();
 
-    // redraw the background of the given part of the window (or entire window
-    // if the parameter is NULL) to erase separator drawn in it
-    //
-    // return true if the background was erased using DrawThemeBackground()
-    bool MSWEraseRect(wxDC& dc, const wxRect *rectItem = NULL);
-
+#ifndef __WXWINCE__
+    // redraw the background of the given part of the window to erase separator
+    // drawn in it
+    void MSWEraseRect(wxDC& dc, const wxRect& rectItem);
+#endif // !__WXWINCE__
 
     DECLARE_EVENT_TABLE()
     DECLARE_DYNAMIC_CLASS(wxToolBar)
index e3c26f235c0f6ed623450f918b4adca0721bf36c..1a9e9efe866e06e663958cc04adf811bbd92b3f2 100644 (file)
@@ -126,7 +126,6 @@ IMPLEMENT_DYNAMIC_CLASS(wxToolBar, wxControl)
 BEGIN_EVENT_TABLE(wxToolBar, wxToolBarBase)
     EVT_MOUSE_EVENTS(wxToolBar::OnMouseEvent)
     EVT_SYS_COLOUR_CHANGED(wxToolBar::OnSysColourChanged)
-    EVT_ERASE_BACKGROUND(wxToolBar::OnEraseBackground)
 END_EVENT_TABLE()
 
 // ----------------------------------------------------------------------------
@@ -1649,64 +1648,6 @@ void wxToolBar::OnMouseEvent(wxMouseEvent& event)
     }
 }
 
-// This handler is required to allow the toolbar to be set to a non-default
-// colour: for example, when it must blend in with a notebook page.
-void wxToolBar::OnEraseBackground(wxEraseEvent& event)
-{
-    RECT rect = wxGetClientRect(GetHwnd());
-
-    wxDC *dc = event.GetDC();
-    HDC hdc = GetHdcOf(*dc);
-
-#if wxUSE_UXTHEME
-    // we may need to draw themed colour so that we appear correctly on
-    // e.g. notebook page under XP with themes but only do it if the parent
-    // draws themed background itself
-    if ( !UseBgCol() && !GetParent()->UseBgCol() )
-    {
-        wxUxThemeEngine *theme = wxUxThemeEngine::GetIfActive();
-        if ( theme )
-        {
-            HRESULT
-                hr = theme->DrawThemeParentBackground(GetHwnd(), hdc, &rect);
-            if ( hr == S_OK )
-                return;
-
-            // it can also return S_FALSE which seems to simply say that it
-            // didn't draw anything but no error really occurred
-            if ( FAILED(hr) )
-            {
-                wxLogApiError(wxT("DrawThemeParentBackground(toolbar)"), hr);
-            }
-        }
-    }
-
-    if ( MSWEraseRect(*dc) )
-        return;
-#endif // wxUSE_UXTHEME
-
-    // we need to always draw our background under XP, as otherwise it doesn't
-    // appear correctly with some themes (e.g. Zune one)
-    if ( wxGetWinVersion() == wxWinVersion_XP ||
-            UseBgCol() || (GetMSWToolbarStyle() & TBSTYLE_TRANSPARENT) )
-    {
-        // do draw our background
-        //
-        // notice that this 'dumb' implementation may cause flicker for some of
-        // the controls in which case they should intercept wxEraseEvent and
-        // process it themselves somehow
-        AutoHBRUSH hBrush(wxColourToRGB(GetBackgroundColour()));
-
-        wxCHANGE_HDC_MAP_MODE(hdc, MM_TEXT);
-        ::FillRect(hdc, &rect, hBrush);
-    }
-    else // we have no non-default background colour
-    {
-        // let the system do it for us
-        event.Skip();
-    }
-}
-
 bool wxToolBar::HandleSize(WXWPARAM WXUNUSED(wParam), WXLPARAM lParam)
 {
     // wait until we have some tools
@@ -1759,58 +1700,9 @@ bool wxToolBar::HandleSize(WXWPARAM WXUNUSED(wParam), WXLPARAM lParam)
 
 #ifndef __WXWINCE__
 
-bool wxToolBar::MSWEraseRect(wxDC& dc, const wxRect *rectItem)
+void wxToolBar::MSWEraseRect(wxDC& dc, const wxRect& rectItem)
 {
-    // erase the given rectangle to hide the separator
-#if wxUSE_UXTHEME
-    // themed background doesn't look well under XP so only draw it for Vista
-    // and later
-    if ( !UseBgCol() && wxGetWinVersion() >= wxWinVersion_Vista )
-    {
-        wxUxThemeEngine *theme = wxUxThemeEngine::GetIfActive();
-        if ( theme )
-        {
-            wxUxThemeHandle hTheme(this, L"REBAR");
-
-            // Draw the whole background since the pattern may be position
-            // sensitive; but clip it to the area of interest.
-            RECT rcTotal;
-            wxCopyRectToRECT(GetClientSize(), rcTotal);
-
-            RECT rcItem;
-            if ( rectItem )
-                wxCopyRectToRECT(*rectItem, rcItem);
-
-            HRESULT hr = theme->DrawThemeBackground
-                                (
-                                    hTheme,
-                                    GetHdcOf(dc),
-                                    0, 0,
-                                    &rcTotal,
-                                    rectItem ? &rcItem : NULL
-                                );
-            if ( hr == S_OK )
-                return true;
-
-            // it can also return S_FALSE which seems to simply say that it
-            // didn't draw anything but no error really occurred
-            if ( FAILED(hr) )
-            {
-                wxLogApiError(wxT("DrawThemeBackground(toolbar)"), hr);
-            }
-        }
-    }
-#endif // wxUSE_UXTHEME
-
-    // this is a bit peculiar but we may simply do nothing here if no rectItem
-    // is specified (and hence we need to erase everything) as this only
-    // happens when we're called from OnEraseBackground() and in this case we
-    // may simply return false to let the systems default background erasing to
-    // take place
-    if ( rectItem )
-        dc.DrawRectangle(*rectItem);
-
-    return false;
+    dc.DrawRectangle(rectItem);
 }
 
 bool wxToolBar::HandlePaint(WXWPARAM wParam, WXLPARAM lParam)
@@ -1915,7 +1807,7 @@ bool wxToolBar::HandlePaint(WXWPARAM wParam, WXLPARAM lParam)
                 else
                     continue;
 
-                MSWEraseRect(dc, &rectItem);
+                MSWEraseRect(dc, rectItem);
             }
         }
         else if ( tool->IsStretchableSpace() )
@@ -1924,7 +1816,7 @@ bool wxToolBar::HandlePaint(WXWPARAM wParam, WXLPARAM lParam)
                 rectItem = wxRectFromRECT(wxGetTBItemRect(GetHwnd(), toolIndex));
 
             if ( rectUpdate.Intersects(rectItem) )
-                MSWEraseRect(dc, &rectItem);
+                MSWEraseRect(dc, rectItem);
         }
     }