From a5b1be33b7c93a69932d080fd544176bd9220615 Mon Sep 17 00:00:00 2001 From: Jaakko Salli Date: Sat, 19 Dec 2009 14:47:37 +0000 Subject: [PATCH] Added wxWindowMSW::MSWGetThemeColour(); initially use it in wxComboCtrl::OnThemeChange() git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62947 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/msw/window.h | 17 ++++++++++++ src/msw/combo.cpp | 34 +++++------------------- src/msw/window.cpp | 58 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+), 28 deletions(-) diff --git a/include/wx/msw/window.h b/include/wx/msw/window.h index c4670e7336..a65fa4910a 100644 --- a/include/wx/msw/window.h +++ b/include/wx/msw/window.h @@ -13,6 +13,8 @@ #ifndef _WX_WINDOW_H_ #define _WX_WINDOW_H_ +enum wxSystemColour; + // if this is set to 1, we use deferred window sizing to reduce flicker when // resizing complicated window hierarchies, but this can in theory result in // different behaviour than the old code so we keep the possibility to use it @@ -413,6 +415,21 @@ public: WXHBRUSH MSWGetBgBrush(WXHDC hDC) { return MSWGetBgBrush(hDC, this); } WXHBRUSH MSWGetBgBrush(WXHDC hDC, wxWindowMSW *child); + enum MSWThemeColour + { + ThemeColourText = 0, + ThemeColourBackground, + ThemeColourBorder + }; + + // returns a specific theme colour, or if that is not possible then + // wxSystemSettings::GetColour(fallback) + wxColour MSWGetThemeColour(const wchar_t *themeName, + int themePart, + int themeState, + MSWThemeColour themeColour, + wxSystemColour fallback); + // gives the parent the possibility to draw its children background, e.g. // this is used by wxNotebook to do it using DrawThemeBackground() // diff --git a/src/msw/combo.cpp b/src/msw/combo.cpp index f30d15982e..733e068430 100644 --- a/src/msw/combo.cpp +++ b/src/msw/combo.cpp @@ -232,34 +232,12 @@ void wxComboCtrl::OnThemeChange() m_hasFgCol = false; } - wxColour bgCol = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW); - -#if wxUSE_UXTHEME - wxUxThemeEngine * const theme = wxUxThemeEngine::GetIfActive(); - if ( theme ) - { - // NB: use EDIT, not COMBOBOX (the latter works in XP but not Vista) - wxUxThemeHandle hTheme(this, L"EDIT"); - COLORREF col; - HRESULT hr = theme->GetThemeColor - ( - hTheme, - EP_EDITTEXT, - ETS_NORMAL, - TMT_FILLCOLOR, - &col - ); - if ( SUCCEEDED(hr) ) - { - bgCol = wxRGBToColour(col); - } - else - { - wxLogApiError("GetThemeColor(EDIT, ETS_NORMAL, TMT_FILLCOLOR)", - hr); - } - } -#endif + // NB: use EDIT, not COMBOBOX (the latter works in XP but not Vista) + wxColour bgCol = MSWGetThemeColour(L"EDIT", + EP_EDITTEXT, + ETS_NORMAL, + ThemeColourBackground, + wxSYS_COLOUR_WINDOW); if ( !m_hasBgCol ) { diff --git a/src/msw/window.cpp b/src/msw/window.cpp index c95309f8aa..0338827151 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -4701,6 +4701,64 @@ extern wxCOLORMAP *wxGetStdColourMap() return s_cmap; } +#if wxUSE_UXTHEME && !defined(TMT_FILLCOLOR) + #define TMT_FILLCOLOR 3802 + #define TMT_TEXTCOLOR 3803 + #define TMT_BORDERCOLOR 3801 +#endif + +wxColour wxWindowMSW::MSWGetThemeColour(const wchar_t *themeName, + int themePart, + int themeState, + MSWThemeColour themeColour, + wxSystemColour fallback) +{ +#if wxUSE_UXTHEME + const wxUxThemeEngine* theme = wxUxThemeEngine::GetIfActive(); + if ( theme ) + { + int themeProperty = 0; + + // TODO: Convert this into a table? Sure would be faster. + switch ( themeColour ) + { + case ThemeColourBackground: + themeProperty = TMT_FILLCOLOR; + break; + case ThemeColourText: + themeProperty = TMT_TEXTCOLOR; + break; + case ThemeColourBorder: + themeProperty = TMT_BORDERCOLOR; + break; + default: + wxFAIL_MSG(wxT("unsupported theme colour")); + }; + + wxUxThemeHandle hTheme(this, themeName); + COLORREF col; + HRESULT hr = theme->GetThemeColor + ( + hTheme, + themePart, + themeState, + themeProperty, + &col + ); + + if ( SUCCEEDED(hr) ) + return wxRGBToColour(col); + + wxLogApiError( + wxString::Format( + "GetThemeColor(%s, %i, %i, %i)", + themeName, themePart, themeState, themeProperty), + hr); + } +#endif + return wxSystemSettings::GetColour(fallback); +} + // --------------------------------------------------------------------------- // painting // --------------------------------------------------------------------------- -- 2.45.2