From 9f93b45e59e93e17850bbc37a8960240072bc1c0 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Wed, 19 Apr 2006 02:15:30 +0000 Subject: [PATCH] implemented DrawCheckButton() for XP renderer; code cleanup git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@38827 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/msw/renderer.cpp | 261 ++++++++++++++++++++++++++----------------- 1 file changed, 160 insertions(+), 101 deletions(-) diff --git a/src/msw/renderer.cpp b/src/msw/renderer.cpp index 98293ee53d..4763dfe7bd 100644 --- a/src/msw/renderer.cpp +++ b/src/msw/renderer.cpp @@ -39,6 +39,11 @@ // tmschema.h is in Win32 Platform SDK and might not be available with earlier // compilers #ifndef CP_DROPDOWNBUTTON + #define BP_CHECKBOX 3 + #define CBS_UNCHECKEDNORMAL 1 + #define CBS_CHECKEDNORMAL (CBS_UNCHECKEDNORMAL + 4) + #define CBS_MIXEDNORMAL (CBS_CHECKEDNORMAL + 4) + #define CP_DROPDOWNBUTTON 1 #define CBXS_NORMAL 1 @@ -46,9 +51,9 @@ #define CBXS_PRESSED 3 #define CBXS_DISABLED 4 - #define TVP_GLYPH 2 - - #define GLPS_CLOSED 1 + #define TVP_GLYPH 2 + + #define GLPS_CLOSED 1 #define GLPS_OPENED 2 #define HP_HEADERITEM 1 @@ -58,6 +63,10 @@ #define HIS_PRESSED 3 #endif +#if defined(__WXWINCE__) && !defined(DFCS_FLAT) + #define DFCS_FLAT 0 +#endif + // ---------------------------------------------------------------------------- // wxRendererMSW: wxRendererNative implementation for "old" Win32 systems // ---------------------------------------------------------------------------- @@ -91,6 +100,14 @@ public: static wxRendererNative& Get(); + virtual void DrawHeaderButton(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0); + virtual void DrawTreeItemButton(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0); virtual void DrawSplitterBorder(wxWindow *win, wxDC& dc, const wxRect& rect, @@ -101,21 +118,16 @@ public: wxCoord position, wxOrientation orient, int flags = 0); - - virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win); - virtual void DrawComboBoxDropButton(wxWindow *win, wxDC& dc, const wxRect& rect, int flags = 0); - virtual void DrawTreeItemButton(wxWindow *win, - wxDC& dc, - const wxRect& rect, - int flags = 0); - virtual void DrawHeaderButton(wxWindow *win, - wxDC& dc, - const wxRect &rect, - int flags=0); + virtual void DrawCheckButton(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0); + + virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win); private: DECLARE_NO_COPY_CLASS(wxRendererXP) }; @@ -146,10 +158,6 @@ wxRendererNative& wxRendererMSW::Get() return s_rendererMSW; } -#if defined(__WXWINCE__) && !defined(DFCS_FLAT) -#define DFCS_FLAT 0 -#endif - void wxRendererMSW::DrawComboBoxDropButton(wxWindow * WXUNUSED(win), wxDC& dc, @@ -195,35 +203,140 @@ wxRendererXP::DrawComboBoxDropButton(wxWindow * win, int flags) { wxUxThemeHandle hTheme(win, L"COMBOBOX"); - if ( hTheme ) + if ( !hTheme ) { - RECT r; - r.left = rect.x; - r.top = rect.y; - r.right = rect.x + rect.width; - r.bottom = rect.y + rect.height; - - int state; - if ( flags & wxCONTROL_PRESSED ) - state = CBXS_PRESSED; - else if ( flags & wxCONTROL_CURRENT ) - state = CBXS_HOT; - else if ( flags & wxCONTROL_DISABLED ) - state = CBXS_DISABLED; - else - state = CBXS_NORMAL; - - wxUxThemeEngine::Get()->DrawThemeBackground - ( - hTheme, - (HDC) dc.GetHDC(), - CP_DROPDOWNBUTTON, - state, - &r, - NULL - ); - + m_rendererNative.DrawComboBoxDropButton(win, dc, rect, flags); + return; } + + RECT r; + wxCopyRectToRECT(rect, r); + + int state; + if ( flags & wxCONTROL_PRESSED ) + state = CBXS_PRESSED; + else if ( flags & wxCONTROL_CURRENT ) + state = CBXS_HOT; + else if ( flags & wxCONTROL_DISABLED ) + state = CBXS_DISABLED; + else + state = CBXS_NORMAL; + + wxUxThemeEngine::Get()->DrawThemeBackground + ( + hTheme, + GetHdcOf(dc), + CP_DROPDOWNBUTTON, + state, + &r, + NULL + ); + +} + +void +wxRendererXP::DrawHeaderButton(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags) +{ + wxUxThemeHandle hTheme(win, L"HEADER"); + if ( !hTheme ) + { + m_rendererNative.DrawHeaderButton(win, dc, rect, flags); + return; + } + + RECT r; + wxCopyRectToRECT(rect, r); + + int state; + if ( flags & wxCONTROL_PRESSED ) + state = HIS_PRESSED; + else if ( flags & wxCONTROL_CURRENT ) + state = HIS_HOT; + else + state = HIS_NORMAL; + wxUxThemeEngine::Get()->DrawThemeBackground + ( + hTheme, + GetHdcOf(dc), + HP_HEADERITEM, + state, + &r, + NULL + ); +} + +void +wxRendererXP::DrawTreeItemButton(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags) +{ + wxUxThemeHandle hTheme(win, L"TREEVIEW"); + if ( !hTheme ) + { + m_rendererNative.DrawTreeItemButton(win, dc, rect, flags); + return; + } + + RECT r; + wxCopyRectToRECT(rect, r); + + int state = flags & wxCONTROL_EXPANDED ? GLPS_OPENED : GLPS_CLOSED; + wxUxThemeEngine::Get()->DrawThemeBackground + ( + hTheme, + GetHdcOf(dc), + TVP_GLYPH, + state, + &r, + NULL + ); +} + +void +wxRendererXP::DrawCheckButton(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags) +{ + wxUxThemeHandle hTheme(win, L"BUTTON"); + if ( !hTheme ) + { + m_rendererNative.DrawCheckButton(win, dc, rect, flags); + return; + } + + RECT r; + wxCopyRectToRECT(rect, r); + + int state; + if ( flags & wxCONTROL_CHECKED ) + state = CBS_CHECKEDNORMAL; + else if ( flags & wxCONTROL_UNDETERMINED ) + state = CBS_MIXEDNORMAL; + else + state = CBS_UNCHECKEDNORMAL; + + // CBS_XXX is followed by CBX_XXXGOT, then CBS_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, + GetHdcOf(dc), + BP_CHECKBOX, + state, + &r, + NULL + ); } // ---------------------------------------------------------------------------- @@ -236,7 +349,7 @@ static const wxCoord SASH_WIDTH = 4; wxSplitterRenderParams wxRendererXP::GetSplitterParams(const wxWindow * win) { - if (win->GetWindowStyle() & wxSP_NO_XP_THEME) + if ( win->HasFlag(wxSP_NO_XP_THEME) ) return m_rendererNative.GetSplitterParams(win); else return wxSplitterRenderParams(SASH_WIDTH, 0, false); @@ -248,7 +361,7 @@ wxRendererXP::DrawSplitterBorder(wxWindow * win, const wxRect& rect, int flags) { - if (win->GetWindowStyle() & wxSP_NO_XP_THEME) + if ( win->HasFlag(wxSP_NO_XP_THEME) ) { m_rendererNative.DrawSplitterBorder(win, dc, rect, flags); } @@ -281,59 +394,5 @@ wxRendererXP::DrawSplitterSash(wxWindow *win, m_rendererNative.DrawSplitterSash(win, dc, size, position, orient, flags); } -void -wxRendererXP::DrawTreeItemButton(wxWindow *win, - wxDC &dc, - const wxRect &rect, - int flags) -{ - wxUxThemeHandle hTheme(win, L"TREEVIEW"); - RECT r; - r.left = rect.x; - r.top = rect.y; - r.right = rect.x + rect.width; - r.bottom = rect.y + rect.height; - int state = (flags & wxCONTROL_EXPANDED) ? GLPS_OPENED : GLPS_CLOSED; - wxUxThemeEngine::Get()->DrawThemeBackground - ( - hTheme, - (HDC) dc.GetHDC(), - TVP_GLYPH, - state, - &r, - NULL - ); -} - -void -wxRendererXP::DrawHeaderButton(wxWindow *win, - wxDC &dc, - const wxRect &rect, - int flags) -{ - wxUxThemeHandle hTheme(win, L"HEADER"); - RECT r; - r.left = rect.x; - r.top = rect.y; - r.right = rect.x + rect.width; - r.bottom = rect.y + rect.height; - int state; - if ( flags & wxCONTROL_PRESSED ) - state = HIS_PRESSED; - else if ( flags & wxCONTROL_CURRENT ) - state = HIS_HOT; - else - state = HIS_NORMAL; - wxUxThemeEngine::Get()->DrawThemeBackground - ( - hTheme, - (HDC) dc.GetHDC(), - HP_HEADERITEM, - state, - &r, - NULL - ); -} - #endif // wxUSE_UXTHEME