From 081b33427e1a1b309a14624108ca79bfdbfa7913 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Mon, 5 Oct 2009 22:56:48 +0000 Subject: [PATCH] Implement wxRenderer::DrawRadioBitmap() for classic MSW renderer. Clean up the functions added in r57313: - Versions using wxUxThemeEngine should be in wxRendererXP - Provide implementation using DrawFrameControl() in wxRendererMSW too - Refactor the code to avoid triplication in wxRendererMSW git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62292 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/msw/renderer.cpp | 151 ++++++++++++++++++++++--------------------- 1 file changed, 79 insertions(+), 72 deletions(-) diff --git a/src/msw/renderer.cpp b/src/msw/renderer.cpp index 2408a16dd8..e0356d2bba 100644 --- a/src/msw/renderer.cpp +++ b/src/msw/renderer.cpp @@ -203,7 +203,10 @@ public: virtual void DrawCheckBox(wxWindow *win, wxDC& dc, const wxRect& rect, - int flags = 0); + int flags = 0) + { + DoDrawButton(DFCS_BUTTONCHECK, win, dc, rect, flags); + } virtual void DrawPushButton(wxWindow *win, wxDC& dc, @@ -213,28 +216,39 @@ public: virtual void DrawChoice(wxWindow* win, wxDC& dc, const wxRect& rect, - int flags=0); + int flags = 0); virtual void DrawComboBox(wxWindow* win, - wxDC& dc, - const wxRect& rect, - int flags=0); + wxDC& dc, + const wxRect& rect, + int flags = 0); virtual void DrawTextCtrl(wxWindow* win, - wxDC& dc, - const wxRect& rect, - int flags=0); + wxDC& dc, + const wxRect& rect, + int flags = 0); virtual void DrawRadioBitmap(wxWindow* win, - wxDC& dc, - const wxRect& rect, - int flags=0); + wxDC& dc, + const wxRect& rect, + int flags = 0) + { + DoDrawButton(DFCS_BUTTONRADIO, win, dc, rect, flags); + } virtual wxSize GetCheckBoxSize(wxWindow *win); virtual int GetHeaderButtonHeight(wxWindow *win); private: + // common part of Draw{PushButton,CheckBox,RadioBitmap}(): wraps + // DrawFrameControl(DFC_BUTTON) + void DoDrawButton(UINT kind, + wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags); + wxDECLARE_NO_COPY_CLASS(wxRendererMSW); }; @@ -286,7 +300,13 @@ public: const wxRect& rect, int flags = 0); + virtual void DrawRadioBitmap(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0); + virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win); + private: wxDECLARE_NO_COPY_CLASS(wxRendererXP); }; @@ -383,7 +403,8 @@ wxRendererMSW::DrawComboBoxDropButton(wxWindow * WXUNUSED(win), } void -wxRendererMSW::DrawCheckBox(wxWindow * WXUNUSED(win), +wxRendererMSW::DoDrawButton(UINT kind, + wxWindow * WXUNUSED(win), wxDC& dc, const wxRect& rect, int flags) @@ -391,7 +412,7 @@ wxRendererMSW::DrawCheckBox(wxWindow * WXUNUSED(win), RECT r; wxCopyRectToRECT(rect, r); - int style = DFCS_BUTTONCHECK; + int style = kind; if ( flags & wxCONTROL_CHECKED ) style |= DFCS_CHECKED; if ( flags & wxCONTROL_DISABLED ) @@ -407,18 +428,12 @@ wxRendererMSW::DrawCheckBox(wxWindow * WXUNUSED(win), } void -wxRendererMSW::DrawPushButton(wxWindow * WXUNUSED(win), +wxRendererMSW::DrawPushButton(wxWindow *win, wxDC& dc, const wxRect& rectOrig, int flags) { wxRect rect(rectOrig); - - int style = DFCS_BUTTONPUSH; - if ( flags & wxCONTROL_DISABLED ) - style |= DFCS_INACTIVE; - if ( flags & wxCONTROL_PRESSED ) - style |= DFCS_PUSHED | DFCS_FLAT; if ( flags & wxCONTROL_ISDEFAULT ) { // DrawFrameControl() doesn't seem to support default buttons so we @@ -429,10 +444,7 @@ wxRendererMSW::DrawPushButton(wxWindow * WXUNUSED(win), rect.Deflate(1); } - RECT rc; - wxCopyRectToRECT(rect, rc); - - ::DrawFrameControl(GraphicsHDC(&dc), &rc, DFC_BUTTON, style); + DoDrawButton(DFCS_BUTTONPUSH, win, dc, rect, flags); } wxSize wxRendererMSW::GetCheckBoxSize(wxWindow * WXUNUSED(win)) @@ -502,7 +514,7 @@ void wxRendererMSW::DrawTextCtrl(wxWindow* win, wxDC& dc, const wxRect& rect, in } -// Draw the equivallent of a wxComboBox +// 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 @@ -525,51 +537,6 @@ void wxRendererMSW::DrawChoice(wxWindow* win, wxDC& dc, DrawComboBox(win, dc, rect, flags); } - -// Draw a themed radio button -void wxRendererMSW::DrawRadioBitmap(wxWindow* win, wxDC& dc, const wxRect& rect, int flags) -{ -#if wxUSE_UXTHEME - wxUxThemeHandle hTheme(win, L"BUTTON"); - if ( !hTheme ) -#endif - { - // ??? m_rendererNative.DrawRadioButton(win, dc, rect, flags); - return; - } - -#if wxUSE_UXTHEME - RECT r; - wxCopyRectToRECT(rect, r); - - int state; - if ( flags & wxCONTROL_CHECKED ) - state = RBS_CHECKEDNORMAL; - else if ( flags & wxCONTROL_UNDETERMINED ) - state = RBS_MIXEDNORMAL; - else - state = RBS_UNCHECKEDNORMAL; - - // RBS_XXX is followed by RBX_XXXGOT, then RBS_XXXPRESSED and DISABLED - if ( flags & wxCONTROL_CURRENT ) - state += 1; - else if ( flags & wxCONTROL_PRESSED ) - state += 2; - else if ( flags & wxCONTROL_DISABLED ) - state += 3; - - wxUxThemeEngine::Get()->DrawThemeBackground - ( - hTheme, - GraphicsHDC(&dc), - BP_RADIOBUTTON, - state, - &r, - NULL - ); -#endif -} - // ============================================================================ // wxRendererXP implementation // ============================================================================ @@ -696,8 +663,6 @@ wxRendererXP::DrawTreeItemButton(wxWindow *win, ); } - - void wxRendererXP::DrawCheckBox(wxWindow *win, wxDC& dc, @@ -748,6 +713,48 @@ wxRendererXP::DrawCheckBox(wxWindow *win, ); } +void wxRendererXP::DrawRadioBitmap(wxWindow* win, + wxDC& dc, + const wxRect& rect, + int flags) +{ + wxUxThemeHandle hTheme(win, L"BUTTON"); + if ( !hTheme ) + { + m_rendererNative.DrawRadioBitmap(win, dc, rect, flags); + return; + } + + RECT r; + wxCopyRectToRECT(rect, r); + + int state; + if ( flags & wxCONTROL_CHECKED ) + state = RBS_CHECKEDNORMAL; + else if ( flags & wxCONTROL_UNDETERMINED ) + state = RBS_MIXEDNORMAL; + else + state = RBS_UNCHECKEDNORMAL; + + // RBS_XXX is followed by RBX_XXXGOT, then RBS_XXXPRESSED and DISABLED + if ( flags & wxCONTROL_CURRENT ) + state += 1; + else if ( flags & wxCONTROL_PRESSED ) + state += 2; + else if ( flags & wxCONTROL_DISABLED ) + state += 3; + + wxUxThemeEngine::Get()->DrawThemeBackground + ( + hTheme, + GraphicsHDC(&dc), + BP_RADIOBUTTON, + state, + &r, + NULL + ); +} + void wxRendererXP::DrawPushButton(wxWindow * win, wxDC& dc, -- 2.45.2