X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0d1cb8cb298ae68754575cb65695ff9567a36899..438959cca892a7651634cc3a7aad4819ac49b23c:/include/wx/msw/uxtheme.h diff --git a/include/wx/msw/uxtheme.h b/include/wx/msw/uxtheme.h index 666202b678..934fbb2949 100644 --- a/include/wx/msw/uxtheme.h +++ b/include/wx/msw/uxtheme.h @@ -1,320 +1,298 @@ -/* - * wxuxthem.h : wxWindows support for Microsoft Windows XP Theme library - * (uxtheme.dll) - * Modified to work with almost all Win32 compilers - * Compiler must support Unicode, the __cdecl calling convention, and the - * __stdcall calling convention - */ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/uxtheme.h +// Purpose: wxUxThemeEngine class: support for XP themes +// Author: John Platts, Vadim Zeitlin +// Modified by: +// Created: 2003 +// RCS-ID: $Id$ +// Copyright: (c) 2003 John Platts, Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// #ifndef _WX_UXTHEME_H_ #define _WX_UXTHEME_H_ -// Use wxModule approach to initialization. -#define WXU_USE_WXMODULE 1 +#include "wx/defs.h" + +#include "wx/msw/private.h" // we use GetHwndOf() +#include "wx/msw/uxthemep.h" + +// Amazingly, GetThemeFont() and GetThemeSysFont() functions use LOGFONTA under +// XP but LOGFONTW (even in non-Unicode build) under later versions of Windows. +// If we declare them as taking LOGFONT below, the code would be able to +// silently pass LOGFONTA to them in ANSI build and would crash at run-time +// under Windows Vista/7 because of a buffer overrun (LOGFONTA being smaller +// than LOGFONTW expected by these functions). If we we declare them as taking +// LOGFONTW, the code wouldn't work correctly under XP. So we use a special +// wxUxThemeFont class to encapsulate this and intentionally change the LOGFONT +// output parameters of the theme functions to take it instead. + +class wxUxThemeFont +{ +public: + // Trivial default ctor. + wxUxThemeFont() { } + + // Just some unique type. + struct Ptr { }; #if wxUSE_UNICODE -typedef struct _WXUOSVERSIONINFOEXW { - WXDWORD dwOSVersionInfoSize; - WXDWORD dwMajorVersion; - WXDWORD dwMinorVersion; - WXDWORD dwBuildNumber; - WXDWORD dwPlatformId; - wchar_t szCSDVersion[ 128 ]; // Maintenance string for PSS usage - unsigned short wServicePackMajor; - unsigned short wServicePackMinor; - unsigned short wSuiteMask; - unsigned char wProductType; - unsigned char wReserved; -} WXUOSVERSIONINFOEXW, *PWXUOSVERSIONINFOEXW, *LPWXUOSVERSIONINFOEXW; -#define WXUOSVERSIONINFOEX WXUOSVERSIONINFOEXW -#define PWXUOSVERSIONINFOEX PWXUOSVERSIONINFOEXW -#define LPWXUOSVERSIONINFOEX LPWXUOSVERSIONINFOEXW + // In Unicode build we always use LOGFONT anyhow so this class is + // completely trivial. + Ptr *GetPtr() { return reinterpret_cast(&m_lfW); } + const LOGFONTW& GetLOGFONT() { return m_lfW; } +#else // !wxUSE_UNICODE + // Return either LOGFONTA or LOGFONTW pointer as required by the current + // Windows version. + Ptr *GetPtr() + { + return UseLOGFONTW() ? reinterpret_cast(&m_lfW) + : reinterpret_cast(&m_lfA); + } + + // This method returns LOGFONT (i.e. LOGFONTA in ANSI build and LOGFONTW in + // Unicode one) which can be used with other, normal, Windows or wx + // functions. Internally it may need to transform LOGFONTW to LOGFONTA. + const LOGFONTA& GetLOGFONT() + { + if ( UseLOGFONTW() ) + { + // Most of the fields are the same in LOGFONTA and LOGFONTW so just + // copy everything by default. + memcpy(&m_lfA, &m_lfW, sizeof(m_lfA)); + + // But the face name must be converted from Unicode. + WideCharToMultiByte(CP_ACP, 0, m_lfW.lfFaceName, -1, + m_lfA.lfFaceName, sizeof(m_lfA.lfFaceName), + NULL, NULL); + } + + return m_lfA; + } + +private: + static bool UseLOGFONTW() + { + return wxGetWinVersion() >= wxWinVersion_Vista; + } + + LOGFONTA m_lfA; +#endif // wxUSE_UNICODE/!wxUSE_UNICODE + +private: + LOGFONTW m_lfW; + + wxDECLARE_NO_COPY_CLASS(wxUxThemeFont); +}; + +typedef HTHEME (__stdcall *PFNWXUOPENTHEMEDATA)(HWND, const wchar_t *); +typedef HRESULT (__stdcall *PFNWXUCLOSETHEMEDATA)(HTHEME); +typedef HRESULT (__stdcall *PFNWXUDRAWTHEMEBACKGROUND)(HTHEME, HDC, int, int, const RECT *, const RECT *); +typedef HRESULT (__stdcall *PFNWXUDRAWTHEMETEXT)(HTHEME, HDC, int, int, const wchar_t *, int, DWORD, DWORD, const RECT *); +typedef HRESULT (__stdcall *PFNWXUGETTHEMEBACKGROUNDCONTENTRECT)(HTHEME, HDC, int, int, const RECT *, RECT *); +typedef HRESULT (__stdcall *PFNWXUGETTHEMEBACKGROUNDEXTENT)(HTHEME, HDC, int, int, const RECT *, RECT *); +typedef HRESULT (__stdcall *PFNWXUGETTHEMEPARTSIZE)(HTHEME, HDC, int, int, const RECT *, /* enum */ THEMESIZE, SIZE *); +typedef HRESULT (__stdcall *PFNWXUGETTHEMETEXTEXTENT)(HTHEME, HDC, int, int, const wchar_t *, int, DWORD, const RECT *, RECT *); +typedef HRESULT (__stdcall *PFNWXUGETTHEMETEXTMETRICS)(HTHEME, HDC, int, int, TEXTMETRIC*); +typedef HRESULT (__stdcall *PFNWXUGETTHEMEBACKGROUNDREGION)(HTHEME, HDC, int, int, const RECT *, HRGN *); +typedef HRESULT (__stdcall *PFNWXUHITTESTTHEMEBACKGROUND)(HTHEME, HDC, int, int, DWORD, const RECT *, HRGN, POINT, unsigned short *); +typedef HRESULT (__stdcall *PFNWXUDRAWTHEMEEDGE)(HTHEME, HDC, int, int, const RECT *, unsigned int, unsigned int, RECT *); +typedef HRESULT (__stdcall *PFNWXUDRAWTHEMEICON)(HTHEME, HDC, int, int, const RECT *, HIMAGELIST, int); +typedef BOOL (__stdcall *PFNWXUISTHEMEPARTDEFINED)(HTHEME, int, int); +typedef BOOL (__stdcall *PFNWXUISTHEMEBACKGROUNDPARTIALLYTRANSPARENT)(HTHEME, int, int); +typedef HRESULT (__stdcall *PFNWXUGETTHEMECOLOR)(HTHEME, int, int, int, COLORREF*); +typedef HRESULT (__stdcall *PFNWXUGETTHEMEMETRIC)(HTHEME, HDC, int, int, int, int *); +typedef HRESULT (__stdcall *PFNWXUGETTHEMESTRING)(HTHEME, int, int, int, wchar_t *, int); +typedef HRESULT (__stdcall *PFNWXUGETTHEMEBOOL)(HTHEME, int, int, int, BOOL *); +typedef HRESULT (__stdcall *PFNWXUGETTHEMEINT)(HTHEME, int, int, int, int *); +typedef HRESULT (__stdcall *PFNWXUGETTHEMEENUMVALUE)(HTHEME, int, int, int, int *); +typedef HRESULT (__stdcall *PFNWXUGETTHEMEPOSITION)(HTHEME, int, int, int, POINT *); +typedef HRESULT (__stdcall *PFNWXUGETTHEMEFONT)(HTHEME, HDC, int, int, int, wxUxThemeFont::Ptr *); +typedef HRESULT (__stdcall *PFNWXUGETTHEMERECT)(HTHEME, int, int, int, RECT *); +typedef HRESULT (__stdcall *PFNWXUGETTHEMEMARGINS)(HTHEME, HDC, int, int, int, RECT *, MARGINS *); +typedef HRESULT (__stdcall *PFNWXUGETTHEMEINTLIST)(HTHEME, int, int, int, INTLIST*); +typedef HRESULT (__stdcall *PFNWXUGETTHEMEPROPERTYORIGIN)(HTHEME, int, int, int, /* enum */ PROPERTYORIGIN *); +typedef HRESULT (__stdcall *PFNWXUSETWINDOWTHEME)(HWND, const wchar_t*, const wchar_t *); +typedef HRESULT (__stdcall *PFNWXUGETTHEMEFILENAME)(HTHEME, int, int, int, wchar_t *, int); +typedef COLORREF(__stdcall *PFNWXUGETTHEMESYSCOLOR)(HTHEME, int); +typedef HBRUSH (__stdcall *PFNWXUGETTHEMESYSCOLORBRUSH)(HTHEME, int); +typedef BOOL (__stdcall *PFNWXUGETTHEMESYSBOOL)(HTHEME, int); +typedef int (__stdcall *PFNWXUGETTHEMESYSSIZE)(HTHEME, int); +typedef HRESULT (__stdcall *PFNWXUGETTHEMESYSFONT)(HTHEME, int, wxUxThemeFont::Ptr *); +typedef HRESULT (__stdcall *PFNWXUGETTHEMESYSSTRING)(HTHEME, int, wchar_t *, int); +typedef HRESULT (__stdcall *PFNWXUGETTHEMESYSINT)(HTHEME, int, int *); +typedef BOOL (__stdcall *PFNWXUISTHEMEACTIVE)(); +typedef BOOL (__stdcall *PFNWXUISAPPTHEMED)(); +typedef HTHEME (__stdcall *PFNWXUGETWINDOWTHEME)(HWND); +typedef HRESULT (__stdcall *PFNWXUENABLETHEMEDIALOGTEXTURE)(HWND, DWORD); +typedef BOOL (__stdcall *PFNWXUISTHEMEDIALOGTEXTUREENABLED)(HWND); +typedef DWORD (__stdcall *PFNWXUGETTHEMEAPPPROPERTIES)(); +typedef void (__stdcall *PFNWXUSETTHEMEAPPPROPERTIES)(DWORD); +typedef HRESULT (__stdcall *PFNWXUGETCURRENTTHEMENAME)(wchar_t *, int, wchar_t *, int, wchar_t *, int); +typedef HRESULT (__stdcall *PFNWXUGETTHEMEDOCUMENTATIONPROPERTY)(const wchar_t *, const wchar_t *, wchar_t *, int); +typedef HRESULT (__stdcall *PFNWXUDRAWTHEMEPARENTBACKGROUND)(HWND, HDC, RECT *); +typedef HRESULT (__stdcall *PFNWXUENABLETHEMING)(BOOL); + +// ---------------------------------------------------------------------------- +// wxUxThemeEngine: provides all theme functions from uxtheme.dll +// ---------------------------------------------------------------------------- + +// we always define this class, even if wxUSE_UXTHEME == 0, but we just make it +// empty in this case -- this allows to use it elsewhere without any #ifdefs +#if wxUSE_UXTHEME + #include "wx/dynlib.h" + + #define wxUX_THEME_DECLARE(type, func) type func; #else -typedef struct _WXUOSVERSIONINFOEXA { - WXDWORD dwOSVersionInfoSize; - WXDWORD dwMajorVersion; - WXDWORD dwMinorVersion; - WXDWORD dwBuildNumber; - WXDWORD dwPlatformId; - char szCSDVersion [128]; // Maintenance string for PSS usage - unsigned short wServicePackMajor; - unsigned short wServicePackMinor; - unsigned short wSuiteMask; - unsigned char wProductType; - unsigned char wReserved; -} WXUOSVERSIONINFOEXA, *PWXUOSVERSIONINFOEXA, *LPWXUOSVERSIONINFOEXA; -#define WXUOSVERSIONINFOEX WXUOSVERSIONINFOEXA -#define PWXUOSVERSIONINFOEX PWXUOSVERSIONINFOEXA -#define LPWXUOSVERSIONINFOEX LPWXUOSVERSIONINFOEXA + #define wxUX_THEME_DECLARE(type, func) type func(...) { return 0; } #endif -typedef int WXUBOOL ; - -typedef struct tagWXURECT -{ - long left; - long top; - long right; - long bottom; -} WXURECT ; - -typedef void* WXHTHEME; -typedef long WXUHRESULT; -typedef WXHTHEME (__stdcall *PFNWXUOPENTHEMEDATA)(WXHWND, const wchar_t *) ; -typedef WXUHRESULT (__stdcall *PFNWXUCLOSETHEMEDATA)(WXHTHEME) ; -typedef WXUHRESULT (__stdcall *PFNWXUDRAWTHEMEBACKGROUND)(WXHTHEME, WXHDC, - int, int, const WXURECT *, const WXURECT *) ; -#define WXU_DTT_GRAYED 0x1 -typedef WXUHRESULT (__stdcall *PFNWXUDRAWTHEMETEXT)(WXHTHEME, WXHDC, int, - int, const wchar_t *, int, DWORD, - DWORD, const WXURECT *) ; -typedef WXUHRESULT (__stdcall *PFNWXUGETTHEMEBACKGROUNDCONTENTRECT)(WXHTHEME, WXHDC, - int, int, const WXURECT *, WXURECT *) ; -typedef WXUHRESULT (__stdcall *PFNWXUGETTHEMEBACKGROUNDEXTENT)(WXHTHEME, WXHDC, int, int, - const WXURECT *, WXURECT *) ; - -typedef enum WXUTHEMESIZE +class WXDLLIMPEXP_CORE wxUxThemeEngine { - WXU_TS_MIN, // minimum size - WXU_TS_TRUE, // size without stretching - WXU_TS_DRAW, // size that theme mgr will use to draw part +public: + // get the theme engine or NULL if themes are not available + static wxUxThemeEngine *Get(); + + // get the theme enging or NULL if themes are not available or not used for + // this application + static wxUxThemeEngine *GetIfActive(); + + // all uxtheme.dll functions + wxUX_THEME_DECLARE(PFNWXUOPENTHEMEDATA, OpenThemeData) + wxUX_THEME_DECLARE(PFNWXUCLOSETHEMEDATA, CloseThemeData) + wxUX_THEME_DECLARE(PFNWXUDRAWTHEMEBACKGROUND, DrawThemeBackground) + wxUX_THEME_DECLARE(PFNWXUDRAWTHEMETEXT, DrawThemeText) + wxUX_THEME_DECLARE(PFNWXUGETTHEMEBACKGROUNDCONTENTRECT, GetThemeBackgroundContentRect) + wxUX_THEME_DECLARE(PFNWXUGETTHEMEBACKGROUNDEXTENT, GetThemeBackgroundExtent) + wxUX_THEME_DECLARE(PFNWXUGETTHEMEPARTSIZE, GetThemePartSize) + wxUX_THEME_DECLARE(PFNWXUGETTHEMETEXTEXTENT, GetThemeTextExtent) + wxUX_THEME_DECLARE(PFNWXUGETTHEMETEXTMETRICS, GetThemeTextMetrics) + wxUX_THEME_DECLARE(PFNWXUGETTHEMEBACKGROUNDREGION, GetThemeBackgroundRegion) + wxUX_THEME_DECLARE(PFNWXUHITTESTTHEMEBACKGROUND, HitTestThemeBackground) + wxUX_THEME_DECLARE(PFNWXUDRAWTHEMEEDGE, DrawThemeEdge) + wxUX_THEME_DECLARE(PFNWXUDRAWTHEMEICON, DrawThemeIcon) + wxUX_THEME_DECLARE(PFNWXUISTHEMEPARTDEFINED, IsThemePartDefined) + wxUX_THEME_DECLARE(PFNWXUISTHEMEBACKGROUNDPARTIALLYTRANSPARENT, IsThemeBackgroundPartiallyTransparent) + wxUX_THEME_DECLARE(PFNWXUGETTHEMECOLOR, GetThemeColor) + wxUX_THEME_DECLARE(PFNWXUGETTHEMEMETRIC, GetThemeMetric) + wxUX_THEME_DECLARE(PFNWXUGETTHEMESTRING, GetThemeString) + wxUX_THEME_DECLARE(PFNWXUGETTHEMEBOOL, GetThemeBool) + wxUX_THEME_DECLARE(PFNWXUGETTHEMEINT, GetThemeInt) + wxUX_THEME_DECLARE(PFNWXUGETTHEMEENUMVALUE, GetThemeEnumValue) + wxUX_THEME_DECLARE(PFNWXUGETTHEMEPOSITION, GetThemePosition) + wxUX_THEME_DECLARE(PFNWXUGETTHEMEFONT, GetThemeFont) + wxUX_THEME_DECLARE(PFNWXUGETTHEMERECT, GetThemeRect) + wxUX_THEME_DECLARE(PFNWXUGETTHEMEMARGINS, GetThemeMargins) + wxUX_THEME_DECLARE(PFNWXUGETTHEMEINTLIST, GetThemeIntList) + wxUX_THEME_DECLARE(PFNWXUGETTHEMEPROPERTYORIGIN, GetThemePropertyOrigin) + wxUX_THEME_DECLARE(PFNWXUSETWINDOWTHEME, SetWindowTheme) + wxUX_THEME_DECLARE(PFNWXUGETTHEMEFILENAME, GetThemeFilename) + wxUX_THEME_DECLARE(PFNWXUGETTHEMESYSCOLOR, GetThemeSysColor) + wxUX_THEME_DECLARE(PFNWXUGETTHEMESYSCOLORBRUSH, GetThemeSysColorBrush) + wxUX_THEME_DECLARE(PFNWXUGETTHEMESYSBOOL, GetThemeSysBool) + wxUX_THEME_DECLARE(PFNWXUGETTHEMESYSSIZE, GetThemeSysSize) + wxUX_THEME_DECLARE(PFNWXUGETTHEMESYSFONT, GetThemeSysFont) + wxUX_THEME_DECLARE(PFNWXUGETTHEMESYSSTRING, GetThemeSysString) + wxUX_THEME_DECLARE(PFNWXUGETTHEMESYSINT, GetThemeSysInt) + wxUX_THEME_DECLARE(PFNWXUISTHEMEACTIVE, IsThemeActive) + wxUX_THEME_DECLARE(PFNWXUISAPPTHEMED, IsAppThemed) + wxUX_THEME_DECLARE(PFNWXUGETWINDOWTHEME, GetWindowTheme) + wxUX_THEME_DECLARE(PFNWXUENABLETHEMEDIALOGTEXTURE, EnableThemeDialogTexture) + wxUX_THEME_DECLARE(PFNWXUISTHEMEDIALOGTEXTUREENABLED, IsThemeDialogTextureEnabled) + wxUX_THEME_DECLARE(PFNWXUGETTHEMEAPPPROPERTIES, GetThemeAppProperties) + wxUX_THEME_DECLARE(PFNWXUSETTHEMEAPPPROPERTIES, SetThemeAppProperties) + wxUX_THEME_DECLARE(PFNWXUGETCURRENTTHEMENAME, GetCurrentThemeName) + wxUX_THEME_DECLARE(PFNWXUGETTHEMEDOCUMENTATIONPROPERTY, GetThemeDocumentationProperty) + wxUX_THEME_DECLARE(PFNWXUDRAWTHEMEPARENTBACKGROUND, DrawThemeParentBackground) + wxUX_THEME_DECLARE(PFNWXUENABLETHEMING, EnableTheming) + +private: + // construcor is private as only Get() can create us and is also trivial as + // everything really happens in Initialize() + wxUxThemeEngine() { } + + // destructor is private as only Get() and wxUxThemeModule delete us, it is + // not virtual as we're not supposed to be derived from + ~wxUxThemeEngine() { } + +#if wxUSE_UXTHEME + // initialize the theme engine: load the DLL, resolve the functions + // + // return true if we can be used, false if themes are not available + bool Initialize(); + + + // uxtheme.dll + wxDynamicLibrary m_dllUxTheme; + + + // the one and only theme engine, initially NULL + static wxUxThemeEngine *ms_themeEngine; + + // this is a bool which initially has the value -1 meaning "unknown" + static int ms_isThemeEngineAvailable; + + // it must be able to delete us + friend class wxUxThemeModule; +#endif // wxUSE_UXTHEME + + wxDECLARE_NO_COPY_CLASS(wxUxThemeEngine); }; -typedef struct tagWXUSIZE -{ - long cx; - long cy; -} WXUSIZE ; +#if wxUSE_UXTHEME -typedef struct tagWXUTEXTMETRIC -{ - long tmHeight; - long tmAscent; - long tmDescent; - long tmInternalLeading; - long tmExternalLeading; - long tmAveCharWidth; - long tmMaxCharWidth; - long tmWeight; - long tmOverhang; - long tmDigitizedAspectX; - long tmDigitizedAspectY; - wchar_t tmFirstChar; - wchar_t tmLastChar; - wchar_t tmDefaultChar; - wchar_t tmBreakChar; - unsigned char tmItalic; - unsigned char tmUnderlined; - unsigned char tmStruckOut; - unsigned char tmPitchAndFamily; - unsigned char tmCharSet; -} WXUTEXTMETRIC; - -typedef WXUHRESULT (__stdcall *PFNWXUGETTHEMEPARTSIZE)(WXHTHEME, WXHDC, int, int, const WXURECT *, - enum WXUTHEMESIZE, WXUSIZE *) ; -typedef WXUHRESULT (__stdcall *PFNWXUGETTHEMETEXTEXTENT)(WXHTHEME, WXHDC, int, int, const wchar_t *, - int, WXDWORD, const WXURECT *, WXURECT *) ; -typedef WXUHRESULT (__stdcall *PFNWXUGETTHEMETEXTMETRICS)(WXHTHEME, WXHDC, - int, int, WXUTEXTMETRIC*); -typedef WXUHRESULT (__stdcall *PFNWXUGETTHEMEBACKGROUNDREGION)(WXHTHEME, WXHDC, - int, int, const WXURECT *, WXHRGN *) ; - -#define WXU_HTTB_BACKGROUNDSEG 0x0000 -#define WXU_HTTB_FIXEDBORDER 0x0002 -#define WXU_HTTB_CAPTION 0x0004 -#define WXU_HTTB_RESIZINGBORDER_LEFT 0x0010 -#define WXU_HTTB_RESIZINGBORDER_TOP 0x0020 -#define WXU_HTTB_RESIZINGBORDER_RIGHT 0x0040 -#define WXU_HTTB_RESIZINGBORDER_BOTTOM 0x0080 -#define WXU_HTTB_RESIZINGBORDER 0x00F0 -#define WXU_HTTB_SIZINGTEMPLATE 0x0100 -#define WXU_HTTB_SYSTEMSIZINGMARGINS 0x0200 - -typedef struct tagWXUPOINT -{ - long x; - long y; -} WXUPOINT ; - -typedef WXUHRESULT (__stdcall *PFNWXUHITTESTTHEMEBACKGROUND)(WXHTHEME, WXHDC, int, - int, WXDWORD, const WXURECT *, WXHRGN, - WXUPOINT, unsigned short *) ; -typedef WXUHRESULT (__stdcall *PFNWXUDRAWTHEMEEDGE)(WXHTHEME, WXHDC, int, int, - const WXURECT *, unsigned int, unsigned int, WXURECT *); -typedef WXUHRESULT (__stdcall *PFNWXUDRAWTHEMEICON)(WXHTHEME, WXHDC, int, int, - const WXURECT *, WXHIMAGELIST, int) ; -typedef WXUBOOL (__stdcall *PFNWXUISTHEMEPARTDEFINED)(WXHTHEME, int, int) ; -typedef WXUBOOL (__stdcall *PFNWXUISTHEMEBACKGROUNDPARTIALLYTRANSPARENT)(WXHTHEME, int, int) ; -typedef WXUHRESULT (__stdcall *PFNWXUGETTHEMECOLOR)(WXHTHEME, int, int, int, WXCOLORREF) ; -typedef WXUHRESULT (__stdcall *PFNWXUGETTHEMEMETRIC)(WXHTHEME, WXHDC, int, - int, int, int *) ; -typedef WXUHRESULT (__stdcall *PFNWXUGETTHEMESTRING)(WXHTHEME, int, - int, int, wchar_t *, int) ; -typedef WXUHRESULT (__stdcall *PFNWXUGETTHEMEBOOL)(WXHTHEME, int, int, int, WXUBOOL *) ; -typedef WXUHRESULT (__stdcall *PFNWXUGETTHEMEINT)(WXHTHEME, int, int, int, int *) ; -typedef WXUHRESULT (__stdcall *PFNWXUGETTHEMEENUMVALUE)(WXHTHEME, int, int, int, int *) ; -typedef WXUHRESULT (__stdcall *PFNWXUGETTHEMEPOSITION)(WXHTHEME, int, int, int, WXUPOINT *) ; -typedef struct tagWXULOGFONT -{ - long lfHeight; - long lfWidth; - long lfEscapement; - long lfOrientation; - long lfWeight; - unsigned char lfItalic; - unsigned char lfUnderline; - unsigned char lfStrikeOut; - unsigned char lfCharSet; - unsigned char lfOutPrecision; - unsigned char lfClipPrecision; - unsigned char lfQuality; - unsigned char lfPitchAndFamily; - wchar_t lfFaceName[32]; -} WXULOGFONT ; -typedef WXUHRESULT (__stdcall *PFNWXUGETTHEMEFONT)(WXHTHEME, WXHDC, int, int, int, WXULOGFONT *) ; -typedef WXUHRESULT (__stdcall *PFNWXUGETTHEMERECT)(WXHTHEME, int, int, int, WXURECT *) ; -typedef struct _WXUMARGINS +/* static */ inline wxUxThemeEngine *wxUxThemeEngine::GetIfActive() { - int cxLeftWidth; // width of left border that retains its size - int cxRightWidth; // width of right border that retains its size - int cyTopHeight; // height of top border that retains its size - int cyBottomHeight; // height of bottom border that retains its size -} WXUMARGINS, *PWXUMARGINS; -typedef WXUHRESULT (__stdcall *PFNWXUGETTHEMEMARGINS)(WXHTHEME, WXHDC, int, - int, int, WXURECT *, WXUMARGINS *) ; - -#define WXU_MAX_INTLIST_COUNT 10 -typedef struct _WXUINTLIST -{ - int iValueCount; // number of values in iValues - int iValues[WXU_MAX_INTLIST_COUNT]; -} WXUINTLIST, *PWXUINTLIST; -typedef WXUHRESULT (__stdcall *PFNWXUGETTHEMEINTLIST)(WXHTHEME, int, - int, int, WXUINTLIST*) ; -typedef enum WXUPROPERTYORIGIN + wxUxThemeEngine *engine = Get(); + return engine && engine->IsAppThemed() && engine->IsThemeActive() + ? engine + : NULL; +} + +#else // !wxUSE_UXTHEME + +/* static */ inline wxUxThemeEngine *wxUxThemeEngine::Get() { - WXU_PO_STATE, // property was found in the state section - WXU_PO_PART, // property was found in the part section - WXU_PO_CLASS, // property was found in the class section - WXU_PO_GLOBAL, // property was found in [globals] section - WXU_PO_NOTFOUND // property was not found -}; -typedef WXUHRESULT (__stdcall *PFNWXUGETTHEMEPROPERTYORIGIN)(WXHTHEME, int, - int, int, enum WXUPROPERTYORIGIN *) ; -typedef WXUHRESULT (__stdcall *PFNWXUSETWINDOWTHEME)(WXHWND, const wchar_t*, const wchar_t *) ; -typedef WXUHRESULT (__stdcall *PFNWXUGETTHEMEFILENAME)(WXHTHEME, int, int, int, wchar_t *, int) ; -typedef WXCOLORREF (__stdcall *PFNWXUGETTHEMESYSCOLOR)(WXHTHEME, int) ; -typedef WXHBRUSH (__stdcall *PFNWXUGETTHEMESYSCOLORBRUSH)(WXHTHEME, int) ; -typedef WXUBOOL (__stdcall *PFNWXUGETTHEMESYSBOOL)(WXHTHEME, int) ; -typedef int (__stdcall *PFNWXUGETTHEMESYSSIZE)(WXHTHEME, int) ; -typedef WXUHRESULT (__stdcall *PFNWXUGETTHEMESYSFONT)(WXHTHEME, int, WXULOGFONT *) ; -typedef WXUHRESULT (__stdcall *PFNWXUGETTHEMESYSSTRING)(WXHTHEME, int, wchar_t *, int) ; -typedef WXUHRESULT (__stdcall *PFNWXUGETTHEMESYSINT)(WXHTHEME, int, int *) ; -typedef WXUBOOL (__stdcall *PFNWXUISTHEMEACTIVE)() ; -typedef WXUBOOL (__stdcall *PFNWXUISAPPTHEMED)() ; -typedef WXHTHEME (__stdcall *PFNWXUGETWINDOWTHEME)(WXHWND) ; - -#define WXU_ETDT_DISABLE 0x00000001 -#define WXU_ETDT_ENABLE 0x00000002 -#define WXU_ETDT_USETABTEXTURE 0x00000004 -#define WXU_ETDT_ENABLETAB 0x00000006 - -typedef WXUHRESULT (__stdcall *PFNWXUENABLETHEMEDIALOGTEXTURE)(WXHWND, WXDWORD) ; -typedef WXUBOOL (__stdcall *PFNWXUISTHEMEDIALOGTEXTUREENABLED)(WXHWND) ; - -#define WXU_STAP_ALLOW_NONCLIENT 1 -#define WXU_STAP_ALLOW_CONTROLS 2 -#define WXU_STAP_ALLOW_WEBCONTENT 4 - -typedef WXDWORD (__stdcall *PFNWXUGETTHEMEAPPPROPERTIES)() ; -typedef void (__stdcall *PFNWXUSETTHEMEAPPPROPERTIES)(WXDWORD) ; -typedef WXUHRESULT (__stdcall *PFNWXUGETCURRENTTHEMENAME)(wchar_t *, int, - wchar_t *, int, wchar_t *, int) ; - -#define WXU_SZ_THDOCPROP_DISPLAYNAME L"DisplayName" -#define WXU_SZ_THDOCPROP_CANONICALNAME L"ThemeName" -#define WXU_SZ_THDOCPROP_TOOLTIP L"ToolTip" -#define WXU_SZ_THDOCPROP_AUTHOR L"author" - -typedef WXUHRESULT (__stdcall *PFNWXUGETTHEMEDOCUMENTATIONPROPERTY)(const wchar_t *, - const wchar_t *, wchar_t *, int) ; -typedef WXUHRESULT (__stdcall *PFNWXUDRAWTHEMEPARENTBACKGROUND)(WXHWND, WXHDC, WXURECT *) ; -typedef WXUHRESULT (__stdcall *PFNWXUENABLETHEMING)(WXUBOOL) ; - -class wxUxThemeEngine + return NULL; +} + +/* static */ inline wxUxThemeEngine *wxUxThemeEngine::GetIfActive() { -private: - wxUxThemeEngine() ; + return NULL; +} -public: - ~wxUxThemeEngine() ; - bool IsInitialized() const { return m_bIsInitialized ; } +#endif // wxUSE_UXTHEME/!wxUSE_UXTHEME -private: - bool m_bIsInitialized ; - HINSTANCE m_hInstUXThemeDLL ; +// ---------------------------------------------------------------------------- +// wxUxThemeHandle: encapsulates ::Open/CloseThemeData() +// ---------------------------------------------------------------------------- +class wxUxThemeHandle +{ public: - static wxUxThemeEngine* wxInitUxThemeEngine() ; -protected: - void ResetFunctionPointers() ; -public: - PFNWXUOPENTHEMEDATA m_pfnOpenThemeData ; - PFNWXUCLOSETHEMEDATA m_pfnCloseThemeData ; - PFNWXUDRAWTHEMEBACKGROUND m_pfnDrawThemeBackground ; - PFNWXUDRAWTHEMETEXT m_pfnDrawThemeText ; - PFNWXUGETTHEMEBACKGROUNDCONTENTRECT m_pfnGetThemeBackgroundContentRect ; - PFNWXUGETTHEMEBACKGROUNDEXTENT m_pfnGetThemeBackgroundExtent ; - PFNWXUGETTHEMEPARTSIZE m_pfnGetThemePartSize ; - PFNWXUGETTHEMETEXTEXTENT m_pfnGetThemeTextExtent ; - PFNWXUGETTHEMETEXTMETRICS m_pfnGetThemeTextMetrics ; - PFNWXUGETTHEMEBACKGROUNDREGION m_pfnGetThemeBackgroundRegion ; - PFNWXUHITTESTTHEMEBACKGROUND m_pfnHitTestThemeBackground ; - PFNWXUDRAWTHEMEEDGE m_pfnDrawThemeEdge ; - PFNWXUDRAWTHEMEICON m_pfnDrawThemeIcon ; - PFNWXUISTHEMEPARTDEFINED m_pfnIsThemePartDefined ; - PFNWXUISTHEMEBACKGROUNDPARTIALLYTRANSPARENT m_pfnIsThemeBackgroundPartiallyTransparent ; - PFNWXUGETTHEMECOLOR m_pfnGetThemeColor ; - PFNWXUGETTHEMEMETRIC m_pfnGetThemeMetric ; - PFNWXUGETTHEMESTRING m_pfnGetThemeString ; - PFNWXUGETTHEMEBOOL m_pfnGetThemeBool ; - PFNWXUGETTHEMEINT m_pfnGetThemeInt ; - PFNWXUGETTHEMEENUMVALUE m_pfnGetThemeEnumValue ; - PFNWXUGETTHEMEPOSITION m_pfnGetThemePosition ; - PFNWXUGETTHEMEFONT m_pfnGetThemeFont ; - PFNWXUGETTHEMERECT m_pfnGetThemeRect ; - PFNWXUGETTHEMEMARGINS m_pfnGetThemeMargins ; - PFNWXUGETTHEMEINTLIST m_pfnGetThemeIntList ; - PFNWXUGETTHEMEPROPERTYORIGIN m_pfnGetThemePropertyOrigin ; - PFNWXUSETWINDOWTHEME m_pfnSetWindowTheme ; - PFNWXUGETTHEMEFILENAME m_pfnGetThemeFilename ; - PFNWXUGETTHEMESYSCOLOR m_pfnGetThemeSysColor ; - PFNWXUGETTHEMESYSCOLORBRUSH m_pfnGetThemeSysColorBrush ; - PFNWXUGETTHEMESYSBOOL m_pfnGetThemeSysBool ; - PFNWXUGETTHEMESYSSIZE m_pfnGetThemeSysSize ; - PFNWXUGETTHEMESYSFONT m_pfnGetThemeSysFont ; - PFNWXUGETTHEMESYSSTRING m_pfnGetThemeSysString ; - PFNWXUGETTHEMESYSINT m_pfnGetThemeSysInt ; - PFNWXUISTHEMEACTIVE m_pfnIsThemeActive ; - PFNWXUISAPPTHEMED m_pfnIsAppThemed ; - PFNWXUGETWINDOWTHEME m_pfnGetWindowTheme ; - PFNWXUENABLETHEMEDIALOGTEXTURE m_pfnEnableThemeDialogTexture ; - PFNWXUISTHEMEDIALOGTEXTUREENABLED m_pfnIsThemeDialogTextureEnabled ; - PFNWXUGETTHEMEAPPPROPERTIES m_pfnGetThemeAppProperties ; - PFNWXUSETTHEMEAPPPROPERTIES m_pfnSetThemeAppProperties ; - PFNWXUGETCURRENTTHEMENAME m_pfnGetCurrentThemeName ; - PFNWXUGETTHEMEDOCUMENTATIONPROPERTY m_pfnGetThemeDocumentationProperty ; - PFNWXUDRAWTHEMEPARENTBACKGROUND m_pfnDrawThemeParentBackground ; - PFNWXUENABLETHEMING m_pfnEnableTheming ; -}; + wxUxThemeHandle(const wxWindow *win, const wchar_t *classes) + { + wxUxThemeEngine *engine = wxUxThemeEngine::Get(); -extern wxUxThemeEngine* g_pThemeEngine ; + m_hTheme = engine ? (HTHEME)engine->OpenThemeData(GetHwndOf(win), classes) + : NULL; + } -BOOL wxCanUseInitThemeEngine() ; + operator HTHEME() const { return m_hTheme; } -#if !defined(WXU_USE_WXMODULE) -BOOL wxUxInitThemeEngine() ; -#endif + ~wxUxThemeHandle() + { + if ( m_hTheme ) + { + wxUxThemeEngine::Get()->CloseThemeData(m_hTheme); + } + } -#endif +private: + HTHEME m_hTheme; + + wxDECLARE_NO_COPY_CLASS(wxUxThemeHandle); +}; + +#endif // _WX_UXTHEME_H_