1 /////////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/msw/uxtheme.cpp 
   3 // Purpose:     implements 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 // ============================================================================ 
  14 // ============================================================================ 
  16 // ---------------------------------------------------------------------------- 
  18 // ---------------------------------------------------------------------------- 
  20 // For compilers that support precompilation, includes "wx.h". 
  21 #include "wx/wxprec.h" 
  31     #include "wx/toplevel.h" 
  32     #include "wx/string.h" 
  34     #include "wx/module.h" 
  37 #include "wx/msw/uxtheme.h" 
  39 // ============================================================================ 
  41 // ============================================================================ 
  43 // this module is responsable for deleting the theme engine 
  44 class wxUxThemeModule 
: public wxModule
 
  47     virtual bool OnInit() { return true; } 
  50         if ( wxUxThemeEngine::ms_themeEngine 
) 
  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; 
  66     DECLARE_DYNAMIC_CLASS(wxUxThemeModule
) 
  69 IMPLEMENT_DYNAMIC_CLASS(wxUxThemeModule
, wxModule
) 
  71 // ============================================================================ 
  72 // wxUxThemeEngine implementation 
  73 // ============================================================================ 
  75 wxUxThemeEngine 
*wxUxThemeEngine::ms_themeEngine 
= NULL
; 
  76 int wxUxThemeEngine::ms_isThemeEngineAvailable 
= -1;        // unknown 
  78 wxUxThemeEngine
* wxUxThemeEngine::Get() 
  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 ) 
  84         // we're called or the first time, check if the themes are available 
  85         ms_themeEngine 
= new wxUxThemeEngine
; 
  86         if ( !ms_themeEngine
->Initialize() ) 
  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
; 
  93             ms_isThemeEngineAvailable 
= false; 
  95         else // initialized ok 
  97             ms_isThemeEngineAvailable 
= true; 
 101     return ms_themeEngine
; 
 104 bool wxUxThemeEngine::Initialize() 
 106     if ( wxApp::GetComCtl32Version() < 600 ) 
 108         // not using theme-aware comctl32.dll anyhow, don't even try to use 
 113     // we're prepared to handle the errors 
 116     if ( !m_dllUxTheme
.Load(_T("uxtheme.dll")) ) 
 119 #define RESOLVE_UXTHEME_FUNCTION(type, funcname)                              \ 
 120     funcname = (type)m_dllUxTheme.GetSymbol(_T(#funcname));                   \ 
 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
); 
 172 #undef RESOLVE_UXTHEME_FUNCTION 
 177 #endif // wxUSE_UXTHEME