]> git.saurik.com Git - wxWidgets.git/blame - src/msw/uxtheme.cpp
Fix pulsing of bitmaps in focused buttons under Windows 7.
[wxWidgets.git] / src / msw / uxtheme.cpp
CommitLineData
2d9c0e97
VZ
1///////////////////////////////////////////////////////////////////////////////
2// Name: src/msw/uxtheme.cpp
3// Purpose: implements wxUxThemeEngine class: support for XP themes
0ea1cce3 4// Author: John Platts, Vadim Zeitlin
2d9c0e97
VZ
5// Modified by:
6// Created: 2003
7// RCS-ID: $Id$
0ea1cce3 8// Copyright: (c) 2003 John Platts, Vadim Zeitlin
526954c5 9// Licence: wxWindows licence
2d9c0e97
VZ
10///////////////////////////////////////////////////////////////////////////////
11
12// ============================================================================
13// declarations
14// ============================================================================
0d1cb8cb 15
2d9c0e97
VZ
16// ----------------------------------------------------------------------------
17// headers
18// ----------------------------------------------------------------------------
19
85b43fbf
JS
20// For compilers that support precompilation, includes "wx.h".
21#include "wx/wxprec.h"
22
23#ifdef __BORLANDC__
24 #pragma hdrstop
25#endif
26
2d9c0e97
VZ
27#if wxUSE_UXTHEME
28
85b43fbf
JS
29#ifndef WX_PRECOMP
30 #include "wx/app.h"
31 #include "wx/toplevel.h"
32 #include "wx/string.h"
33 #include "wx/log.h"
02761f6c 34 #include "wx/module.h"
85b43fbf
JS
35#endif //WX_PRECOMP
36
0d1cb8cb 37#include "wx/msw/uxtheme.h"
0d1cb8cb 38
2d9c0e97
VZ
39// ============================================================================
40// wxUxThemeModule
41// ============================================================================
0d1cb8cb 42
2d9c0e97 43// this module is responsable for deleting the theme engine
0d1cb8cb
JS
44class wxUxThemeModule : public wxModule
45{
0d1cb8cb 46public:
27d2dbbc
WS
47 virtual bool OnInit() { return true; }
48 virtual void OnExit()
49 {
50 if ( wxUxThemeEngine::ms_themeEngine )
51 {
2d9c0e97
VZ
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
27d2dbbc
WS
61 delete themeEngine;
62 }
63 }
0d1cb8cb 64
0d1cb8cb 65
27d2dbbc 66 DECLARE_DYNAMIC_CLASS(wxUxThemeModule)
0d1cb8cb
JS
67};
68
69IMPLEMENT_DYNAMIC_CLASS(wxUxThemeModule, wxModule)
0d1cb8cb 70
2d9c0e97
VZ
71// ============================================================================
72// wxUxThemeEngine implementation
73// ============================================================================
0d1cb8cb 74
2d9c0e97
VZ
75wxUxThemeEngine *wxUxThemeEngine::ms_themeEngine = NULL;
76int wxUxThemeEngine::ms_isThemeEngineAvailable = -1; // unknown
0d1cb8cb 77
2d9c0e97 78wxUxThemeEngine* wxUxThemeEngine::Get()
0d1cb8cb 79{
2d9c0e97
VZ
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 )
0d1cb8cb 83 {
2d9c0e97
VZ
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 }
0d1cb8cb 99 }
0d1cb8cb 100
2d9c0e97 101 return ms_themeEngine;
0d1cb8cb
JS
102}
103
2d9c0e97 104bool wxUxThemeEngine::Initialize()
0d1cb8cb 105{
2a1f999f 106 if ( wxApp::GetComCtl32Version() < 600 )
07e90782
VZ
107 {
108 // not using theme-aware comctl32.dll anyhow, don't even try to use
109 // themes
110 return false;
111 }
27d2dbbc 112
7f9fe789
VZ
113 // we're prepared to handle the errors
114 wxLogNull noLog;
115
9a83f860 116 if ( !m_dllUxTheme.Load(wxT("uxtheme.dll")) )
2d9c0e97
VZ
117 return false;
118
119#define RESOLVE_UXTHEME_FUNCTION(type, funcname) \
9a83f860 120 funcname = (type)m_dllUxTheme.GetSymbol(wxT(#funcname)); \
2d9c0e97
VZ
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;
0d1cb8cb
JS
175}
176
2d9c0e97 177#endif // wxUSE_UXTHEME