You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1118 lines
51 KiB
C

2 years ago
// XTPWinThemeWrapper.h: interface for the CXTPWinThemeWrapper class.
//
// This file is a part of the XTREME TOOLKIT PRO MFC class library.
// (c)1998-2012 Codejock Software, All Rights Reserved.
//
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
// CONSENT OF CODEJOCK SOFTWARE.
//
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
// SINGLE COMPUTER.
//
// CONTACT INFORMATION:
// support@codejock.com
// http://www.codejock.com
//
/////////////////////////////////////////////////////////////////////////////
//{{AFX_CODEJOCK_PRIVATE
#if !defined(__XTPWINTHEMEWRAPPER_H__)
#define __XTPWINTHEMEWRAPPER_H__
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "Uxtheme.h"
#include "SchemaDef.h"
#include "Tmschema.h"
BEGIN_TM_CLASS_PARTS(XTP_MENU)
TM_PART(1, XTP_MP, MENUITEM)
TM_PART(2, XTP_MP, MENUDROPDOWN)
TM_PART(3, XTP_MP, MENUBARITEM)
TM_PART(4, XTP_MP, MENUBARDROPDOWN)
TM_PART(5, XTP_MP, CHEVRON)
TM_PART(6, XTP_MP, SEPARATOR)
TM_PART(7, XTP_MP, BARBACKGROUND)
TM_PART(8, XTP_MP, BARITEM)
TM_PART(9, XTP_MP, POPUPBACKGROUND)
TM_PART(10, XTP_MP, POPUPBORDERS)
TM_PART(11, XTP_MP, POPUPCHECK)
TM_PART(12, XTP_MP, POPUPCHECKBACKGROUND)
TM_PART(13, XTP_MP, POPUPGUTTER)
TM_PART(14, XTP_MP, POPUPITEM)
TM_PART(15, XTP_MP, POPUPSEPARATOR)
TM_PART(16, XTP_MP, POPUPSUBMENU)
TM_PART(17, XTP_MP, SYSTEMCLOSE)
TM_PART(18, XTP_MP, SYSTEMMAXIMIZE)
TM_PART(19, XTP_MP, SYSTEMMINIMIZE)
TM_PART(20, XTP_MP, SYSTEMRESTORE)
END_TM_CLASS_PARTS()
typedef HANDLE HPAINTBUFFER;
// BP_BUFFERFORMAT
enum XTP_UX_BUFFERFORMAT
{
XTP_BPBF_COMPATIBLEBITMAP, // Compatible bitmap
XTP_BPBF_DIB, // Device-independent bitmap
XTP_BPBF_TOPDOWNDIB, // Top-down device-independent bitmap
XTP_BPBF_TOPDOWNMONODIB // Top-down monochrome device-independent bitmap
};
// BP_PAINTPARAMS
struct XTP_UX_PAINTPARAMS
{
DWORD cbSize;
DWORD dwFlags; // BPPF_ flags
const RECT * prcExclude;
const BLENDFUNCTION * pBlendFunction;
};
struct XTP_UX_DTTOPTS
{
DWORD dwSize; // size of the struct
DWORD dwFlags; // which options have been specified
COLORREF crText; // color to use for text fill
COLORREF crBorder; // color to use for text outline
COLORREF crShadow; // color to use for text shadow
int iTextShadowType; // TST_SINGLE or TST_CONTINUOUS
POINT ptShadowOffset; // where shadow is drawn (relative to text)
int iBorderSize; // Border radius around text
int iFontPropId; // Font property to use for the text instead of TMT_FONT
int iColorPropId; // Color property to use for the text instead of TMT_TEXTCOLOR
int iStateId; // Alternate state id
BOOL fApplyOverlay; // Overlay text on top of any text effect?
int iGlowSize; // Glow radius around text
VOID* pfnDrawTextCallback; // Callback for DrawText
LPARAM lParam; // Parameter for callback
};
struct _DTBGOPTS;
typedef _DTBGOPTS* PDTBGOPTS;
#define TYPEDEF_WRAPPER_POINTER(val, type, proc)\
const int xtpWrapper##proc = val;\
const LPCSTR xtpWrapperProc##proc = #proc;\
typedef type (__stdcall* PFN##proc)
TYPEDEF_WRAPPER_POINTER(0, HRESULT, DrawThemeBackground)(HTHEME, HDC, int, int, const RECT*, const RECT*);
TYPEDEF_WRAPPER_POINTER(1, HRESULT, CloseThemeData)(HTHEME);
TYPEDEF_WRAPPER_POINTER(2, HRESULT, SetWindowTheme)(HWND, LPCWSTR, LPCWSTR);
TYPEDEF_WRAPPER_POINTER(3, void, SetThemeAppProperties)(DWORD);
TYPEDEF_WRAPPER_POINTER(4, HTHEME, OpenThemeData)(HWND, LPCWSTR);
TYPEDEF_WRAPPER_POINTER(5, BOOL, IsThemePartDefined)(HTHEME, int, int);
TYPEDEF_WRAPPER_POINTER(6, BOOL, IsThemeDialogTextureEnabled)(HWND hWnd);
TYPEDEF_WRAPPER_POINTER(7, BOOL, IsThemeBackgroundPartiallyTransparent)(HTHEME, int, int);
TYPEDEF_WRAPPER_POINTER(8, BOOL, IsThemeActive)();
TYPEDEF_WRAPPER_POINTER(9, BOOL, IsAppThemed)();
TYPEDEF_WRAPPER_POINTER(10, HRESULT, HitTestThemeBackground)(HTHEME, HDC, int, int, DWORD, const RECT*, HRGN, POINT, WORD*);
TYPEDEF_WRAPPER_POINTER(11, HTHEME, GetWindowTheme)(HWND);
TYPEDEF_WRAPPER_POINTER(12, HRESULT, GetThemeSysString)(HTHEME, int, LPWSTR, int);
TYPEDEF_WRAPPER_POINTER(13, HRESULT, GetThemeTextMetrics)(HTHEME, HDC, int, int, TEXTMETRIC*);
TYPEDEF_WRAPPER_POINTER(14, HRESULT, GetThemeTextExtent)(HTHEME, HDC, int, int, LPCWSTR, int, DWORD, const RECT*, RECT*);
TYPEDEF_WRAPPER_POINTER(15, int, GetThemeSysSize)(HTHEME, int);
TYPEDEF_WRAPPER_POINTER(16, HRESULT, GetThemeSysInt)(HTHEME, int, int*);
TYPEDEF_WRAPPER_POINTER(17, HRESULT, GetThemeSysFont)(HTHEME, int, LOGFONT*);
TYPEDEF_WRAPPER_POINTER(18, HBRUSH, GetThemeSysColorBrush)(HTHEME, int);
TYPEDEF_WRAPPER_POINTER(19, COLORREF, GetThemeSysColor)(HTHEME, int);
TYPEDEF_WRAPPER_POINTER(20, BOOL, GetThemeSysBool)(HTHEME, int);
TYPEDEF_WRAPPER_POINTER(21, HRESULT, GetThemeString)(HTHEME, int, int, int, LPWSTR, int);
TYPEDEF_WRAPPER_POINTER(22, HRESULT, GetThemeRect)(HTHEME, int, int, int, RECT*);
TYPEDEF_WRAPPER_POINTER(23, HRESULT, GetThemePropertyOrigin)(HTHEME, int, int, int, PROPERTYORIGIN*);
TYPEDEF_WRAPPER_POINTER(24, HRESULT, GetThemePosition)(HTHEME, int, int, int, POINT*);
TYPEDEF_WRAPPER_POINTER(25, HRESULT, GetThemePartSize)(HTHEME, HDC, int, int, RECT*, THEMESIZE, SIZE*);
TYPEDEF_WRAPPER_POINTER(26, HRESULT, GetThemeMetric)(HTHEME, HDC, int, int, int, int*);
TYPEDEF_WRAPPER_POINTER(27, HRESULT, GetThemeMargins)(HTHEME, HDC, int, int, int, RECT*, MARGINS*);
TYPEDEF_WRAPPER_POINTER(28, HRESULT, GetThemeIntList)(HTHEME, int, int, int, INTLIST*);
TYPEDEF_WRAPPER_POINTER(29, HRESULT, GetThemeInt)(HTHEME, int, int, int, int*);
TYPEDEF_WRAPPER_POINTER(30, HRESULT, GetThemeFont)(HTHEME, HDC, int, int, int, LOGFONT*);
TYPEDEF_WRAPPER_POINTER(31, HRESULT, GetThemeFilename)(HTHEME, int, int, int, LPWSTR, int);
TYPEDEF_WRAPPER_POINTER(32, HRESULT, GetThemeEnumValue)(HTHEME, int, int, int, int*);
TYPEDEF_WRAPPER_POINTER(33, HRESULT, GetThemeDocumentationProperty)(LPCWSTR, LPCWSTR, LPWSTR, int);
TYPEDEF_WRAPPER_POINTER(34, HRESULT, GetThemeColor)(HTHEME, int, int, int, COLORREF*);
TYPEDEF_WRAPPER_POINTER(35, HRESULT, GetThemeBool)(HTHEME, int, int, int, BOOL*);
TYPEDEF_WRAPPER_POINTER(36, HRESULT, GetThemeBackgroundRegion)(HTHEME, HDC, int, int, const RECT*, HRGN*);
TYPEDEF_WRAPPER_POINTER(37, HRESULT, GetThemeBackgroundExtent)(HTHEME, HDC, int, int, const RECT*, RECT*);
TYPEDEF_WRAPPER_POINTER(38, HRESULT, GetThemeBackgroundContentRect)(HTHEME, HDC, int, int, const RECT*, RECT*);
TYPEDEF_WRAPPER_POINTER(39, DWORD, ThemeAppProperties)();
TYPEDEF_WRAPPER_POINTER(40, HRESULT, GetCurrentThemeName)(LPWSTR, int, LPWSTR, int, LPWSTR, int);
TYPEDEF_WRAPPER_POINTER(41, HRESULT, EnableTheming)(BOOL);
TYPEDEF_WRAPPER_POINTER(42, HRESULT, EnableThemeDialogTexture)(HWND, DWORD);
TYPEDEF_WRAPPER_POINTER(43, HRESULT, DrawThemeText)(HTHEME, HDC, int, int, LPCWSTR, int, DWORD, DWORD, const RECT*);
TYPEDEF_WRAPPER_POINTER(44, HRESULT, DrawThemeParentBackground)(HWND, HDC, RECT*);
TYPEDEF_WRAPPER_POINTER(45, HRESULT, DrawThemeIcon)(HTHEME, HDC, int, int, const RECT*, HIMAGELIST, int);
TYPEDEF_WRAPPER_POINTER(46, HRESULT, DrawThemeEdge)(HTHEME, HDC, int, int, const RECT*, UINT, UINT, RECT*);
TYPEDEF_WRAPPER_POINTER(47, HRESULT, DrawThemeBackgroundEx)(HTHEME, HDC, int, int, const RECT*, const PDTBGOPTS);
TYPEDEF_WRAPPER_POINTER(48, DWORD, GetThemeAppProperties)();
TYPEDEF_WRAPPER_POINTER(49, HPAINTBUFFER, BeginBufferedPaint)(HDC, const RECT*, XTP_UX_BUFFERFORMAT, XTP_UX_PAINTPARAMS*, HDC*);
TYPEDEF_WRAPPER_POINTER(50, HRESULT, EndBufferedPaint)(HPAINTBUFFER, BOOL);
TYPEDEF_WRAPPER_POINTER(51, HRESULT, DrawThemeTextEx)(HTHEME, HDC, int, int, LPCWSTR, int, DWORD, LPRECT, const XTP_UX_DTTOPTS*);
#define XTP_UXTHEME_HANDLE (HMODULE)0x21FFFF1
//}}AFX_CODEJOCK_PRIVATE
//===========================================================================
// Summary:
// The CXTPWinThemeWrapper class wraps the UxTheme.dll visual theme
// API. You can use this class for rendering Windows XP themes for
// owner drawn controls.
//===========================================================================
class _XTP_EXT_CLASS CXTPWinThemeWrapper
{
private:
//-----------------------------------------------------------------------
// Summary:
// Shared data of wrappers
//-----------------------------------------------------------------------
class CSharedData
{
public:
//-------------------------------------------------------------------------
// Summary:
// Constructs a CSharedData object.
//-------------------------------------------------------------------------
CSharedData();
public:
LPVOID m_ptrWrappers[52]; // Wrapper pointer
HMODULE m_hThemeDll; // Handle to the theme dll.
DWORD m_dwComCtlVersion; // ComCtl version.
};
public:
//-----------------------------------------------------------------------
// Summary:
// Constructs a CXTPWinThemeWrapper object.
// Parameters:
// bUseSkinFramework - TRUE to use skinframework.
//-----------------------------------------------------------------------
CXTPWinThemeWrapper(BOOL bUseSkinFramework = TRUE);
//-----------------------------------------------------------------------
// Summary:
// Destroys a CXTPWinThemeWrapper object, handles cleanup and
// deallocation.
//-----------------------------------------------------------------------
virtual ~CXTPWinThemeWrapper();
//-----------------------------------------------------------------------
// Summary:
// Open the theme data for the specified HWND and semi-colon
// separated list of class names. OpenThemeData() will try
// each class name, one at a time, and use the first matching
// theme info found.
// Parameters:
// hWnd - Window handle of the control/window to be
// themed.
// pszClassList - Class name (or list of names) to match to
// theme data section. if the list contains
// more than one name, the names are tested one
// at a time for a match. If a match is found,
// OpenThemeData() returns a theme handle
// associated with the matching class. This
// param is a list (instead of just a single
// class name) to provide the class an
// opportunity to get the "best" match between
// the class and the current theme. For example,
// a button might pass L"OkButton, Button" if its
// ID=ID_OK. If the current theme has an entry
// for OkButton, that will be used. Otherwise,
// we fall back on the normal Button entry.
//-----------------------------------------------------------------------
void OpenThemeData(HWND hWnd, LPCWSTR pszClassList);
//-----------------------------------------------------------------------
// Summary:
// Closes the theme data handle. CXTPWinThemeWrapper will do
// this automatically when destroyed or when OpenThemeData is
// called. Your window should handle the WM_THEMECHANGED
// message when called followed by a call to OpenThemeData.
//-----------------------------------------------------------------------
void CloseThemeData();
//-----------------------------------------------------------------------
// Summary:
// Draws the theme-specified border and fill for the "iPartId"
// and "iStateId". This could be based on a bitmap file, a
// border and fill, or other image description.
// Parameters:
// hDC - HDC to draw into
// iPartID - Part number to draw
// iStateID - State number (of the part) to draw
// pRect - Defines the size/location of the part
// pClipRect - Optional clipping rect (don't draw outside it)
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
HRESULT DrawThemeBackground(HDC hDC, int iPartID, int iStateID, const RECT *pRect, const RECT* pClipRect);
//-----------------------------------------------------------------------
// Summary:
// Draws the text using the theme-specified color and font for
// the "iPartID" and "iStateID".
// Parameters:
// hDC - HDC to draw into
// iPartID - Part number to draw
// iStateID - State number (of the part) to draw
// pszText - Actual text to draw
// iCharCount - Number of chars to draw (-1 for all)
// dwTextFlags - Same as DrawText() "uFormat" param
// dwTextFlags2 - Additional drawing options
// pRect - Defines the size/location of the part
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
HRESULT DrawThemeText(HDC hDC, int iPartID, int iStateID, LPCWSTR pszText, int iCharCount, DWORD dwTextFlags, DWORD dwTextFlags2, const RECT* pRect);
//-----------------------------------------------------------------------
// Summary:
// Gets the size of the content for the theme-defined
// background. This is usually the area inside the borders or
// Margins.
// Parameters:
// hDC - (optional) device content to be used for
// drawing
// iPartID - Part number to draw
// iStateID - State number (of the part) to draw
// pBoundingRect - The outer RECT of the part being drawn
// pContentRect - RECT to receive the content area
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
HRESULT GetThemeBackgroundContentRect(HDC hDC, int iPartID, int iStateID, const RECT *pBoundingRect, RECT* pContentRect);
//-----------------------------------------------------------------------
// Summary:
// Calculates the size/location of the theme-specified
// background based on the "pContentRect".
// Parameters:
// hDC - (optional) device content to be used for
// drawing
// iPartID - Part number to draw
// iStateID - State number (of the part) to draw
// pContentRect - RECT that defines the content area
// pExtentRect - RECT to receive the overall size/location of
// part
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
HRESULT GetThemeBackgroundExtent(HDC hDC, int iPartID, int iStateID, const RECT *pContentRect, RECT* pExtentRect);
//-----------------------------------------------------------------------
// Summary:
// Draws the theme-specified border and fill for the "iPartId"
// and "iStateId". This could be based on a bitmap file, a
// border and fill, or other image description.
// Parameters:
// hDC - HDC to draw into
// iPartID - Part number to draw
// iStateID - State number (of the part) to draw
// pRect - Defines the size/location of the part
// pOptions - Pointer to optional parameters.
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
HRESULT DrawThemeBackgroundEx(HDC hDC, int iPartID, int iStateID, const RECT *pRect, const PDTBGOPTS pOptions);
//-----------------------------------------------------------------------
// Summary:
// Similar to the DrawEdge() API, but uses part colors and is
// high-DPI aware
// Parameters:
// hDC - HDC to draw into
// iPartID - Part number to draw.
// iStateID - State number of part
// pDestRect - The RECT used to draw the line(s)
// uEdge - Same as DrawEdge() API
// uFlags - Same as DrawEdge() API
// pContentRect - Receives the interior rect if (uFlags &
// BF_ADJUST)
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
HRESULT DrawThemeEdge(HDC hDC, int iPartID, int iStateID, const RECT *pDestRect, UINT uEdge, UINT uFlags, RECT* pContentRect);
//-----------------------------------------------------------------------
// Summary:
// Draws an image within an imagelist based on a (possible)
// theme-defined effect.
// Parameters:
// hDC - HDC to draw into
// iPartID - Part number to draw.
// iStateID - State number of part
// pRect - The RECT to draw the image within
// himl - Handle to IMAGELIST
// iImageIndex - Index into IMAGELIST (which icon to draw)
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
HRESULT DrawThemeIcon(HDC hDC, int iPartID, int iStateID, const RECT* pRect, HIMAGELIST himl, int iImageIndex);
//-----------------------------------------------------------------------
// Summary:
// Used by partially-transparent or alpha-blended child controls
// to draw the part of their parent that they appear in front of.
// Parameters:
// hWnd - Handle of the child control
// hDC - HDC of the child control
// pRect - (optional) rect that defines the area to be
// Drawn (CHILD coordinates)
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
HRESULT DrawThemeParentBackground(HWND hWnd, HDC hDC, RECT* pRect);
//-----------------------------------------------------------------------
// Summary:
// Enables/disables dialog background theme. This method can be
// used to tailor dialog compatibility with child windows and
// controls that may or may not coordinate the rendering of
// their client area backgrounds with that of their parent
// dialog in a manner that supports seamless background
// texturing.
// Parameters:
// hWnd - The window handle of the target dialog
// dwFlags - ETDT_ENABLE to enable the theme-defined dialog
// background texturing,
// ETDT_DISABLE to disable background texturing,
// ETDT_ENABLETAB to enable the theme-defined
// background texturing using the Tab texture
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
HRESULT EnableThemeDialogTexture(HWND hWnd, DWORD dwFlags);
//-----------------------------------------------------------------------
// Summary:
// Enables or disables theming for the current user in the
// current and future sessions.
// Parameters:
// bEnable - If FALSE, disable theming & turn themes off.
// if TRUE, enable theming and, if user
// previously had a theme active, make it active
// now.
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
HRESULT EnableTheming(BOOL bEnable);
//-----------------------------------------------------------------------
// Summary:
// Get the name of the current theme in-use. Optionally, return
// the ColorScheme name and the Size name of the theme.
// Parameters:
// pszThemeFileName - Receives the theme path & filename
// dwMaxNameChars - Max chars allowed in pszNameBuff
// pszColorBuff - (optional) receives the canonical color
// scheme name
// (not the display name)
// cchMaxColorChars - Max chars allowed in pszColorBuff
// pszSizeBuff - (optional) receives the canonical size
// name (not the display name)
// cchMaxSizeChars - Max chars allowed in pszSizeBuff
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
HRESULT GetCurrentThemeName(LPWSTR pszThemeFileName, int dwMaxNameChars, LPWSTR pszColorBuff, int cchMaxColorChars, LPWSTR pszSizeBuff, int cchMaxSizeChars);
//-----------------------------------------------------------------------
// Summary:
// Retrieves the property flags that control how visual styles
// are applied in the current application.
// Returns:
// The following return values are bit flags combined with a
// logical OR operator.
// STAP_ALLOW_NONCLIENT - Specifies that the non-client areas of
// application windows have visual
// styles applied.
// STAP_ALLOW_CONTROLS - Specifies that controls in
// application windows have visual
// styles applied.
// STAP_ALLOW_WEBCONTENT - Specifies that all web content
// displayed in an application is
// rendered using visual styles.
//-----------------------------------------------------------------------
DWORD ThemeAppProperties();
//-----------------------------------------------------------------------
// Summary:
// Computes the region for a regular or partially transparent
// theme-specified background that is bound by the specified
// "pRect". If the rectangle is empty, sets the hRgn to NULL
// and return S_FALSE.
// Parameters:
// hDC - Optional hDC to draw into (DPI scaling)
// iPartID - Part number to draw.
// iStateID - State number (of the part)
// pRect - The RECT used to draw the part
// pRegion - Receives handle to calculated region
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
HRESULT GetThemeBackgroundRegion(HDC hDC, int iPartID, int iStateID, const RECT *pRect, HRGN* pRegion);
//-----------------------------------------------------------------------
// Summary:
// Get the value for the specified BOOL property
// Parameters:
// iPartID - Part number
// iStateID - State number of part
// iPropID - The property number to get the value for
// pfVal - Receives the value of the property
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
HRESULT GetThemeBool(int iPartID, int iStateID, int iPropID, BOOL* pfVal);
//-----------------------------------------------------------------------
// Summary:
// Get the value for the specified COLOR property
// Parameters:
// iPartID - Part number
// iStateID - State number of part
// iPropID - The property number to get the value for
// pColor - Receives the value of the property
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
HRESULT GetThemeColor(int iPartID, int iStateID, int iPropID, COLORREF* pColor);
//-----------------------------------------------------------------------
// Summary:
// Get the value for the specified property name from the
// [documentation] section of the themes.ini file for the
// specified theme. If the property has been localized in the
// theme files string table, the localized version of the
// property value is returned.
// Parameters:
// pszThemeName - Filename of the theme file to query
// pszPropertyName - Name of the string property to retrieve a
// value for
// pszValueBuff - Receives the property string value
// cchMaxValChars - Max chars allowed in pszValueBuff
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
HRESULT GetThemeDocumentationProperty(LPCWSTR pszThemeName, LPCWSTR pszPropertyName, LPWSTR pszValueBuff, int cchMaxValChars);
//-----------------------------------------------------------------------
// Summary:
// Get the value for the specified ENUM property
// Parameters:
// iPartID - Part number
// iStateID - State number of part
// iPropID - The property number to get the value for
// piVal - Receives the value of the enum (cast to int*)
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
HRESULT GetThemeEnumValue(int iPartID, int iStateID, int iPropID, int* piVal);
//-----------------------------------------------------------------------
// Summary:
// Get the value for the specified FILENAME property.
// Parameters:
// iPartID - Part number
// iStateID - State number of part
// iPropID - The property number to search for
// pszThemeFilename - Output buffer to receive the filename
// cchMaxBuffChars - The size of the return buffer, in chars
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
HRESULT GetThemeFilename(int iPartID, int iStateID, int iPropID, LPWSTR pszThemeFilename, int cchMaxBuffChars);
//-----------------------------------------------------------------------
// Summary:
// Get the value for the specified font property
// Parameters:
// hDC - (optional) hDC to be drawn to (DPI scaling)
// iPartID - Part number
// iStateID - State number of part
// iPropID - The property number to get the value for
// pFont - Receives the value of the LOGFONT property
// (scaled for the current logical screen dpi)
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
HRESULT GetThemeFont(HDC hDC, int iPartID, int iStateID, int iPropID, LOGFONT* pFont);
//-----------------------------------------------------------------------
// Summary:
// Get the value for the specified int property
// Parameters:
// iPartID - Part number
// iStateID - State number of part
// iPropID - The property number to get the value for
// piVal - Receives the value of the property
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
HRESULT GetThemeInt(int iPartID, int iStateID, int iPropID, int* piVal);
//-----------------------------------------------------------------------
// Summary:
// Get the value for the specified INTLIST struct
// Parameters:
// iPartID - Part number
// iStateID - State number of part
// iPropID - The property number to get the value for
// pIntList - Receives the value of the INTLIST property
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
HRESULT GetThemeIntList(int iPartID, int iStateID, int iPropID, INTLIST* pIntList);
//-----------------------------------------------------------------------
// Summary:
// Get the value for the specified MARGINS property
// Parameters:
// hDC - (optional) hDC to be used for drawing
// iPartID - Part number
// iStateID - State number of part
// iPropID - The property number to get the value for
// pRect - RECT for area to be drawn into
// pMargins - Receives the value of the MARGINS property
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
HRESULT GetThemeMargins(HDC hDC, int iPartID, int iStateID, int iPropID, RECT *pRect, MARGINS* pMargins);
//-----------------------------------------------------------------------
// Summary:
// Get the value for the specified metric/size property
// Parameters:
// hDC - (optional) hDC to be drawn into (DPI scaling)
// iPartID - Part number
// iStateID - State number of part
// iPropID - The property number to get the value for
// piVal - Receives the value of the property
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
HRESULT GetThemeMetric(HDC hDC, int iPartID, int iStateID, int iPropID, int* piVal);
//-----------------------------------------------------------------------
// Summary:
// Returns the specified size of the theme part
// Parameters:
// hDC - HDC to select font into & measure against
// iPartID - Part number to retrieve size for
// iStateID - State number (of the part)
// pRect - (optional) rect for part drawing destination
// eSize - The type of size to be retrieved
// pSize - Receives the specified size of the part
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
HRESULT GetThemePartSize(HDC hDC, int iPartID, int iStateID, RECT *pRect, THEMESIZE eSize, SIZE* pSize);
//-----------------------------------------------------------------------
// Summary:
// Get the value for the specified position property
// Parameters:
// iPartID - Part number
// iStateID - State number of part
// iPropID - The property number to get the value for
// pPoint - Receives the value of the position property
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
HRESULT GetThemePosition(int iPartID, int iStateID, int iPropID, POINT* pPoint);
//-----------------------------------------------------------------------
// Summary:
// Searches for the specified theme property and sets "pOrigin"
// to indicate where it was found (or not found)
// Parameters:
// iPartID - Part number
// iStateID - State number of part
// iPropID - The property number to search for
// pOrigin - Receives the value of the property origin
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
HRESULT GetThemePropertyOrigin(int iPartID, int iStateID, int iPropID, PROPERTYORIGIN* pOrigin);
//-----------------------------------------------------------------------
// Summary:
// Get the value for the specified RECT property
// Parameters:
// iPartID - Part number
// iStateID - State number of part
// iPropID - The property number to get the value for
// pRect - Receives the value of the RECT property
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
HRESULT GetThemeRect(int iPartID, int iStateID, int iPropID, RECT* pRect);
//-----------------------------------------------------------------------
// Summary:
// Get the value for the specified string property
// Parameters:
// iPartID - Part number
// iStateID - State number of part
// iPropID - The property number to get the value for
// pszBuff - Receives the string property value
// cchMaxBuffChars - Max. number of chars allowed in pszBuff
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
HRESULT GetThemeString(int iPartID, int iStateID, int iPropID, LPWSTR pszBuff, int cchMaxBuffChars);
//-----------------------------------------------------------------------
// Summary:
// Get the boolean value of specified System metric.
// Parameters:
// iBoolID - The TMT_XXX BOOL number (first BOOL is
// TMT_FLATMENUS)
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
BOOL GetThemeSysBool(int iBoolID);
//-----------------------------------------------------------------------
// Summary:
// Get the value of the specified System color.
// Parameters:
// iColorID - The system color index defined in winuser.h
// Returns:
// The value of the specified system color.
//-----------------------------------------------------------------------
COLORREF GetThemeSysColor(int iColorID);
//-----------------------------------------------------------------------
// Summary:
// Get the brush for the specified System color.
// Parameters:
// iColorID - The system color index defined in winuser.h
// Returns:
// Handle to brush data.
//-----------------------------------------------------------------------
HBRUSH GetThemeSysColorBrush(int iColorID);
//-----------------------------------------------------------------------
// Summary:
// Get the LOGFONT for the specified System font.
// Parameters:
// iFontID - The TMT_XXX font number (first font
// is TMT_CAPTIONFONT)
// pLF - Ptr to LOGFONT to receive the font value.
// (scaled for the current logical screen dpi)
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
HRESULT GetThemeSysFont(int iFontID, LOGFONT* pLF);
//-----------------------------------------------------------------------
// Summary:
// Get the value of specified System int.
// Parameters:
// iIntID - Must be one of the following values:
// TMT_DPIX
// TMT_DPIY
// TMT_MINCOLORDEPTH
// piValue - Ptr to int to receive value
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
HRESULT GetThemeSysInt(int iIntID, int* piValue);
//-----------------------------------------------------------------------
// Summary:
// Get the value of the specified System size metric. (scaled
// for the current logical screen dpi)
// Parameters:
// iSizeID - The following values are supported:
// SM_CXBORDER (border width)
// SM_CXVSCROLL (scrollbar width)
// SM_CYHSCROLL (scrollbar height)
// SM_CXSIZE (caption width)
// SM_CYSIZE (caption height)
// SM_CXSMSIZE (small caption width)
// SM_CYSMSIZE (small caption height)
// SM_CXMENUSIZE (menubar width)
// SM_CYMENUSIZE (menubar height)
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
int GetThemeSysSize(int iSizeID);
//-----------------------------------------------------------------------
// Summary:
// Get the value of specified System string metric.
// Parameters:
// iStringID - Must be one of the following values:
// TMT_CSSNAME
// TMT_XMLNAME
// pszStringBuff - The buffer to receive the string value
// cchMaxStringChars - Max. number of chars that pszStringBuff
// can hold
// Returns:
// The size in dots per inch (DPI) scaled for the current
// logical screen.
//-----------------------------------------------------------------------
HRESULT GetThemeSysString(int iStringID, LPWSTR pszStringBuff, int cchMaxStringChars);
//-----------------------------------------------------------------------
// Summary:
// Calculates the size/location of the specified text when
// rendered in the Theme Font.
// Parameters:
// hDC - HDC to select font & measure into
// iPartID - Part number to draw.
// iStateID - State number (of the part)
// pszText - The text to be measured
// iCharCount - Number of chars to draw (-1 for all)
// dwTextFlags - Same as DrawText() "uFormat" param
// pBoundingRect - Optional: to control layout of text
// pExtentRect - Receives the RECT for text size/location
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
HRESULT GetThemeTextExtent(HDC hDC, int iPartID, int iStateID, LPCWSTR pszText, int iCharCount, DWORD dwTextFlags, const RECT *pBoundingRect, RECT* pExtentRect);
//-----------------------------------------------------------------------
// Summary:
// Returns info about the theme-specified font for the part/
// state passed in.
// Parameters:
// hDC - Optional: hDC for screen context
// iPartID - Part number to draw.
// iStateID - State number (of the part)
// ptm - Receives the font info
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
HRESULT GetThemeTextMetrics(HDC hDC, int iPartID, int iStateID, TEXTMETRIC* ptm);
//-----------------------------------------------------------------------
// Summary:
// If window is themed, returns its most recent HTHEME from
// OpenThemeData() - Otherwise, returns NULL.
// Parameters:
// hWnd - The window to get the HTHEME of
// Returns:
// The most recent theme handle from OpenThemeData.
//-----------------------------------------------------------------------
HTHEME GetWindowTheme(HWND hWnd);
//-----------------------------------------------------------------------
// Summary:
// Returns a HitTestCode (a subset of the values returned by
// WM_NCHITTEST) for the point "ptTest" within the theme-
// specified background (bound by pRect). "pRect" and "ptTest"
// should both be in the same coordinate system (client, screen,
// etc).
// Parameters:
// hDC - HDC to draw into
// iPartID - Part number to test against
// iStateID - State number (of the part)
// pRect - The RECT used to draw the part
// hRgn - Optional region to use; must be in same
// coordinates as
// pRect and pTest.
// ptTest - The hit point to be tested
// dwOptions - HTTB_xxx constants
// pwHitTestCode - Receives the returned hit test code - One of:
// HTNOWHERE, HTLEFT, HTTOPLEFT, HTBOTTOMLEFT,
// HTRIGHT, HTTOPRIGHT, HTBOTTOMRIGHT,
// HTTOP, HTBOTTOM, HTCLIENT
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
HRESULT HitTestThemeBackground(HDC hDC, int iPartID, int iStateID, DWORD dwOptions, const RECT *pRect, HRGN hRgn, POINT ptTest, WORD* pwHitTestCode);
//-----------------------------------------------------------------------
// Summary:
// Reports whether the current application's user interface
// displays using visual styles.
// Returns:
// Returns one of the following values.
// TRUE - The application has a visual style applied.
// FALSE - The application does not have a visual style applied.
//-----------------------------------------------------------------------
BOOL IsAppThemed() const;
//-----------------------------------------------------------------------
// Summary:
// Can be used to test if a system theme is active for the
// current user session.
// use the API "IsAppThemed()" to test if a theme is active for
// the calling process.
// Returns:
// Returns one of the following values:
// TRUE - A visual style is enabled, and windows with visual
// styles applied should call OpenThemeData to start
// using theme drawing services.
// FALSE - A visual style is not enabled, and the window message
// handler does not need to make another call to
// IsThemeActive until it receives a WM_THEMECHANGED
// message.
//-----------------------------------------------------------------------
BOOL IsThemeActive() const;
//-----------------------------------------------------------------------
// Summary:
// Call this member function to determine if the application should
// display Windows XP themes. IsAppThemeReady() will first check
// to see if the operating system supports Windows XP theme display,
// then checks to see if the application has any controls that are
// able to display Windows XP themes, then finally checks to see if
// the application has included a manifest file.
// Returns:
// TRUE if the application can display Windows XP themes, otherwise FALSE.
//-----------------------------------------------------------------------
BOOL IsAppThemeReady() const;
//-----------------------------------------------------------------------
// Summary:
// Returns TRUE if the theme specified background for the part/
// state has transparent pieces or alpha-blended pieces.
// Parameters:
// iPartID - Part number
// iStateID - State number of part
// Returns:
// Returns one of the following values.
// TRUE - The theme-specified background for a particular
// iPartId and iStateId has transparent pieces or alpha-
// blended pieces.
// FALSE - The theme-specified background for a particular
// iPartId and iStateId does not have transparent pieces
// or alpha-blended pieces.
//-----------------------------------------------------------------------
BOOL IsThemeBackgroundPartiallyTransparent(int iPartID, int iStateID);
//-----------------------------------------------------------------------
// Summary:
// Reports whether the dialog supports background texturing.
// Returns:
// Returns one of the following values.
// TRUE - Background texturing is supported.
// FALSE - Background texturing is not supported.
//-----------------------------------------------------------------------
BOOL IsThemeDialogTextureEnabled(HWND hWnd);
//-----------------------------------------------------------------------
// Summary:
// Returns TRUE if the theme has defined parameters for the
// specified "iPartID" and "iStateID".
// Parameters:
// iPartID - Part number to find definition for
// iStateID - State number of part
// Returns:
// Returns one of the following values.
// TRUE - The theme has defined parameters for the specified
// iPartId and iStateId
// FALSE - The theme does not have defined parameters for the
// specified iPartId and iStateId
//-----------------------------------------------------------------------
BOOL IsThemePartDefined(int iPartID, int iStateID);
//-----------------------------------------------------------------------
// Summary:
// Sets the flags that control theming within the app
// Parameters:
// dwFlags - The flag values to be set
//-----------------------------------------------------------------------
void SetThemeAppProperties(DWORD dwFlags);
//-----------------------------------------------------------------------
// Summary:
// Redirects an existing Window to use a different section of
// the current theme information than its class normally asks
// for.
// Parameters:
// hWnd - The handle of the window (cannot be NULL)
// pszSubAppName - App (group) name to use in place of the
// calling app's name. If NULL, the actual
// calling app name will be used.
// pszSubIdList - Semicolon separated list of class Id names to
// use in place of actual list passed by the
// window's class. if NULL, the id list from
// the calling class is used.
// Remarks: The Theme Manager will remember the "pszSubAppName" and the
// "pszSubIdList" associations thru the lifetime of the window
// (even if themes are subsequently changed). The window is
// sent a "WM_THEMECHANGED" msg at the end of this call, so that
// the new theme can be found and applied.
// When "pszSubAppName" or "pszSubIdList" are NULL, the Theme
// Manager removes the previously remember association. To turn
// off theme-ing for the specified window, you can pass an empty
// string (L"") so it won't match any section entries.
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
HRESULT SetWindowTheme(HWND hWnd, LPCWSTR pszSubAppName, LPCWSTR pszSubIdList);
//-----------------------------------------------------------------------
// Summary:
// Call this member function to determine if OpenThemeData() was
// called to open theme information for a particular window.
// Returns:
// TRUE if theme information was loaded, otherwise FALSE.
//-----------------------------------------------------------------------
BOOL ThemeDataOpen() const;
//-----------------------------------------------------------------------
// Summary:
// Retrieves the property flags that control how visual styles are applied in the current application.
//-----------------------------------------------------------------------
DWORD GetThemeAppProperties();
//{{AFX_CODEJOCK_PRIVATE
static BOOL m_bDllDetached;
//for compatibility with older versions.
void CloseTheme() {
CloseThemeData();
}
void OpenTheme(HWND hWnd, LPCWSTR pszClassList) {
OpenThemeData(hWnd, pszClassList);
}
void DrawBackground(HDC hdc, int iPartId, int iStateId, const RECT *pRect, const RECT* pClipRect) {
DrawThemeBackground(hdc, iPartId, iStateId, pRect, pClipRect);
}
//}}AFX_CODEJOCK_PRIVATE
//-----------------------------------------------------------------------
// Summary:
// Begins a buffered paint operation
// Parameters:
// hdcTarget - Handle of the target device context (DC) on which the buffer will be painted.
// prcTarget - Pointer to a RECT structure that specifies the area of the target DC in which to paint.
// dwFormat - A member of the BP_BUFFERFORMAT enumeration that specifies the format of the buffer.
// pPaintParams - [in] Pointer to a BP_PAINTPARAMS structure that defines the paint operation parameters. This value can be NULL.
// phdc - [out] When this function returns, this value points to the handle of the new device context.
// Returns: A handle to the buffered paint context
// See Also: EndBufferedPaint
//-----------------------------------------------------------------------
HPAINTBUFFER BeginBufferedPaint(HDC hdcTarget, const RECT* prcTarget, XTP_UX_BUFFERFORMAT dwFormat, XTP_UX_PAINTPARAMS *pPaintParams, HDC *phdc);
//-----------------------------------------------------------------------
// Summary:
// Completes a buffered paint operation and frees the associated buffered paint handle
// Parameters:
// hBufferedPaint - Handle of the buffered paint context, obtained through BeginBufferedPaint
// fUpdateTarget - TRUE to copy the buffer to the target device context (DC)
// See Also: BeginBufferedPaint
//-----------------------------------------------------------------------
void EndBufferedPaint(HPAINTBUFFER hBufferedPaint, BOOL fUpdateTarget);
//-----------------------------------------------------------------------
// Summary:
// Draws the text using the theme-specified color and font for
// the "iPartID" and "iStateID".
// Parameters:
// hDC - HDC to draw into
// iPartId - Part number to draw
// iStateId - State number (of the part) to draw
// pszText - Actual text to draw
// cchText - Number of chars to draw (-1 for all)
// dwTextFlags - Same as DrawText() "uFormat" param
// pOptions - Additional drawing options
// pRect - Defines the size/location of the part
// Returns:
// Returns S_OK if successful, or an error value otherwise.
//-----------------------------------------------------------------------
HRESULT DrawThemeTextEx(HDC hdc, int iPartId, int iStateId, LPCWSTR pszText, int cchText, DWORD dwTextFlags, LPRECT pRect, const XTP_UX_DTTOPTS *pOptions);
//-----------------------------------------------------------------------
// Parameters:
// nThemeWrapper - Wrapper id.
// lpWrapperPtr - Wrapper pointer
// Summary:
// This method is used to set user defined wrappers
//-----------------------------------------------------------------------
void SetThemeWrapperPtr(int nThemeWrapper, LPVOID lpWrapperPtr);
void CreateSharedData();
private:
void ReloadLibrary() const;
private:
HTHEME m_hTheme; // Handle to the theme data.
BOOL m_bUseSkinFramework;
CSharedData* m_pSharedDara;
CSharedData& GetSharedData() const;
};
//{{AFX_CODEJOCK_PRIVATE
struct XTP_DWM_MARGINS
{
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
};
TYPEDEF_WRAPPER_POINTER(0, HRESULT, DwmDefWindowProc)(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, LRESULT *plResult);
TYPEDEF_WRAPPER_POINTER(1, HRESULT, DwmIsCompositionEnabled)( BOOL*);
TYPEDEF_WRAPPER_POINTER(2, HRESULT, DwmExtendFrameIntoClientArea)(HWND, const XTP_DWM_MARGINS*);
//===========================================================================
// Summary:
// The CXTPWinDwmWrapper class wraps the dwp api.
//===========================================================================
class _XTP_EXT_CLASS CXTPWinDwmWrapper
{
private:
//-----------------------------------------------------------------------
// Summary:
// Shared data of wrappers
//-----------------------------------------------------------------------
class CSharedData
{
public:
//-------------------------------------------------------------------------
// Summary:
// Constructs a CSharedData object.
//-------------------------------------------------------------------------
CSharedData();
public:
LPVOID m_ptrWrappers[3]; // Wrapper pointer
HMODULE m_hDwmDll; // Handle to the theme dll.
};
public:
CXTPWinDwmWrapper();
~CXTPWinDwmWrapper();
public:
HRESULT DefWindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, LRESULT *plResult);
BOOL IsCompositionEnabled();
HRESULT ExtendFrameIntoClientArea(HWND hWnd, int cxLeftWidth, int cyTopHeight, int cxRightWidth, int cyBottomHeight);
public:
void LogicalToPhysicalPoint(HWND hWnd, LPPOINT lpPoint);
void SetProcessDPIAware();
private:
CSharedData& GetSharedData() const;
};
//}}AFX_CODEJOCK_PRIVATE
/////////////////////////////////////////////////////////////////////////////
#endif // !defined(__XTPWINTHEMEWRAPPER_H__)