1 #ifndef _UXTHEME_PCH_ 2 #define _UXTHEME_PCH_ 3 4 #include <stdarg.h> 5 6 #define WIN32_NO_STATUS 7 #define _INC_WINDOWS 8 #define COM_NO_WINDOWS_H 9 10 #include <windef.h> 11 #include <winbase.h> 12 #include <wingdi.h> 13 #include <winuser.h> 14 #include <winnls.h> 15 #include <windowsx.h> 16 #include <undocuser.h> 17 #include <undocgdi.h> 18 #include <uxtheme.h> 19 #include <uxundoc.h> 20 #include <vfwmsgs.h> 21 #include <tmschema.h> 22 23 #define NTOS_MODE_USER 24 #include <ndk/ntndk.h> 25 #include <ndk/rtltypes.h> 26 27 #include <wine/debug.h> 28 WINE_DEFAULT_DEBUG_CHANNEL(uxtheme); 29 30 #define TMT_ENUM 200 31 32 #define MAX_THEME_APP_NAME 60 33 #define MAX_THEME_CLASS_NAME 60 34 #define MAX_THEME_VALUE_NAME 60 35 36 typedef struct _THEME_PROPERTY { 37 int iPrimitiveType; 38 int iPropertyId; 39 PROPERTYORIGIN origin; 40 41 LPCWSTR lpValue; 42 DWORD dwValueLen; 43 44 struct _THEME_PROPERTY *next; 45 } THEME_PROPERTY, *PTHEME_PROPERTY; 46 47 typedef struct _THEME_PARTSTATE { 48 int iPartId; 49 int iStateId; 50 PTHEME_PROPERTY properties; 51 52 struct _THEME_PARTSTATE *next; 53 } THEME_PARTSTATE, *PTHEME_PARTSTATE; 54 55 struct _THEME_FILE; 56 57 typedef struct _THEME_CLASS { 58 HMODULE hTheme; 59 struct _THEME_FILE* tf; 60 WCHAR szAppName[MAX_THEME_APP_NAME]; 61 WCHAR szClassName[MAX_THEME_CLASS_NAME]; 62 PTHEME_PARTSTATE partstate; 63 struct _THEME_CLASS *overrides; 64 65 struct _THEME_CLASS *next; 66 } THEME_CLASS, *PTHEME_CLASS; 67 68 typedef struct _THEME_IMAGE { 69 WCHAR name[MAX_PATH]; 70 HBITMAP image; 71 BOOL hasAlpha; 72 73 struct _THEME_IMAGE *next; 74 } THEME_IMAGE, *PTHEME_IMAGE; 75 76 typedef struct _THEME_FILE { 77 DWORD dwRefCount; 78 HMODULE hTheme; 79 WCHAR szThemeFile[MAX_PATH]; 80 LPWSTR pszAvailColors; 81 LPWSTR pszAvailSizes; 82 83 LPWSTR pszSelectedColor; 84 LPWSTR pszSelectedSize; 85 86 PTHEME_CLASS classes; 87 PTHEME_PROPERTY metrics; 88 PTHEME_IMAGE images; 89 } THEME_FILE, *PTHEME_FILE; 90 91 typedef struct _UXINI_FILE *PUXINI_FILE; 92 93 typedef struct _UXTHEME_HANDLE 94 { 95 RTL_HANDLE_TABLE_ENTRY Handle; 96 PTHEME_CLASS pClass; 97 } UXTHEME_HANDLE, *PUXTHEME_HANDLE; 98 99 PTHEME_CLASS ValidateHandle(HTHEME hTheme); 100 101 HRESULT UXTHEME_LoadImage(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pRect, BOOL glyph, 102 HBITMAP *hBmp, RECT *bmpRect, BOOL* hasImageAlpha); 103 104 BOOL MSSTYLES_LookupProperty(LPCWSTR pszPropertyName, int *dwPrimitive, int *dwId); 105 BOOL MSSTYLES_LookupEnum(LPCWSTR pszValueName, int dwEnum, int *dwValue); 106 BOOL MSSTYLES_LookupPartState(LPCWSTR pszClass, LPCWSTR pszPart, LPCWSTR pszState, int *iPartId, int *iStateId); 107 108 HRESULT MSSTYLES_OpenThemeFile(LPCWSTR lpThemeFile, LPCWSTR pszColorName, LPCWSTR pszSizeName, PTHEME_FILE *tf); 109 HRESULT MSSTYLES_ReferenceTheme(PTHEME_FILE tf); 110 void MSSTYLES_CloseThemeFile(PTHEME_FILE tf); 111 void MSSTYLES_ParseThemeIni(PTHEME_FILE tf); 112 PTHEME_CLASS MSSTYLES_OpenThemeClass(PTHEME_FILE tf, LPCWSTR pszAppName, LPCWSTR pszClassList); 113 HRESULT MSSTYLES_CloseThemeClass(PTHEME_CLASS tc); 114 PUXINI_FILE MSSTYLES_GetThemeIni(PTHEME_FILE tf); 115 PTHEME_PARTSTATE MSSTYLES_FindPartState(PTHEME_CLASS tc, int iPartId, int iStateId, PTHEME_CLASS *tcNext); 116 PTHEME_PROPERTY MSSTYLES_FindProperty(PTHEME_CLASS tc, int iPartId, int iStateId, int iPropertyPrimitive, int iPropertyId); 117 PTHEME_PROPERTY MSSTYLES_FindMetric(PTHEME_FILE tf, int iPropertyPrimitive, int iPropertyId); 118 HBITMAP MSSTYLES_LoadBitmap(PTHEME_CLASS tc, LPCWSTR lpFilename, BOOL* hasAlpha); 119 120 HRESULT MSSTYLES_GetPropertyBool(PTHEME_PROPERTY tp, BOOL *pfVal); 121 HRESULT MSSTYLES_GetPropertyColor(PTHEME_PROPERTY tp, COLORREF *pColor); 122 HRESULT MSSTYLES_GetPropertyFont(PTHEME_PROPERTY tp, HDC hdc, LOGFONTW *pFont); 123 HRESULT MSSTYLES_GetPropertyInt(PTHEME_PROPERTY tp, int *piVal); 124 HRESULT MSSTYLES_GetPropertyIntList(PTHEME_PROPERTY tp, INTLIST *pIntList); 125 HRESULT MSSTYLES_GetPropertyPosition(PTHEME_PROPERTY tp, POINT *pPoint); 126 HRESULT MSSTYLES_GetPropertyString(PTHEME_PROPERTY tp, LPWSTR pszBuff, int cchMaxBuffChars); 127 HRESULT MSSTYLES_GetPropertyRect(PTHEME_PROPERTY tp, RECT *pRect); 128 HRESULT MSSTYLES_GetPropertyMargins(PTHEME_PROPERTY tp, RECT *prc, MARGINS *pMargins); 129 130 PUXINI_FILE UXINI_LoadINI(HMODULE hTheme, LPCWSTR lpName); 131 void UXINI_CloseINI(PUXINI_FILE uf); 132 LPCWSTR UXINI_GetNextSection(PUXINI_FILE uf, DWORD *dwLen); 133 BOOL UXINI_FindSection(PUXINI_FILE uf, LPCWSTR lpName); 134 LPCWSTR UXINI_GetNextValue(PUXINI_FILE uf, DWORD *dwNameLen, LPCWSTR *lpValue, DWORD *dwValueLen); 135 BOOL UXINI_FindValue(PUXINI_FILE uf, LPCWSTR lpName, LPCWSTR *lpValue, DWORD *dwValueLen); 136 137 /* Scroll-bar hit testing */ 138 enum SCROLL_HITTEST 139 { 140 SCROLL_NOWHERE, /* Outside the scroll bar */ 141 SCROLL_TOP_ARROW, /* Top or left arrow */ 142 SCROLL_TOP_RECT, /* Rectangle between the top arrow and the thumb */ 143 SCROLL_THUMB, /* Thumb rectangle */ 144 SCROLL_BOTTOM_RECT, /* Rectangle between the thumb and the bottom arrow */ 145 SCROLL_BOTTOM_ARROW /* Bottom or right arrow */ 146 }; 147 148 /* The window context stores data for the window needed through the life of the window */ 149 typedef struct _WND_DATA 150 { 151 HTHEME hthemeWindow; 152 HTHEME hthemeScrollbar; 153 154 RECT rcCaptionButtons[4]; 155 UINT lastHitTest; 156 BOOL HasAppDefinedRgn; 157 BOOL HasThemeRgn; 158 BOOL UpdatingRgn; 159 BOOL DirtyThemeRegion; 160 HBRUSH hTabBackgroundBrush; 161 HBITMAP hTabBackgroundBmp; 162 163 BOOL SCROLL_trackVertical; 164 enum SCROLL_HITTEST SCROLL_trackHitTest; 165 BOOL SCROLL_MovingThumb; /* Is the moving thumb being displayed? */ 166 HWND SCROLL_TrackingWin; 167 INT SCROLL_TrackingBar; 168 INT SCROLL_TrackingPos; 169 INT SCROLL_TrackingVal; 170 } WND_DATA, *PWND_DATA; 171 172 /* The draw context stores data that are needed by the drawing operations in the non client area of the window */ 173 typedef struct _DRAW_CONTEXT 174 { 175 HWND hWnd; 176 HDC hDC; 177 HTHEME theme; 178 HTHEME scrolltheme; 179 HTHEME hPrevTheme; 180 WINDOWINFO wi; 181 BOOL Active; /* wi.dwWindowStatus isn't correct for mdi child windows */ 182 HRGN hRgn; 183 int CaptionHeight; 184 185 /* for double buffering */ 186 HDC hDCScreen; 187 HBITMAP hbmpOld; 188 } DRAW_CONTEXT, *PDRAW_CONTEXT; 189 190 typedef enum 191 { 192 CLOSEBUTTON, 193 MAXBUTTON, 194 MINBUTTON, 195 HELPBUTTON 196 } CAPTIONBUTTON; 197 198 /* 199 The following values specify all possible button states 200 Note that not all of them are documented but it is easy to 201 find them by opening a theme file 202 */ 203 typedef enum { 204 BUTTON_NORMAL = 1 , 205 BUTTON_HOT , 206 BUTTON_PRESSED , 207 BUTTON_DISABLED , 208 BUTTON_INACTIVE , 209 BUTTON_INACTIVE_HOT , 210 BUTTON_INACTIVE_PRESSED , 211 BUTTON_INACTIVE_DISABLED 212 } THEME_BUTTON_STATES; 213 214 #define HT_ISBUTTON(ht) ((ht) == HTMINBUTTON || (ht) == HTMAXBUTTON || (ht) == HTCLOSE || (ht) == HTHELP) 215 216 #define HASSIZEGRIP(Style, ExStyle, ParentStyle, WindowRect, ParentClientRect) \ 217 ((!(Style & WS_CHILD) && (Style & WS_THICKFRAME) && !(Style & WS_MAXIMIZE)) || \ 218 ((Style & WS_CHILD) && (ParentStyle & WS_THICKFRAME) && !(ParentStyle & WS_MAXIMIZE) && \ 219 (WindowRect.right - WindowRect.left == ParentClientRect.right) && \ 220 (WindowRect.bottom - WindowRect.top == ParentClientRect.bottom))) 221 222 #define HAS_MENU(hwnd,style) ((((style) & (WS_CHILD | WS_POPUP)) != WS_CHILD) && GetMenu(hwnd)) 223 224 #define BUTTON_GAP_SIZE 2 225 226 #define MENU_BAR_ITEMS_SPACE (12) 227 228 #define SCROLL_TIMER 0 /* Scroll timer id */ 229 230 /* Overlap between arrows and thumb */ 231 #define SCROLL_ARROW_THUMB_OVERLAP 0 232 233 /* Delay (in ms) before first repetition when holding the button down */ 234 #define SCROLL_FIRST_DELAY 200 235 236 /* Delay (in ms) between scroll repetitions */ 237 #define SCROLL_REPEAT_DELAY 50 238 239 /* Minimum size of the thumb in pixels */ 240 #define SCROLL_MIN_THUMB 6 241 242 /* Minimum size of the rectangle between the arrows */ 243 #define SCROLL_MIN_RECT 4 244 245 LRESULT CALLBACK ThemeWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, WNDPROC DefWndProc); 246 void ThemeCalculateCaptionButtonsPos(HWND hWnd, HTHEME htheme); 247 void ThemeDrawScrollBar(PDRAW_CONTEXT pcontext, INT Bar, POINT* pt); 248 VOID NC_TrackScrollBar(HWND Wnd, WPARAM wParam, POINT Pt); 249 void ThemeInitDrawContext(PDRAW_CONTEXT pcontext, HWND hWnd, HRGN hRgn); 250 void ThemeCleanupDrawContext(PDRAW_CONTEXT pcontext); 251 PWND_DATA ThemeGetWndData(HWND hWnd); 252 HTHEME GetNCCaptionTheme(HWND hWnd, DWORD style); 253 HTHEME GetNCScrollbarTheme(HWND hWnd, DWORD style); 254 255 extern HINSTANCE hDllInst; 256 extern ATOM atWindowTheme; 257 extern ATOM atWndContext; 258 extern BOOL g_bThemeHooksActive; 259 260 void UXTHEME_InitSystem(HINSTANCE hInst); 261 void UXTHEME_LoadTheme(BOOL bLoad); 262 BOOL CALLBACK UXTHEME_broadcast_theme_changed (HWND hWnd, LPARAM enable); 263 264 /* No alpha blending */ 265 #define ALPHABLEND_NONE 0 266 /* "Cheap" binary alpha blending - but possibly faster */ 267 #define ALPHABLEND_BINARY 1 268 /* Full alpha blending */ 269 #define ALPHABLEND_FULL 2 270 271 #endif /* _UXTHEME_PCH_ */ 272