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