[UXTHEME] Add missing THEME_BUTTON_STATES
[reactos.git] / dll / win32 / uxtheme / uxthemep.h
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_ */