1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: include/wx/msw/uxtheme.h
3 // Purpose: wxUxThemeEngine class: support for XP themes
4 // Author: John Platts, Vadim Zeitlin
8 // Copyright: (c) 2003 John Platts, Vadim Zeitlin
9 // License: wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
12 #ifndef _WX_UXTHEME_H_
13 #define _WX_UXTHEME_H_
15 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
16 #pragma interface "uxtheme.h"
21 #include "wx/msw/wrapwin.h"
22 #include "wx/msw/uxthemep.h"
24 typedef HTHEME (__stdcall
*PFNWXUOPENTHEMEDATA
)(HWND
, const wchar_t *);
25 typedef HRESULT (__stdcall
*PFNWXUCLOSETHEMEDATA
)(HTHEME
);
26 typedef HRESULT (__stdcall
*PFNWXUDRAWTHEMEBACKGROUND
)(HTHEME
, HDC
, int, int, const RECT
*, const RECT
*);
27 typedef HRESULT (__stdcall
*PFNWXUDRAWTHEMETEXT
)(HTHEME
, HDC
, int, int, const wchar_t *, int, DWORD
, DWORD
, const RECT
*);
28 typedef HRESULT (__stdcall
*PFNWXUGETTHEMEBACKGROUNDCONTENTRECT
)(HTHEME
, HDC
, int, int, const RECT
*, RECT
*);
29 typedef HRESULT (__stdcall
*PFNWXUGETTHEMEBACKGROUNDEXTENT
)(HTHEME
, HDC
, int, int, const RECT
*, RECT
*);
30 typedef HRESULT (__stdcall
*PFNWXUGETTHEMEPARTSIZE
)(HTHEME
, HDC
, int, int, const RECT
*, /* enum */ THEMESIZE
, SIZE
*);
31 typedef HRESULT (__stdcall
*PFNWXUGETTHEMETEXTEXTENT
)(HTHEME
, HDC
, int, int, const wchar_t *, int, DWORD
, const RECT
*, RECT
*);
32 typedef HRESULT (__stdcall
*PFNWXUGETTHEMETEXTMETRICS
)(HTHEME
, HDC
, int, int, TEXTMETRIC
*);
33 typedef HRESULT (__stdcall
*PFNWXUGETTHEMEBACKGROUNDREGION
)(HTHEME
, HDC
, int, int, const RECT
*, HRGN
*);
34 typedef HRESULT (__stdcall
*PFNWXUHITTESTTHEMEBACKGROUND
)(HTHEME
, HDC
, int, int, DWORD
, const RECT
*, HRGN
, POINT
, unsigned short *);
35 typedef HRESULT (__stdcall
*PFNWXUDRAWTHEMEEDGE
)(HTHEME
, HDC
, int, int, const RECT
*, unsigned int, unsigned int, RECT
*);
36 typedef HRESULT (__stdcall
*PFNWXUDRAWTHEMEICON
)(HTHEME
, HDC
, int, int, const RECT
*, HIMAGELIST
, int);
37 typedef BOOL (__stdcall
*PFNWXUISTHEMEPARTDEFINED
)(HTHEME
, int, int);
38 typedef BOOL (__stdcall
*PFNWXUISTHEMEBACKGROUNDPARTIALLYTRANSPARENT
)(HTHEME
, int, int);
39 typedef HRESULT (__stdcall
*PFNWXUGETTHEMECOLOR
)(HTHEME
, int, int, int, COLORREF
*);
40 typedef HRESULT (__stdcall
*PFNWXUGETTHEMEMETRIC
)(HTHEME
, HDC
, int, int, int, int *);
41 typedef HRESULT (__stdcall
*PFNWXUGETTHEMESTRING
)(HTHEME
, int, int, int, wchar_t *, int);
42 typedef HRESULT (__stdcall
*PFNWXUGETTHEMEBOOL
)(HTHEME
, int, int, int, BOOL
*);
43 typedef HRESULT (__stdcall
*PFNWXUGETTHEMEINT
)(HTHEME
, int, int, int, int *);
44 typedef HRESULT (__stdcall
*PFNWXUGETTHEMEENUMVALUE
)(HTHEME
, int, int, int, int *);
45 typedef HRESULT (__stdcall
*PFNWXUGETTHEMEPOSITION
)(HTHEME
, int, int, int, POINT
*);
46 typedef HRESULT (__stdcall
*PFNWXUGETTHEMEFONT
)(HTHEME
, HDC
, int, int, int, LOGFONT
*);
47 typedef HRESULT (__stdcall
*PFNWXUGETTHEMERECT
)(HTHEME
, int, int, int, RECT
*);
48 typedef HRESULT (__stdcall
*PFNWXUGETTHEMEMARGINS
)(HTHEME
, HDC
, int, int, int, RECT
*, MARGINS
*);
49 typedef HRESULT (__stdcall
*PFNWXUGETTHEMEINTLIST
)(HTHEME
, int, int, int, INTLIST
*);
50 typedef HRESULT (__stdcall
*PFNWXUGETTHEMEPROPERTYORIGIN
)(HTHEME
, int, int, int, /* enum */ PROPERTYORIGIN
*);
51 typedef HRESULT (__stdcall
*PFNWXUSETWINDOWTHEME
)(HWND
, const wchar_t*, const wchar_t *);
52 typedef HRESULT (__stdcall
*PFNWXUGETTHEMEFILENAME
)(HTHEME
, int, int, int, wchar_t *, int);
53 typedef COLORREF(__stdcall
*PFNWXUGETTHEMESYSCOLOR
)(HTHEME
, int);
54 typedef HBRUSH (__stdcall
*PFNWXUGETTHEMESYSCOLORBRUSH
)(HTHEME
, int);
55 typedef BOOL (__stdcall
*PFNWXUGETTHEMESYSBOOL
)(HTHEME
, int);
56 typedef int (__stdcall
*PFNWXUGETTHEMESYSSIZE
)(HTHEME
, int);
57 typedef HRESULT (__stdcall
*PFNWXUGETTHEMESYSFONT
)(HTHEME
, int, LOGFONT
*);
58 typedef HRESULT (__stdcall
*PFNWXUGETTHEMESYSSTRING
)(HTHEME
, int, wchar_t *, int);
59 typedef HRESULT (__stdcall
*PFNWXUGETTHEMESYSINT
)(HTHEME
, int, int *);
60 typedef BOOL (__stdcall
*PFNWXUISTHEMEACTIVE
)();
61 typedef BOOL (__stdcall
*PFNWXUISAPPTHEMED
)();
62 typedef HTHEME (__stdcall
*PFNWXUGETWINDOWTHEME
)(HWND
);
63 typedef HRESULT (__stdcall
*PFNWXUENABLETHEMEDIALOGTEXTURE
)(HWND
, DWORD
);
64 typedef BOOL (__stdcall
*PFNWXUISTHEMEDIALOGTEXTUREENABLED
)(HWND
);
65 typedef DWORD (__stdcall
*PFNWXUGETTHEMEAPPPROPERTIES
)();
66 typedef void (__stdcall
*PFNWXUSETTHEMEAPPPROPERTIES
)(DWORD
);
67 typedef HRESULT (__stdcall
*PFNWXUGETCURRENTTHEMENAME
)(wchar_t *, int, wchar_t *, int, wchar_t *, int);
68 typedef HRESULT (__stdcall
*PFNWXUGETTHEMEDOCUMENTATIONPROPERTY
)(const wchar_t *, const wchar_t *, wchar_t *, int);
69 typedef HRESULT (__stdcall
*PFNWXUDRAWTHEMEPARENTBACKGROUND
)(HWND
, HDC
, RECT
*);
70 typedef HRESULT (__stdcall
*PFNWXUENABLETHEMING
)(BOOL
);
72 // ----------------------------------------------------------------------------
73 // wxUxThemeEngine: provides all theme functions from uxtheme.dll
74 // ----------------------------------------------------------------------------
76 // we always define this class, even if wxUSE_UXTHEME == 0, but we just make it
77 // empty in this case -- this allows to use it elsewhere without any #ifdefs
79 #include "wx/dynload.h"
81 #define wxUX_THEME_DECLARE(type, func) type func;
83 #define wxUX_THEME_DECLARE(type, func) type func(...) { return 0; }
86 class WXDLLEXPORT wxUxThemeEngine
89 // get the theme engine or NULL if themes are not available
90 static wxUxThemeEngine
*Get();
92 // get the theme enging or NULL if themes are not available or not used for
94 static wxUxThemeEngine
*GetIfActive();
96 // all uxtheme.dll functions
97 wxUX_THEME_DECLARE(PFNWXUOPENTHEMEDATA
, OpenThemeData
)
98 wxUX_THEME_DECLARE(PFNWXUCLOSETHEMEDATA
, CloseThemeData
)
99 wxUX_THEME_DECLARE(PFNWXUDRAWTHEMEBACKGROUND
, DrawThemeBackground
)
100 wxUX_THEME_DECLARE(PFNWXUDRAWTHEMETEXT
, DrawThemeText
)
101 wxUX_THEME_DECLARE(PFNWXUGETTHEMEBACKGROUNDCONTENTRECT
, GetThemeBackgroundContentRect
)
102 wxUX_THEME_DECLARE(PFNWXUGETTHEMEBACKGROUNDEXTENT
, GetThemeBackgroundExtent
)
103 wxUX_THEME_DECLARE(PFNWXUGETTHEMEPARTSIZE
, GetThemePartSize
)
104 wxUX_THEME_DECLARE(PFNWXUGETTHEMETEXTEXTENT
, GetThemeTextExtent
)
105 wxUX_THEME_DECLARE(PFNWXUGETTHEMETEXTMETRICS
, GetThemeTextMetrics
)
106 wxUX_THEME_DECLARE(PFNWXUGETTHEMEBACKGROUNDREGION
, GetThemeBackgroundRegion
)
107 wxUX_THEME_DECLARE(PFNWXUHITTESTTHEMEBACKGROUND
, HitTestThemeBackground
)
108 wxUX_THEME_DECLARE(PFNWXUDRAWTHEMEEDGE
, DrawThemeEdge
)
109 wxUX_THEME_DECLARE(PFNWXUDRAWTHEMEICON
, DrawThemeIcon
)
110 wxUX_THEME_DECLARE(PFNWXUISTHEMEPARTDEFINED
, IsThemePartDefined
)
111 wxUX_THEME_DECLARE(PFNWXUISTHEMEBACKGROUNDPARTIALLYTRANSPARENT
, IsThemeBackgroundPartiallyTransparent
)
112 wxUX_THEME_DECLARE(PFNWXUGETTHEMECOLOR
, GetThemeColor
)
113 wxUX_THEME_DECLARE(PFNWXUGETTHEMEMETRIC
, GetThemeMetric
)
114 wxUX_THEME_DECLARE(PFNWXUGETTHEMESTRING
, GetThemeString
)
115 wxUX_THEME_DECLARE(PFNWXUGETTHEMEBOOL
, GetThemeBool
)
116 wxUX_THEME_DECLARE(PFNWXUGETTHEMEINT
, GetThemeInt
)
117 wxUX_THEME_DECLARE(PFNWXUGETTHEMEENUMVALUE
, GetThemeEnumValue
)
118 wxUX_THEME_DECLARE(PFNWXUGETTHEMEPOSITION
, GetThemePosition
)
119 wxUX_THEME_DECLARE(PFNWXUGETTHEMEFONT
, GetThemeFont
)
120 wxUX_THEME_DECLARE(PFNWXUGETTHEMERECT
, GetThemeRect
)
121 wxUX_THEME_DECLARE(PFNWXUGETTHEMEMARGINS
, GetThemeMargins
)
122 wxUX_THEME_DECLARE(PFNWXUGETTHEMEINTLIST
, GetThemeIntList
)
123 wxUX_THEME_DECLARE(PFNWXUGETTHEMEPROPERTYORIGIN
, GetThemePropertyOrigin
)
124 wxUX_THEME_DECLARE(PFNWXUSETWINDOWTHEME
, SetWindowTheme
)
125 wxUX_THEME_DECLARE(PFNWXUGETTHEMEFILENAME
, GetThemeFilename
)
126 wxUX_THEME_DECLARE(PFNWXUGETTHEMESYSCOLOR
, GetThemeSysColor
)
127 wxUX_THEME_DECLARE(PFNWXUGETTHEMESYSCOLORBRUSH
, GetThemeSysColorBrush
)
128 wxUX_THEME_DECLARE(PFNWXUGETTHEMESYSBOOL
, GetThemeSysBool
)
129 wxUX_THEME_DECLARE(PFNWXUGETTHEMESYSSIZE
, GetThemeSysSize
)
130 wxUX_THEME_DECLARE(PFNWXUGETTHEMESYSFONT
, GetThemeSysFont
)
131 wxUX_THEME_DECLARE(PFNWXUGETTHEMESYSSTRING
, GetThemeSysString
)
132 wxUX_THEME_DECLARE(PFNWXUGETTHEMESYSINT
, GetThemeSysInt
)
133 wxUX_THEME_DECLARE(PFNWXUISTHEMEACTIVE
, IsThemeActive
)
134 wxUX_THEME_DECLARE(PFNWXUISAPPTHEMED
, IsAppThemed
)
135 wxUX_THEME_DECLARE(PFNWXUGETWINDOWTHEME
, GetWindowTheme
)
136 wxUX_THEME_DECLARE(PFNWXUENABLETHEMEDIALOGTEXTURE
, EnableThemeDialogTexture
)
137 wxUX_THEME_DECLARE(PFNWXUISTHEMEDIALOGTEXTUREENABLED
, IsThemeDialogTextureEnabled
)
138 wxUX_THEME_DECLARE(PFNWXUGETTHEMEAPPPROPERTIES
, GetThemeAppProperties
)
139 wxUX_THEME_DECLARE(PFNWXUSETTHEMEAPPPROPERTIES
, SetThemeAppProperties
)
140 wxUX_THEME_DECLARE(PFNWXUGETCURRENTTHEMENAME
, GetCurrentThemeName
)
141 wxUX_THEME_DECLARE(PFNWXUGETTHEMEDOCUMENTATIONPROPERTY
, GetThemeDocumentationProperty
)
142 wxUX_THEME_DECLARE(PFNWXUDRAWTHEMEPARENTBACKGROUND
, DrawThemeParentBackground
)
143 wxUX_THEME_DECLARE(PFNWXUENABLETHEMING
, EnableTheming
)
146 // construcor is private as only Get() can create us and is also trivial as
147 // everything really happens in Initialize()
148 wxUxThemeEngine() { }
150 // destructor is private as only Get() and wxUxThemeModule delete us, it is
151 // not virtual as we're not supposed to be derived from
152 ~wxUxThemeEngine() { }
155 // initialize the theme engine: load the DLL, resolve the functions
157 // return true if we can be used, false if themes are not available
162 wxDynamicLibrary m_dllUxTheme
;
165 // the one and only theme engine, initially NULL
166 static wxUxThemeEngine
*ms_themeEngine
;
168 // this is a bool which initially has the value -1 meaning "unknown"
169 static int ms_isThemeEngineAvailable
;
171 // it must be able to delete us
172 friend class wxUxThemeModule
;
173 #endif // wxUSE_UXTHEME
175 DECLARE_NO_COPY_CLASS(wxUxThemeEngine
)
180 /* static */ inline wxUxThemeEngine
*wxUxThemeEngine::GetIfActive()
182 wxUxThemeEngine
*engine
= Get();
183 return engine
&& engine
->IsAppThemed() && engine
->IsThemeActive()
188 #else // !wxUSE_UXTHEME
190 /* static */ inline wxUxThemeEngine
*wxUxThemeEngine::Get()
195 /* static */ inline wxUxThemeEngine
*wxUxThemeEngine::GetIfActive()
200 #endif // wxUSE_UXTHEME/!wxUSE_UXTHEME
202 // ----------------------------------------------------------------------------
203 // wxUxThemeHandle: encapsulates ::Open/CloseThemeData()
204 // ----------------------------------------------------------------------------
206 class wxUxThemeHandle
209 wxUxThemeHandle(wxWindow
*win
, const wchar_t *classes
)
211 wxUxThemeEngine
*engine
= wxUxThemeEngine::Get();
214 engine
? (HTHEME
)engine
->OpenThemeData((HWND
) win
->GetHWND(), classes
)
218 operator HTHEME() const { return m_hTheme
; }
224 wxUxThemeEngine::Get()->CloseThemeData(m_hTheme
);
231 DECLARE_NO_COPY_CLASS(wxUxThemeHandle
)
234 #endif // _WX_UXTHEME_H_