| 1 | /////////////////////////////////////////////////////////////////////////////// |
| 2 | // Name: src/msw/uxtheme.cpp |
| 3 | // Purpose: implements wxUxThemeEngine class: support for XP themes |
| 4 | // Author: John Platts, Vadim Zeitlin |
| 5 | // Modified by: |
| 6 | // Created: 2003 |
| 7 | // RCS-ID: $Id$ |
| 8 | // Copyright: (c) 2003 John Platts, Vadim Zeitlin |
| 9 | // License: wxWindows licence |
| 10 | /////////////////////////////////////////////////////////////////////////////// |
| 11 | |
| 12 | // ============================================================================ |
| 13 | // declarations |
| 14 | // ============================================================================ |
| 15 | |
| 16 | // ---------------------------------------------------------------------------- |
| 17 | // headers |
| 18 | // ---------------------------------------------------------------------------- |
| 19 | |
| 20 | // For compilers that support precompilation, includes "wx.h". |
| 21 | #include "wx/wxprec.h" |
| 22 | |
| 23 | #ifdef __BORLANDC__ |
| 24 | #pragma hdrstop |
| 25 | #endif |
| 26 | |
| 27 | #if wxUSE_UXTHEME |
| 28 | |
| 29 | #ifndef WX_PRECOMP |
| 30 | #include "wx/app.h" |
| 31 | #include "wx/toplevel.h" |
| 32 | #include "wx/string.h" |
| 33 | #include "wx/log.h" |
| 34 | #include "wx/module.h" |
| 35 | #endif //WX_PRECOMP |
| 36 | |
| 37 | #include "wx/msw/uxtheme.h" |
| 38 | |
| 39 | // ============================================================================ |
| 40 | // wxUxThemeModule |
| 41 | // ============================================================================ |
| 42 | |
| 43 | // this module is responsable for deleting the theme engine |
| 44 | class wxUxThemeModule : public wxModule |
| 45 | { |
| 46 | public: |
| 47 | virtual bool OnInit() { return true; } |
| 48 | virtual void OnExit() |
| 49 | { |
| 50 | if ( wxUxThemeEngine::ms_themeEngine ) |
| 51 | { |
| 52 | // this is probably not necessary right now but try to be careful |
| 53 | // and avoid the problems which we might have if someone ever |
| 54 | // decides to show a message box using the theme engine from |
| 55 | // wxUxThemeEngine dtor (e.g. from wxDynamicLibrary dtor...) or |
| 56 | // something like this |
| 57 | wxUxThemeEngine *themeEngine = wxUxThemeEngine::ms_themeEngine; |
| 58 | wxUxThemeEngine::ms_themeEngine = NULL; |
| 59 | wxUxThemeEngine::ms_isThemeEngineAvailable = false; |
| 60 | |
| 61 | delete themeEngine; |
| 62 | } |
| 63 | } |
| 64 | |
| 65 | |
| 66 | DECLARE_DYNAMIC_CLASS(wxUxThemeModule) |
| 67 | }; |
| 68 | |
| 69 | IMPLEMENT_DYNAMIC_CLASS(wxUxThemeModule, wxModule) |
| 70 | |
| 71 | // ============================================================================ |
| 72 | // wxUxThemeEngine implementation |
| 73 | // ============================================================================ |
| 74 | |
| 75 | wxUxThemeEngine *wxUxThemeEngine::ms_themeEngine = NULL; |
| 76 | int wxUxThemeEngine::ms_isThemeEngineAvailable = -1; // unknown |
| 77 | |
| 78 | wxUxThemeEngine* wxUxThemeEngine::Get() |
| 79 | { |
| 80 | // we assume that themes are only used in the main thread hence no need for |
| 81 | // critical section here |
| 82 | if ( ms_isThemeEngineAvailable == -1 ) |
| 83 | { |
| 84 | // we're called or the first time, check if the themes are available |
| 85 | ms_themeEngine = new wxUxThemeEngine; |
| 86 | if ( !ms_themeEngine->Initialize() ) |
| 87 | { |
| 88 | // can't use themes, probably because the system doesn't support |
| 89 | // them, don't do it again |
| 90 | delete ms_themeEngine; |
| 91 | ms_themeEngine = NULL; |
| 92 | |
| 93 | ms_isThemeEngineAvailable = false; |
| 94 | } |
| 95 | else // initialized ok |
| 96 | { |
| 97 | ms_isThemeEngineAvailable = true; |
| 98 | } |
| 99 | } |
| 100 | |
| 101 | return ms_themeEngine; |
| 102 | } |
| 103 | |
| 104 | bool wxUxThemeEngine::Initialize() |
| 105 | { |
| 106 | if ( wxApp::GetComCtl32Version() < 600 ) |
| 107 | { |
| 108 | // not using theme-aware comctl32.dll anyhow, don't even try to use |
| 109 | // themes |
| 110 | return false; |
| 111 | } |
| 112 | |
| 113 | // we're prepared to handle the errors |
| 114 | wxLogNull noLog; |
| 115 | |
| 116 | if ( !m_dllUxTheme.Load(_T("uxtheme.dll")) ) |
| 117 | return false; |
| 118 | |
| 119 | #define RESOLVE_UXTHEME_FUNCTION(type, funcname) \ |
| 120 | funcname = (type)m_dllUxTheme.GetSymbol(_T(#funcname)); \ |
| 121 | if ( !funcname ) \ |
| 122 | return false |
| 123 | |
| 124 | RESOLVE_UXTHEME_FUNCTION(PFNWXUOPENTHEMEDATA, OpenThemeData); |
| 125 | RESOLVE_UXTHEME_FUNCTION(PFNWXUCLOSETHEMEDATA, CloseThemeData); |
| 126 | RESOLVE_UXTHEME_FUNCTION(PFNWXUDRAWTHEMEBACKGROUND, DrawThemeBackground); |
| 127 | RESOLVE_UXTHEME_FUNCTION(PFNWXUDRAWTHEMETEXT, DrawThemeText); |
| 128 | RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMEBACKGROUNDCONTENTRECT, GetThemeBackgroundContentRect); |
| 129 | RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMEBACKGROUNDEXTENT, GetThemeBackgroundExtent); |
| 130 | RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMEPARTSIZE, GetThemePartSize); |
| 131 | RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMETEXTEXTENT, GetThemeTextExtent); |
| 132 | RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMETEXTMETRICS, GetThemeTextMetrics); |
| 133 | RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMEBACKGROUNDREGION, GetThemeBackgroundRegion); |
| 134 | RESOLVE_UXTHEME_FUNCTION(PFNWXUHITTESTTHEMEBACKGROUND, HitTestThemeBackground); |
| 135 | RESOLVE_UXTHEME_FUNCTION(PFNWXUDRAWTHEMEEDGE, DrawThemeEdge); |
| 136 | RESOLVE_UXTHEME_FUNCTION(PFNWXUDRAWTHEMEICON, DrawThemeIcon); |
| 137 | RESOLVE_UXTHEME_FUNCTION(PFNWXUISTHEMEPARTDEFINED, IsThemePartDefined); |
| 138 | RESOLVE_UXTHEME_FUNCTION(PFNWXUISTHEMEBACKGROUNDPARTIALLYTRANSPARENT, IsThemeBackgroundPartiallyTransparent); |
| 139 | RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMECOLOR, GetThemeColor); |
| 140 | RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMEMETRIC, GetThemeMetric); |
| 141 | RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMESTRING, GetThemeString); |
| 142 | RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMEBOOL, GetThemeBool); |
| 143 | RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMEINT, GetThemeInt); |
| 144 | RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMEENUMVALUE, GetThemeEnumValue); |
| 145 | RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMEPOSITION, GetThemePosition); |
| 146 | RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMEFONT, GetThemeFont); |
| 147 | RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMERECT, GetThemeRect); |
| 148 | RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMEMARGINS, GetThemeMargins); |
| 149 | RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMEINTLIST, GetThemeIntList); |
| 150 | RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMEPROPERTYORIGIN, GetThemePropertyOrigin); |
| 151 | RESOLVE_UXTHEME_FUNCTION(PFNWXUSETWINDOWTHEME, SetWindowTheme); |
| 152 | RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMEFILENAME, GetThemeFilename); |
| 153 | RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMESYSCOLOR, GetThemeSysColor); |
| 154 | RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMESYSCOLORBRUSH, GetThemeSysColorBrush); |
| 155 | RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMESYSBOOL, GetThemeSysBool); |
| 156 | RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMESYSSIZE, GetThemeSysSize); |
| 157 | RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMESYSFONT, GetThemeSysFont); |
| 158 | RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMESYSSTRING, GetThemeSysString); |
| 159 | RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMESYSINT, GetThemeSysInt); |
| 160 | RESOLVE_UXTHEME_FUNCTION(PFNWXUISTHEMEACTIVE, IsThemeActive); |
| 161 | RESOLVE_UXTHEME_FUNCTION(PFNWXUISAPPTHEMED, IsAppThemed); |
| 162 | RESOLVE_UXTHEME_FUNCTION(PFNWXUGETWINDOWTHEME, GetWindowTheme); |
| 163 | RESOLVE_UXTHEME_FUNCTION(PFNWXUENABLETHEMEDIALOGTEXTURE, EnableThemeDialogTexture); |
| 164 | RESOLVE_UXTHEME_FUNCTION(PFNWXUISTHEMEDIALOGTEXTUREENABLED, IsThemeDialogTextureEnabled); |
| 165 | RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMEAPPPROPERTIES, GetThemeAppProperties); |
| 166 | RESOLVE_UXTHEME_FUNCTION(PFNWXUSETTHEMEAPPPROPERTIES, SetThemeAppProperties); |
| 167 | RESOLVE_UXTHEME_FUNCTION(PFNWXUGETCURRENTTHEMENAME, GetCurrentThemeName); |
| 168 | RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMEDOCUMENTATIONPROPERTY, GetThemeDocumentationProperty); |
| 169 | RESOLVE_UXTHEME_FUNCTION(PFNWXUDRAWTHEMEPARENTBACKGROUND, DrawThemeParentBackground); |
| 170 | RESOLVE_UXTHEME_FUNCTION(PFNWXUENABLETHEMING, EnableTheming); |
| 171 | |
| 172 | #undef RESOLVE_UXTHEME_FUNCTION |
| 173 | |
| 174 | return true; |
| 175 | } |
| 176 | |
| 177 | #endif // wxUSE_UXTHEME |