]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/msw/uxtheme.cpp
Style listbox now shows current style
[wxWidgets.git] / src / msw / uxtheme.cpp
... / ...
CommitLineData
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
44class wxUxThemeModule : public wxModule
45{
46public:
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
69IMPLEMENT_DYNAMIC_CLASS(wxUxThemeModule, wxModule)
70
71// ============================================================================
72// wxUxThemeEngine implementation
73// ============================================================================
74
75wxUxThemeEngine *wxUxThemeEngine::ms_themeEngine = NULL;
76int wxUxThemeEngine::ms_isThemeEngineAvailable = -1; // unknown
77
78wxUxThemeEngine* 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
104bool 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