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