From 64c4e0674ccf2913712d1a8e8291ac2d984b4633 Mon Sep 17 00:00:00 2001 From: Maarten Bent Date: Wed, 16 Dec 2015 20:59:27 +0100 Subject: [PATCH 1/4] Determine correct checkbox size when using theme. --- src/generic/datavgen.cpp | 4 +--- src/generic/renderg.cpp | 4 ++-- src/msw/renderer.cpp | 17 +++++++++++++++++ 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/generic/datavgen.cpp b/src/generic/datavgen.cpp index f369504ada..e0c1fd6a6e 100644 --- a/src/generic/datavgen.cpp +++ b/src/generic/datavgen.cpp @@ -1152,9 +1152,7 @@ bool wxDataViewToggleRenderer::WXActivateCell(const wxRect& WXUNUSED(cellRect), wxSize wxDataViewToggleRenderer::GetSize() const { - // the window parameter is not used by GetCheckBoxSize() so it's - // safe to pass NULL - return wxRendererNative::Get().GetCheckBoxSize(NULL); + return wxRendererNative::Get().GetCheckBoxSize(GetView()); } // --------------------------------------------------------- diff --git a/src/generic/renderg.cpp b/src/generic/renderg.cpp index d42a5e654b..2d5de98030 100644 --- a/src/generic/renderg.cpp +++ b/src/generic/renderg.cpp @@ -712,9 +712,9 @@ wxRendererGeneric::DrawCheckBox(wxWindow *WXUNUSED(win), } } -wxSize wxRendererGeneric::GetCheckBoxSize(wxWindow *WXUNUSED(win)) +wxSize wxRendererGeneric::GetCheckBoxSize(wxWindow *win) { - return wxSize(16, 16); + return win->FromDIP(wxSize(16, 16)); } void diff --git a/src/msw/renderer.cpp b/src/msw/renderer.cpp index 01054e7007..080b5a141d 100644 --- a/src/msw/renderer.cpp +++ b/src/msw/renderer.cpp @@ -327,6 +327,8 @@ public: wxTitleBarButton button, int flags = 0); + virtual wxSize GetCheckBoxSize(wxWindow *win); + virtual void DrawGauge(wxWindow* win, wxDC& dc, const wxRect& rect, @@ -902,6 +904,21 @@ wxRendererXP::DrawTitleBarBitmap(wxWindow *win, DoDrawButtonLike(hTheme, part, dc, rect, flags); } +wxSize wxRendererXP::GetCheckBoxSize(wxWindow* win) +{ + wxUxThemeHandle hTheme(win, L"BUTTON"); + wxUxThemeEngine* const te = wxUxThemeEngine::Get(); + + if (te->IsThemePartDefined(hTheme, BP_CHECKBOX, 0)) + { + SIZE checkSize; + te->GetThemePartSize(hTheme, NULL, BP_CHECKBOX, CBS_UNCHECKEDNORMAL, NULL, TS_DRAW, &checkSize); + return wxSize(checkSize.cx, checkSize.cy); + } + else + return m_rendererNative.GetCheckBoxSize(win); +} + void wxRendererXP::DrawCollapseButton(wxWindow *win, wxDC& dc, From bbe61adae8197486d1d0d321c6490ee3dd7630d0 Mon Sep 17 00:00:00 2001 From: Maarten Bent Date: Wed, 16 Dec 2015 21:01:46 +0100 Subject: [PATCH 2/4] Use IsThemePartDefined according to the specification. iStateId should always be 0 (https://msdn.microsoft.com/en-us/library/windows/desktop/bb759819%28v=vs.85%29.aspx). --- src/msw/renderer.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/msw/renderer.cpp b/src/msw/renderer.cpp index 080b5a141d..429d7c884d 100644 --- a/src/msw/renderer.cpp +++ b/src/msw/renderer.cpp @@ -939,7 +939,7 @@ wxRendererXP::DrawCollapseButton(wxWindow *win, if ( flags & wxCONTROL_EXPANDED ) state += 3; - if ( te->IsThemePartDefined(hTheme, TDLG_EXPANDOBUTTON, state) ) + if ( te->IsThemePartDefined(hTheme, TDLG_EXPANDOBUTTON, 0) ) { if (flags & wxCONTROL_EXPANDED) flags |= wxCONTROL_CHECKED; @@ -970,7 +970,7 @@ wxSize wxRendererXP::GetCollapseButtonSize(wxWindow *win, wxDC& dc) // EXPANDOBUTTON scales ugly if not using the correct size, get size from theme - if ( te->IsThemePartDefined(hTheme, TDLG_EXPANDOBUTTON, TDLGEBS_NORMAL) ) + if ( te->IsThemePartDefined(hTheme, TDLG_EXPANDOBUTTON, 0) ) { SIZE s; te->GetThemePartSize(hTheme, @@ -998,7 +998,7 @@ wxRendererXP::DrawItemSelectionRect(wxWindow *win, const int itemState = GetListItemState(flags); wxUxThemeEngine* const te = wxUxThemeEngine::Get(); - if ( te->IsThemePartDefined(hTheme, LVP_LISTITEM, itemState) ) + if ( te->IsThemePartDefined(hTheme, LVP_LISTITEM, 0) ) { RECT rc; wxCopyRectToRECT(rect, rc); @@ -1027,7 +1027,7 @@ void wxRendererXP::DrawItemText(wxWindow* win, wxUxThemeEngine* te = wxUxThemeEngine::Get(); if ( te->DrawThemeTextEx && // Might be not available if we're under XP - te->IsThemePartDefined(hTheme, LVP_LISTITEM, itemState) ) + te->IsThemePartDefined(hTheme, LVP_LISTITEM, 0) ) { RECT rc; wxCopyRectToRECT(rect, rc); From 15855306237d0ad1627caa3d4cb69129c80b6fae Mon Sep 17 00:00:00 2001 From: Maarten Bent Date: Wed, 16 Dec 2015 21:04:15 +0100 Subject: [PATCH 3/4] Show custom foreground colour when theme is used. --- src/msw/renderer.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/msw/renderer.cpp b/src/msw/renderer.cpp index 429d7c884d..36b754b75f 100644 --- a/src/msw/renderer.cpp +++ b/src/msw/renderer.cpp @@ -1036,10 +1036,20 @@ void wxRendererXP::DrawItemText(wxWindow* win, textOpts.dwSize = sizeof(textOpts); textOpts.dwFlags = DTT_STATEID; textOpts.iStateId = itemState; - if (flags & wxCONTROL_DISABLED) + + wxColour textColour = dc.GetTextForeground(); + if (flags & wxCONTROL_SELECTED) { + textColour = wxSystemSettings::GetColour(wxSYS_COLOUR_LISTBOXTEXT); + } + else if (flags & wxCONTROL_DISABLED) + { + textColour = wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT); + } + + if (textColour.IsOk()) { textOpts.dwFlags |= DTT_TEXTCOLOR; - textOpts.crText = wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT).GetPixel(); + textOpts.crText = textColour.GetPixel(); } DWORD textFlags = DT_NOPREFIX; From 3cbdbba2fb5c2911810a8202a9c7812e1395255b Mon Sep 17 00:00:00 2001 From: Maarten Bent Date: Thu, 17 Dec 2015 17:21:50 +0100 Subject: [PATCH 4/4] Add validity checks to GetCheckBoxSize. --- src/msw/renderer.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/msw/renderer.cpp b/src/msw/renderer.cpp index 36b754b75f..47087e4781 100644 --- a/src/msw/renderer.cpp +++ b/src/msw/renderer.cpp @@ -907,16 +907,18 @@ wxRendererXP::DrawTitleBarBitmap(wxWindow *win, wxSize wxRendererXP::GetCheckBoxSize(wxWindow* win) { wxUxThemeHandle hTheme(win, L"BUTTON"); - wxUxThemeEngine* const te = wxUxThemeEngine::Get(); - - if (te->IsThemePartDefined(hTheme, BP_CHECKBOX, 0)) + if (hTheme) { - SIZE checkSize; - te->GetThemePartSize(hTheme, NULL, BP_CHECKBOX, CBS_UNCHECKEDNORMAL, NULL, TS_DRAW, &checkSize); - return wxSize(checkSize.cx, checkSize.cy); + wxUxThemeEngine* const te = wxUxThemeEngine::Get(); + + if (te && te->IsThemePartDefined(hTheme, BP_CHECKBOX, 0)) + { + SIZE checkSize; + if (te->GetThemePartSize(hTheme, NULL, BP_CHECKBOX, CBS_UNCHECKEDNORMAL, NULL, TS_DRAW, &checkSize) == S_OK) + return wxSize(checkSize.cx, checkSize.cy); + } } - else - return m_rendererNative.GetCheckBoxSize(win); + return m_rendererNative.GetCheckBoxSize(win); } void