]> git.saurik.com Git - wxWidgets.git/commitdiff
Fix DrawChoice() behaviour in wxRendererXP.
authorVadim Zeitlin <vadim@wxwidgets.org>
Sat, 26 May 2012 12:29:46 +0000 (12:29 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sat, 26 May 2012 12:29:46 +0000 (12:29 +0000)
The implementation of wxRendererXP::DrawChoice() inadvertently used
wxRendererMSW::DrawComboBoxDropButton() and so drew the button in the classic
and not themed style.

Fix this by defining DrawChoice() in the base wxRendererMSWBase class and
reusing it in wxRendererXP via inheritance and not composition.

Closes #14337.

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

src/msw/renderer.cpp

index 46f438191514712ab9304290f0c51d11ab71f5f0..6b46d788fc76504c1d1afec7b9064a5791b87748 100644 (file)
@@ -134,6 +134,26 @@ public:
                                 wxDC& dc,
                                 const wxRect& rect,
                                 int flags = 0);
+
+    void DrawChoice(wxWindow* win,
+                     wxDC& dc,
+                     const wxRect& rect,
+                     int flags = 0);
+
+    void DrawComboBox(wxWindow* win,
+                       wxDC& dc,
+                       const wxRect& rect,
+                       int flags = 0);
+
+    virtual void DrawComboBoxDropButton(wxWindow *win,
+                                         wxDC& dc,
+                                         const wxRect& rect,
+                                         int flags = 0) = 0;
+
+    virtual void DrawTextCtrl(wxWindow* win,
+                               wxDC& dc,
+                               const wxRect& rect,
+                               int flags = 0) = 0;
 };
 
 // ----------------------------------------------------------------------------
@@ -165,16 +185,6 @@ public:
                                 const wxRect& rect,
                                 int flags = 0);
 
-    virtual void DrawChoice(wxWindow* win,
-                            wxDC& dc,
-                            const wxRect& rect,
-                            int flags = 0);
-
-    virtual void DrawComboBox(wxWindow* win,
-                              wxDC& dc,
-                              const wxRect& rect,
-                              int flags = 0);
-
     virtual void DrawTextCtrl(wxWindow* win,
                               wxDC& dc,
                               const wxRect& rect,
@@ -279,6 +289,11 @@ public:
             m_rendererNative.DrawPushButton(win, dc, rect, flags);
     }
 
+    virtual void DrawTextCtrl(wxWindow* win,
+                              wxDC& dc,
+                              const wxRect& rect,
+                              int flags = 0);
+
     virtual void DrawRadioBitmap(wxWindow *win,
                                  wxDC& dc,
                                  const wxRect& rect,
@@ -364,6 +379,31 @@ void wxRendererMSWBase::DrawItemSelectionRect(wxWindow *win,
         DrawFocusRect( win, dc, rect, flags );
 }
 
+void wxRendererMSWBase::DrawChoice(wxWindow* win,
+                                   wxDC& dc,
+                                   const wxRect& rect,
+                                   int flags)
+{
+    DrawComboBox(win, dc, rect, flags);
+}
+
+void wxRendererMSWBase::DrawComboBox(wxWindow* win,
+                                     wxDC& dc,
+                                     const wxRect& rect,
+                                     int flags)
+{
+    // Draw the main part of the control same as TextCtrl
+    DrawTextCtrl(win, dc, rect, flags);
+
+    // Draw the button inside the border, on the right side
+    wxRect br(rect);
+    br.height -= 2;
+    br.x += br.width - br.height - 1;
+    br.width = br.height;
+    br.y += 1;
+
+    DrawComboBoxDropButton(win, dc, br, flags);
+}
 
 // ============================================================================
 // wxRendererNative and wxRendererMSW implementation
@@ -539,66 +579,24 @@ int wxRendererMSW::GetHeaderButtonMargin(wxWindow *WXUNUSED(win))
 }
 
 // Uses the theme to draw the border and fill for something like a wxTextCtrl
-void wxRendererMSW::DrawTextCtrl(wxWindow* win, wxDC& dc, const wxRect& rect, int flags)
+void wxRendererMSW::DrawTextCtrl(wxWindow* WXUNUSED(win),
+                                 wxDC& dc,
+                                 const wxRect& rect,
+                                 int WXUNUSED(flags))
 {
     wxColour fill;
     wxColour bdr;
-    COLORREF cref;
-
-#if wxUSE_UXTHEME
-    wxUxThemeHandle hTheme(win, L"EDIT");
-    if (hTheme)
-    {
-        wxUxThemeEngine::Get()->GetThemeColor(hTheme, EP_EDITTEXT,
-                                              ETS_NORMAL, TMT_FILLCOLOR, &cref);
-        fill = wxRGBToColour(cref);
-
-        int etsState;
-        if ( flags & wxCONTROL_DISABLED )
-            etsState = ETS_DISABLED;
-        else
-            etsState = ETS_NORMAL;
-
-        wxUxThemeEngine::Get()->GetThemeColor(hTheme, EP_EDITTEXT,
-                                              etsState, TMT_BORDERCOLOR, &cref);
-        bdr = wxRGBToColour(cref);
-    }
-    else
-#endif
     {
         fill = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
         bdr = *wxBLACK;
     }
 
-    dc.SetPen( bdr );
-    dc.SetBrush( fill );
+    dc.SetPen(bdr);
+    dc.SetBrush(fill);
     dc.DrawRectangle(rect);
 }
 
 
-// Draw the equivalent of a wxComboBox
-void wxRendererMSW::DrawComboBox(wxWindow* win, wxDC& dc, const wxRect& rect, int flags)
-{
-    // Draw the main part of the control same as TextCtrl
-    DrawTextCtrl(win, dc, rect, flags);
-
-    // Draw the button inside the border, on the right side
-    wxRect br(rect);
-    br.height -= 2;
-    br.x += br.width - br.height - 1;
-    br.width = br.height;
-    br.y += 1;
-
-    DrawComboBoxDropButton(win, dc, br, flags);
-}
-
-
-void wxRendererMSW::DrawChoice(wxWindow* win, wxDC& dc,
-                           const wxRect& rect, int flags)
-{
-    DrawComboBox(win, dc, rect, flags);
-}
-
 // ============================================================================
 // wxRendererXP implementation
 // ============================================================================
@@ -855,6 +853,42 @@ wxRendererXP::DrawTitleBarBitmap(wxWindow *win,
     DoDrawButtonLike(hTheme, part, dc, rect, flags);
 }
 
+// Uses the theme to draw the border and fill for something like a wxTextCtrl
+void wxRendererXP::DrawTextCtrl(wxWindow* win,
+                                wxDC& dc,
+                                const wxRect& rect,
+                                int flags)
+{
+    wxUxThemeHandle hTheme(win, L"EDIT");
+    if ( !hTheme )
+    {
+        m_rendererNative.DrawTextCtrl(win,dc,rect,flags);
+        return;
+    }
+
+    wxColour fill;
+    wxColour bdr;
+    COLORREF cref;
+
+    wxUxThemeEngine::Get()->GetThemeColor(hTheme, EP_EDITTEXT,
+                                          ETS_NORMAL, TMT_FILLCOLOR, &cref);
+    fill = wxRGBToColour(cref);
+
+    int etsState;
+    if ( flags & wxCONTROL_DISABLED )
+        etsState = ETS_DISABLED;
+    else
+        etsState = ETS_NORMAL;
+
+    wxUxThemeEngine::Get()->GetThemeColor(hTheme, EP_EDITTEXT,
+                                              etsState, TMT_BORDERCOLOR, &cref);
+    bdr = wxRGBToColour(cref);
+
+    dc.SetPen( bdr );
+    dc.SetBrush( fill );
+    dc.DrawRectangle(rect);
+}
+
 // ----------------------------------------------------------------------------
 // splitter drawing
 // ----------------------------------------------------------------------------