[COMCTL32_APITEST] -Get rid of some hardcoded values.
[reactos.git] / rostests / apitests / comctl32 / button.c
1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for Button window class v6
5 * PROGRAMMERS: Giannis Adamopoulos
6 */
7
8 #include "wine/test.h"
9 #include <stdio.h>
10 #include <windows.h>
11 #include <commctrl.h>
12 #include <uxtheme.h>
13 #include <undocuser.h>
14 #include <msgtrace.h>
15 #include <user32testhelpers.h>
16
17 #define ok_rect(rc, l,r,t,b) ok((rc.left == (l)) && (rc.right == (r)) && (rc.top == (t)) && (rc.bottom == (b)), "Wrong rect. expected %d, %d, %d, %d got %ld, %ld, %ld, %ld\n", l,t,r,b, rc.left, rc.top, rc.right, rc.bottom)
18 #define ok_size(s, width, height) ok((s.cx == (width) && s.cy == (height)), "Expected size (%lu,%lu) got (%lu,%lu)\n", (LONG)width, (LONG)height, s.cx, s.cy)
19
20 void Test_TextMargin()
21 {
22 RECT rc;
23 BOOL ret;
24 HWND hwnd1;
25
26 hwnd1 = CreateWindowW(L"Button", L"Test1", 0, 10, 10, 100, 100, 0, NULL, NULL, NULL);
27 ok (hwnd1 != NULL, "Expected CreateWindowW to succeed\n");
28 SetWindowTheme(hwnd1, L"", L"");
29
30 ret = SendMessageW(hwnd1, BCM_GETTEXTMARGIN, 0, (LPARAM)&rc);
31 ok (ret == TRUE, "Expected BCM_GETTEXTMARGIN to succeed\n");
32 ok_rect(rc, 1, 1, 1, 1);
33
34 SetRect(&rc, 0,0,0,0);
35 ret = SendMessageW(hwnd1, BCM_SETTEXTMARGIN, 0, (LPARAM)&rc);
36 ok (ret == TRUE, "Expected BCM_SETTEXTMARGIN to succeed\n");
37
38 ret = SendMessageW(hwnd1, BCM_GETTEXTMARGIN, 0, (LPARAM)&rc);
39 ok (ret == TRUE, "Expected BCM_GETTEXTMARGIN to succeed\n");
40 ok_rect(rc, 0, 0, 0, 0);
41
42 SetRect(&rc, -1,-1,-1,-1);
43 ret = SendMessageW(hwnd1, BCM_SETTEXTMARGIN, 0, (LPARAM)&rc);
44 ok (ret == TRUE, "Expected BCM_SETTEXTMARGIN to succeed\n");
45
46 ret = SendMessageW(hwnd1, BCM_GETTEXTMARGIN, 0, (LPARAM)&rc);
47 ok (ret == TRUE, "Expected BCM_GETTEXTMARGIN to succeed\n");
48 ok_rect(rc, -1, -1, -1, -1);
49
50 SetRect(&rc, 1000,1000,1000,1000);
51 ret = SendMessageW(hwnd1, BCM_SETTEXTMARGIN, 0, (LPARAM)&rc);
52 ok (ret == TRUE, "Expected BCM_SETTEXTMARGIN to succeed\n");
53
54 ret = SendMessageW(hwnd1, BCM_GETTEXTMARGIN, 0, (LPARAM)&rc);
55 ok (ret == TRUE, "Expected BCM_GETTEXTMARGIN to succeed\n");
56 ok_rect(rc, 1000, 1000, 1000, 1000);
57
58 DestroyWindow(hwnd1);
59
60 hwnd1 = CreateWindowW(L"Button", L"Test1", BS_DEFPUSHBUTTON, 10, 10, 100, 100, 0, NULL, NULL, NULL);
61 ok (hwnd1 != NULL, "Expected CreateWindowW to succeed\n");
62 SetWindowTheme(hwnd1, L"", L"");
63
64 ret = SendMessageW(hwnd1, BCM_GETTEXTMARGIN, 0, (LPARAM)&rc);
65 ok (ret == TRUE, "Expected BCM_GETTEXTMARGIN to succeed\n");
66 ok_rect(rc, 1, 1, 1, 1);
67
68 DestroyWindow(hwnd1);
69
70 }
71
72 void Test_Imagelist()
73 {
74 HWND hwnd1;
75 BOOL ret;
76 BUTTON_IMAGELIST imlData;
77
78 hwnd1 = CreateWindowW(L"Button", L"Test2", 0, 10, 10, 100, 100, 0, NULL, NULL, NULL);
79 ok (hwnd1 != NULL, "Expected CreateWindowW to succeed\n");
80
81 ret = SendMessageW(hwnd1, BCM_GETIMAGELIST, 0, (LPARAM)&imlData);
82 ok (ret == TRUE, "Expected BCM_GETIMAGELIST to succeed\n");
83 ok (imlData.himl == 0, "Expected 0 himl\n");
84 ok (imlData.uAlign == 0, "Expected 0 uAlign\n");
85 ok_rect(imlData.margin, 0, 0, 0, 0);
86
87 SetRect(&imlData.margin, 0,0,0,1);
88 ret = SendMessageW(hwnd1, BCM_SETIMAGELIST, 0, (LPARAM)&imlData);
89 ok (ret == FALSE, "Expected BCM_SETIMAGELIST to fail\n"); /* This works in win10 */
90
91 imlData.himl = (HIMAGELIST)0xdead;
92 ret = SendMessageW(hwnd1, BCM_SETIMAGELIST, 0, (LPARAM)&imlData);
93 ok (ret == TRUE, "Expected BCM_SETIMAGELIST to fail\n");
94
95 ret = SendMessageW(hwnd1, BCM_GETIMAGELIST, 0, (LPARAM)&imlData);
96 ok (ret == TRUE, "Expected BCM_GETIMAGELIST to succeed\n");
97 ok (imlData.himl == (HIMAGELIST)0xdead, "Expected 0 himl\n");
98 ok (imlData.uAlign == 0, "Expected 0 uAlign\n");
99 ok_rect(imlData.margin, 0, 0, 0, 1);
100
101 imlData.himl = 0;
102 ret = SendMessageW(hwnd1, BCM_SETIMAGELIST, 0, (LPARAM)&imlData);
103 ok (ret == FALSE, "Expected BCM_SETIMAGELIST to fail\n"); /* This works in win10 */
104
105 DestroyWindow(hwnd1);
106 }
107
108 void Test_GetIdealSizeNoThemes()
109 {
110 HWND hwnd1, hwnd2;
111 BOOL ret;
112 SIZE s, textent;
113 HFONT font;
114 HDC hdc;
115 HANDLE hbmp;
116 HIMAGELIST himl;
117 BUTTON_IMAGELIST imlData;
118 RECT rc;
119 LOGFONTW lf;
120 DWORD i;
121
122 hwnd2 = CreateWindowW(L"Static", L"", 0, 0, 0, 100, 100, 0, NULL, NULL, NULL);
123 ok (hwnd2 != NULL, "Expected CreateWindowW to succeed\n");
124
125 hwnd1 = CreateWindowW(L"Button", L" ", WS_CHILD, 10, 10, 100, 100, hwnd2, NULL, NULL, NULL);
126 ok (hwnd1 != NULL, "Expected CreateWindowW to succeed\n");
127 SetWindowTheme(hwnd1, L"", L"");
128
129 font = (HFONT)SendMessageW(hwnd1, WM_GETFONT, 0, 0);
130 hdc = GetDC(hwnd1);
131 SelectObject(hdc, font);
132 GetTextExtentPoint32W(hdc, L" ", 1, &textent);
133
134 memset(&s, 0, sizeof(s));
135 ret = SendMessageW(hwnd1, BCM_GETIDEALSIZE, 0, (LPARAM)&s);
136 ok (ret == TRUE, "Expected BCM_GETIDEALSIZE to succeed\n");
137 ok_size(s, textent.cx + 5 + 2,
138 textent.cy + 7 + 2); /* the last +2 is the text margin */
139
140 DestroyWindow(hwnd1);
141
142
143 hwnd1 = CreateWindowW(L"Button", L" ", BS_USERBUTTON | WS_CHILD, 10, 10, 100, 100, hwnd2, NULL, NULL, NULL);
144 ok (hwnd1 != NULL, "Expected CreateWindowW to succeed\n");
145 SetWindowTheme(hwnd1, L"", L"");
146
147 memset(&s, 0, sizeof(s));
148 ret = SendMessageW(hwnd1, BCM_GETIDEALSIZE, 0, (LPARAM)&s);
149 ok (ret == TRUE, "Expected BCM_GETIDEALSIZE to succeed\n");
150 ok_size(s, textent.cx + 5 + 2,
151 textent.cy + 7 + 2); /* the last +2 is the text margin */
152
153 DestroyWindow(hwnd1);
154
155
156
157 hwnd1 = CreateWindowW(L"Button", L"", WS_CHILD, 10, 10, 100, 100, hwnd2, NULL, NULL, NULL);
158 ok (hwnd1 != NULL, "Expected CreateWindowW to succeed\n");
159 SetWindowTheme(hwnd1, L"", L"");
160
161 s.cx = 1;
162 s.cy = 1;
163 ret = SendMessageW(hwnd1, BCM_GETIDEALSIZE, 0, (LPARAM)&s);
164 ok (ret == TRUE, "Expected BCM_GETIDEALSIZE to succeed\n");
165 ok_size(s, 100, 100);
166
167 hbmp = LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(5), IMAGE_BITMAP, 0, 0, 0);
168 ok (hbmp != 0, "Expected LoadImage to succeed\n");
169
170 SendMessageW(hwnd1, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hbmp);
171
172 memset(&s, 0, sizeof(s));
173 ret = SendMessageW(hwnd1, BCM_GETIDEALSIZE, 0, (LPARAM)&s);
174 ok (ret == TRUE, "Expected BCM_GETIDEALSIZE to succeed\n");
175 ok_size(s, 100, 100);
176
177 himl = ImageList_LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(5), 1, 1, 0, IMAGE_BITMAP, 0);
178 ok (himl != 0, "Expected ImageList_LoadImage to succeed\n");
179
180 memset(&imlData, 0, sizeof(imlData));
181 imlData.himl = himl;
182 ret = SendMessageW(hwnd1, BCM_SETIMAGELIST, 0, (LPARAM)&imlData);
183 ok (ret == TRUE, "Expected BCM_SETIMAGELIST to fail\n"); /* This works in win10 */
184
185 memset(&s, 0, sizeof(s));
186 ret = SendMessageW(hwnd1, BCM_GETIDEALSIZE, 0, (LPARAM)&s);
187 ok (ret == TRUE, "Expected BCM_GETIDEALSIZE to succeed\n");
188 ok_size(s, 100, 100);
189
190 DestroyWindow(hwnd1);
191
192
193
194
195
196 hwnd1 = CreateWindowW(L"Button", L"", WS_CHILD, 10, 10, 5, 5, hwnd2, NULL, NULL, NULL);
197 ok (hwnd1 != NULL, "Expected CreateWindowW to succeed\n");
198 SetWindowTheme(hwnd1, L"", L"");
199
200 memset(&s, 0, sizeof(s));
201 ret = SendMessageW(hwnd1, BCM_GETIDEALSIZE, 0, (LPARAM)&s);
202 ok (ret == TRUE, "Expected BCM_GETIDEALSIZE to succeed\n");
203 ok_size(s, 5, 5);
204
205 DestroyWindow(hwnd1);
206
207
208
209
210 hwnd1 = CreateWindowW(L"Button", L" ", BS_BITMAP | WS_CHILD, 10, 10, 100, 100, hwnd2, NULL, NULL, NULL);
211 ok (hwnd1 != NULL, "Expected CreateWindowW to succeed\n");
212 SetWindowTheme(hwnd1, L"", L"");
213
214 SendMessageW(hwnd1, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hbmp);
215
216 memset(&s, 0, sizeof(s));
217 ret = SendMessageW(hwnd1, BCM_GETIDEALSIZE, 0, (LPARAM)&s);
218 ok (ret == TRUE, "Expected BCM_GETIDEALSIZE to succeed\n");
219
220 /* In xp and 2k3 the image is ignored, in vista+ its width is added to the text width */
221 ok_size(s, textent.cx + 5 + 2,
222 textent.cy + 7 + 2); /* the last +2 is the text margin */
223
224 DestroyWindow(hwnd1);
225
226
227
228 hwnd1 = CreateWindowW(L"Button", L" ", WS_CHILD, 10, 10, 100, 100, hwnd2, NULL, NULL, NULL);
229 ok (hwnd1 != NULL, "Expected CreateWindowW to succeed\n");
230 SetWindowTheme(hwnd1, L"", L"");
231
232 SetRect(&rc, 0,0,0,0);
233 ret = SendMessageW(hwnd1, BCM_SETTEXTMARGIN, 0, (LPARAM)&rc);
234 ok (ret == TRUE, "Expected BCM_SETTEXTMARGIN to succeed\n");
235
236 memset(&s, 0, sizeof(s));
237 ret = SendMessageW(hwnd1, BCM_GETIDEALSIZE, 0, (LPARAM)&s);
238 ok (ret == TRUE, "Expected BCM_GETIDEALSIZE to succeed\n");
239 ok_size(s, textent.cx + 5,
240 textent.cy + 7);
241
242 SetRect(&rc, 50,50,50,50);
243 ret = SendMessageW(hwnd1, BCM_SETTEXTMARGIN, 0, (LPARAM)&rc);
244 ok (ret == TRUE, "Expected BCM_SETTEXTMARGIN to succeed\n");
245
246 memset(&s, 0, sizeof(s));
247 ret = SendMessageW(hwnd1, BCM_GETIDEALSIZE, 0, (LPARAM)&s);
248 ok (ret == TRUE, "Expected BCM_GETIDEALSIZE to succeed\n");
249 ok_size(s, textent.cx + 5 + 100,
250 textent.cy + 7 + 100);
251
252 SetRect(&rc, 1,1,1,1);
253 ret = SendMessageW(hwnd1, BCM_SETTEXTMARGIN, 0, (LPARAM)&rc);
254 ok (ret == TRUE, "Expected BCM_SETTEXTMARGIN to succeed\n");
255
256 ret = SendMessageW(hwnd1, BCM_SETIMAGELIST, 0, (LPARAM)&imlData);
257 ok (ret == TRUE, "Expected BCM_SETIMAGELIST to fail\n");
258
259 memset(&s, 0, sizeof(s));
260 ret = SendMessageW(hwnd1, BCM_GETIDEALSIZE, 0, (LPARAM)&s);
261 ok (ret == TRUE, "Expected BCM_GETIDEALSIZE to succeed\n");
262 ok_size(s, textent.cx + 5 + 2 + 1, /* we get an extra pixel due to the iml */
263 textent.cy + 7 + 2);
264
265 s.cx = 1;
266 s.cy = 1;
267 ret = SendMessageW(hwnd1, BCM_GETIDEALSIZE, 0, (LPARAM)&s);
268 ok (ret == TRUE, "Expected BCM_GETIDEALSIZE to succeed\n");
269 ok_size(s, textent.cx + 5 + 2 + 1,
270 textent.cy + 7 + 2);
271
272 s.cx = 100;
273 s.cy = 100;
274 ret = SendMessageW(hwnd1, BCM_GETIDEALSIZE, 0, (LPARAM)&s);
275 ok (ret == TRUE, "Expected BCM_GETIDEALSIZE to succeed\n");
276 ok_size(s, textent.cx + 5 + 2 + 1,
277 textent.cy + 7 + 2);
278
279 SetRect(&imlData.margin, 1,1,1,1);
280 ret = SendMessageW(hwnd1, BCM_SETIMAGELIST, 0, (LPARAM)&imlData);
281 ok (ret == TRUE, "Expected BCM_SETIMAGELIST to fail\n");
282
283 memset(&s, 0, sizeof(s));
284 ret = SendMessageW(hwnd1, BCM_GETIDEALSIZE, 0, (LPARAM)&s);
285 ok (ret == TRUE, "Expected BCM_GETIDEALSIZE to succeed\n");
286 /* expected width = text width + hardcoded value + text margins + image width + image margins */
287 ok_size(s, textent.cx + 5 + 2 + 1 + 2,
288 textent.cy + 7 + 2);
289
290 SetRect(&imlData.margin, 50,50,50,50);
291 ret = SendMessageW(hwnd1, BCM_SETIMAGELIST, 0, (LPARAM)&imlData);
292 ok (ret == TRUE, "Expected BCM_SETIMAGELIST to fail\n");
293
294 memset(&s, 0, sizeof(s));
295 ret = SendMessageW(hwnd1, BCM_GETIDEALSIZE, 0, (LPARAM)&s);
296 ok (ret == TRUE, "Expected BCM_GETIDEALSIZE to succeed\n");
297 /* image + its margins is so big that the height is dictated by them */
298 ok_size(s, textent.cx + 5 + 2 + 1 + 100, (LONG)101);
299
300 DestroyWindow(hwnd1);
301
302
303
304
305
306
307 hwnd1 = CreateWindowW(L"Button", L"Start", BS_VCENTER | WS_CHILD, 0, 0, 0, 0, hwnd2, NULL, NULL, NULL);
308 ok (hwnd1 != NULL, "Expected CreateWindowW to succeed\n");
309 SetWindowTheme(hwnd1, L"", L"");
310
311 font = (HFONT)SendMessageW(hwnd1, WM_GETFONT, 0, 0);
312 hdc = GetDC(hwnd1);
313 SelectObject(hdc, font);
314 GetTextExtentPoint32W(hdc, L"Start", 5, &textent);
315
316 SetRect(&rc, 0,0,0,0);
317 ret = SendMessageW(hwnd1, BCM_SETTEXTMARGIN, 0, (LPARAM)&rc);
318 ok (ret == TRUE, "Expected BCM_SETTEXTMARGIN to succeed\n");
319
320 memset(&s, 0, sizeof(s));
321 ret = SendMessageW(hwnd1, BCM_GETIDEALSIZE, 0, (LPARAM)&s);
322 ok (ret == TRUE, "Expected BCM_GETIDEALSIZE to succeed\n");
323 ok_size(s, textent.cx + 5, textent.cy + 7);
324
325 DestroyWindow(hwnd1);
326
327
328
329
330 /* Test again with some real text to see if the formula is correct */
331 hwnd1 = CreateWindowW(L"Button", L"Some test text", WS_CHILD, 10, 10, 100, 100, hwnd2, NULL, NULL, NULL);
332 ok (hwnd1 != NULL, "Expected CreateWindowW to succeed\n");
333 SetWindowTheme(hwnd1, L"", L"");
334
335 font = (HFONT)SendMessageW(hwnd1, WM_GETFONT, 0, 0);
336 hdc = GetDC(hwnd1);
337 SelectObject(hdc, font);
338 GetTextExtentPoint32W(hdc, L"Some test text", 14, &textent);
339
340 memset(&s, 0, sizeof(s));
341 ret = SendMessageW(hwnd1, BCM_GETIDEALSIZE, 0, (LPARAM)&s);
342 ok (ret == TRUE, "Expected BCM_GETIDEALSIZE to succeed\n");
343 ok_size(s, textent.cx + 5 + 2, /* the last +2 is the text margin */
344 textent.cy + 7 + 2);
345
346 /* The hardcoded values are independent of the margin */
347 lf.lfHeight = 200;
348 lf.lfWidth = 200;
349 lf.lfWeight = FW_BOLD;
350 wcscpy(lf.lfFaceName, L"Arial");
351 font = CreateFontIndirectW(&lf);
352 ok(font != NULL, "\n");
353 SendMessageW(hwnd1, WM_SETFONT, (WPARAM)font, FALSE);
354
355 SelectObject(hdc, font);
356 GetTextExtentPoint32W(hdc, L"Some test text", 14, &textent);
357
358 memset(&s, 0, sizeof(s));
359 ret = SendMessageW(hwnd1, BCM_GETIDEALSIZE, 0, (LPARAM)&s);
360 ok (ret == TRUE, "Expected BCM_GETIDEALSIZE to succeed\n");
361 ok_size(s, textent.cx + 5 + 2, /* the last +2 is the text margin */
362 textent.cy + 7 + 2);
363
364 DestroyWindow(hwnd1);
365
366 for (i = BS_PUSHBUTTON; i <= BS_OWNERDRAW; i++)
367 {
368 if (i == BS_USERBUTTON)
369 continue;
370
371 if (i >= BS_CHECKBOX)
372 {
373 hwnd1 = CreateWindowW(L"Button", L" ", i|WS_CHILD, 0, 0, 72, 72, hwnd2, NULL, NULL, NULL);
374 ok (hwnd1 != NULL, "Expected CreateWindowW to succeed\n");
375 memset(&s, 0, sizeof(s));
376 ret = SendMessageW(hwnd1, BCM_GETIDEALSIZE, 0, (LPARAM)&s);
377 ok (ret == TRUE, "Expected BCM_GETIDEALSIZE to succeed\n");
378 ok_size(s, 72, 72);
379
380 SetWindowTheme(hwnd1, L"", L"");
381 memset(&s, 0, sizeof(s));
382 ret = SendMessageW(hwnd1, BCM_GETIDEALSIZE, 0, (LPARAM)&s);
383 ok (ret == TRUE, "Expected BCM_GETIDEALSIZE to succeed\n");
384 ok_size(s, 72, 72);
385 DestroyWindow(hwnd1);
386
387 hwnd1 = CreateWindowW(L"Button", L" ", i|WS_CHILD, 0, 0, 12, 12, hwnd2, NULL, NULL, NULL);
388 ok (hwnd1 != NULL, "Expected CreateWindowW to succeed\n");
389 memset(&s, 0, sizeof(s));
390 ret = SendMessageW(hwnd1, BCM_GETIDEALSIZE, 0, (LPARAM)&s);
391 ok (ret == TRUE, "Expected BCM_GETIDEALSIZE to succeed\n");
392 ok_size(s, 12, 12);
393 DestroyWindow(hwnd1);
394 }
395
396 hwnd1 = CreateWindowW(L"Button", L"", i|WS_CHILD, 0, 0, 72, 72, hwnd2, NULL, NULL, NULL);
397 ok (hwnd1 != NULL, "Expected CreateWindowW to succeed\n");
398 memset(&s, 0, sizeof(s));
399 ret = SendMessageW(hwnd1, BCM_GETIDEALSIZE, 0, (LPARAM)&s);
400 ok (ret == TRUE, "Expected BCM_GETIDEALSIZE to succeed\n");
401 ok_size(s, 72, 72);
402 DestroyWindow(hwnd1);
403
404 hwnd1 = CreateWindowW(L"Button", L"", i|WS_CHILD, 0, 0, 150, 72, hwnd2, NULL, NULL, NULL);
405 ok (hwnd1 != NULL, "Expected CreateWindowW to succeed\n");
406 memset(&s, 0, sizeof(s));
407 ret = SendMessageW(hwnd1, BCM_GETIDEALSIZE, 0, (LPARAM)&s);
408 ok (ret == TRUE, "Expected BCM_GETIDEALSIZE to succeed\n");
409 ok_size(s, 150, 72);
410 DestroyWindow(hwnd1);
411 }
412 DestroyWindow(hwnd2);
413 }
414
415
416 HWND hWnd1, hWnd2;
417
418 #define MOVE_CURSOR(x,y) mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE , \
419 x*(65535/GetSystemMetrics(SM_CXVIRTUALSCREEN)), \
420 y*(65535/GetSystemMetrics(SM_CYVIRTUALSCREEN)) , 0,0);
421
422 static int get_iwnd(HWND hWnd)
423 {
424 if(hWnd == hWnd1) return 1;
425 else if(hWnd == hWnd2) return 2;
426 else return 0;
427 }
428
429 static LRESULT CALLBACK subclass_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, UINT_PTR id, DWORD_PTR ref_data)
430 {
431 int iwnd = get_iwnd(hwnd);
432
433 if(message > WM_USER || !iwnd )
434 return DefSubclassProc(hwnd, message, wParam, lParam);
435
436 switch(message)
437 {
438 case WM_IME_SETCONTEXT:
439 case WM_IME_NOTIFY :
440 case WM_GETICON :
441 case WM_GETTEXT:
442 case WM_GETTEXTLENGTH:
443 break;
444 case WM_NOTIFY:
445 {
446 NMHDR* pnmhdr = (NMHDR*)lParam;
447 RECORD_MESSAGE(iwnd, message, SENT, pnmhdr->idFrom,pnmhdr->code);
448 break;
449 }
450 default:
451 RECORD_MESSAGE(iwnd, message, SENT, 0,0);
452 }
453 return DefSubclassProc(hwnd, message, wParam, lParam);
454 }
455
456 static LRESULT CALLBACK TestProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
457 {
458 int iwnd = get_iwnd(hwnd);
459
460 if (iwnd != 0 && message == WM_NOTIFY)
461 {
462 NMHDR* pnmhdr = (NMHDR*)lParam;
463 RECORD_MESSAGE(iwnd, message, SENT, pnmhdr->idFrom,pnmhdr->code);
464 }
465 else if (iwnd != 0 && message < WM_USER && message != WM_GETICON)
466 {
467 RECORD_MESSAGE(iwnd, message, SENT, 0,0);
468 }
469
470 return DefWindowProc(hwnd, message, wParam, lParam);
471 }
472
473 static void FlushMessages()
474 {
475 MSG msg;
476
477 while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE ))
478 {
479 int iwnd = get_iwnd(msg.hwnd);
480 if(iwnd)
481 {
482 if(msg.message <= WM_USER && iwnd != 0)
483 RECORD_MESSAGE(iwnd, msg.message, POST,0,0);
484 }
485 DispatchMessageW( &msg );
486 }
487 }
488
489 MSG_ENTRY erase_sequence[]={
490 {2, WM_PAINT, POST},
491 {1, WM_ERASEBKGND},
492 {1, WM_PRINTCLIENT},
493 {1, WM_CTLCOLORBTN},
494 {1, WM_NOTIFY, SENT, 0, NM_CUSTOMDRAW},
495 {1, WM_NOTIFY, SENT, 0, NM_CUSTOMDRAW},
496 {0,0}};
497
498 MSG_ENTRY erase_nonthemed_sequence[]={
499 {2, WM_PAINT, POST},
500 {1, WM_CTLCOLORBTN},
501 {1, WM_NOTIFY, SENT, 0, NM_CUSTOMDRAW},
502 {1, WM_NOTIFY, SENT, 0, NM_CUSTOMDRAW},
503 {0,0}};
504
505 MSG_ENTRY printclnt_nonthemed_sequence[]={
506 {2, WM_PRINTCLIENT},
507 {1, WM_CTLCOLORBTN},
508 {1, WM_NOTIFY, SENT, 0, NM_CUSTOMDRAW},
509 {1, WM_NOTIFY, SENT, 0, NM_CUSTOMDRAW},
510 {0,0}};
511
512 MSG_ENTRY printclnt_sequence[]={
513 {2, WM_PRINTCLIENT},
514 {1, WM_CTLCOLORBTN},
515 {1, WM_NOTIFY, SENT, 0, NM_CUSTOMDRAW},
516 {0,0}};
517
518 MSG_ENTRY pseudomove_sequence[]={
519 {2, WM_MOUSEMOVE},
520 {1, WM_NOTIFY, SENT, 0, BCN_HOTITEMCHANGE},
521 {2, WM_MOUSELEAVE, POST},
522 {1, WM_NOTIFY, SENT, 0, BCN_HOTITEMCHANGE},
523 {2, WM_PAINT, POST},
524 {2, WM_ERASEBKGND},
525 {1, WM_ERASEBKGND},
526 {1, WM_PRINTCLIENT},
527 {1, WM_CTLCOLORBTN},
528 {1, WM_NOTIFY, SENT, 0, NM_CUSTOMDRAW},
529 {1, WM_NOTIFY, SENT, 0, NM_CUSTOMDRAW},
530 {0,0}};
531
532 MSG_ENTRY pseudomove_nonthemed_sequence[]={
533 {2, WM_MOUSEMOVE},
534 {1, WM_NOTIFY, SENT, 0, BCN_HOTITEMCHANGE},
535 {2, WM_MOUSELEAVE, POST},
536 {1, WM_NOTIFY, SENT, 0, BCN_HOTITEMCHANGE},
537 {2, WM_PAINT, POST},
538 {2, WM_ERASEBKGND},
539 {1, WM_CTLCOLORBTN},
540 {1, WM_NOTIFY, SENT, 0, NM_CUSTOMDRAW},
541 {1, WM_NOTIFY, SENT, 0, NM_CUSTOMDRAW},
542 {0,0}};
543
544 MSG_ENTRY pseudohover_sequence[]={
545 {2, WM_MOUSEHOVER},
546 {0,0}};
547
548 MSG_ENTRY pseudoleave_sequence[]={
549 {2, WM_MOUSELEAVE},
550 {0,0}};
551
552 MSG_ENTRY mouseenter_sequence[]={
553 {2, WM_NCHITTEST},
554 {2, WM_SETCURSOR},
555 {1, WM_SETCURSOR},
556 {2, WM_MOUSEMOVE, POST},
557 {1, WM_NOTIFY, SENT, 0, BCN_HOTITEMCHANGE},
558 {2, WM_PAINT, POST},
559 {2, WM_ERASEBKGND},
560 {1, WM_ERASEBKGND},
561 {1, WM_PRINTCLIENT},
562 {1, WM_CTLCOLORBTN},
563 {1, WM_NOTIFY, SENT, 0, NM_CUSTOMDRAW},
564 {1, WM_NOTIFY, SENT, 0, NM_CUSTOMDRAW},
565 {0,0}};
566
567 MSG_ENTRY mouseenter_nonthemed_sequence[]={
568 {2, WM_NCHITTEST},
569 {2, WM_SETCURSOR},
570 {1, WM_SETCURSOR},
571 {2, WM_MOUSEMOVE, POST},
572 {1, WM_NOTIFY, SENT, 0, BCN_HOTITEMCHANGE},
573 {2, WM_PAINT, POST},
574 {2, WM_ERASEBKGND},
575 {1, WM_CTLCOLORBTN},
576 {1, WM_NOTIFY, SENT, 0, NM_CUSTOMDRAW},
577 {1, WM_NOTIFY, SENT, 0, NM_CUSTOMDRAW},
578 {0,0}};
579
580 MSG_ENTRY mousemove_sequence[]={
581 {2, WM_NCHITTEST},
582 {2, WM_SETCURSOR},
583 {1, WM_SETCURSOR},
584 {2, WM_MOUSEMOVE, POST},
585 {0,0}};
586
587 MSG_ENTRY mouseleave_sequence[]={
588 {2, WM_MOUSELEAVE, POST},
589 {1, WM_NOTIFY, SENT, 0, BCN_HOTITEMCHANGE},
590 {2, WM_PAINT, POST},
591 {2, WM_ERASEBKGND},
592 {1, WM_ERASEBKGND},
593 {1, WM_PRINTCLIENT},
594 {1, WM_CTLCOLORBTN},
595 {1, WM_NOTIFY, SENT, 0, NM_CUSTOMDRAW},
596 {1, WM_NOTIFY, SENT, 0, NM_CUSTOMDRAW},
597 {0,0}};
598
599 MSG_ENTRY mouseleave_nonthemed_sequence[]={
600 {2, WM_MOUSELEAVE, POST},
601 {1, WM_NOTIFY, SENT, 0, BCN_HOTITEMCHANGE},
602 {2, WM_PAINT, POST},
603 {2, WM_ERASEBKGND},
604 {1, WM_CTLCOLORBTN},
605 {1, WM_NOTIFY, SENT, 0, NM_CUSTOMDRAW},
606 {1, WM_NOTIFY, SENT, 0, NM_CUSTOMDRAW},
607 {0,0}};
608
609 void Test_MessagesNonThemed()
610 {
611 MOVE_CURSOR(0,0);
612
613 RegisterSimpleClass(TestProc, L"testClass");
614 hWnd1 = CreateWindowW(L"testClass", L"Test parent", WS_POPUP | WS_VISIBLE, 100, 100, 200, 200, 0, NULL, NULL, NULL);
615 ok (hWnd1 != NULL, "Expected CreateWindowW to succeed\n");
616 SetWindowTheme(hWnd1, L"", L"");
617 UpdateWindow(hWnd1);
618
619 hWnd2 = CreateWindowW(L"Button", L"test button", /*BS_RADIOBUTTON | */WS_CHILD | WS_VISIBLE, 0, 0, 100, 100, hWnd1, NULL, NULL, NULL);
620 ok (hWnd2 != NULL, "Expected CreateWindowW to succeed\n");
621 SetWindowTheme(hWnd2, L"", L"");
622 SetWindowSubclass(hWnd2, subclass_proc, 0, 0);
623 UpdateWindow(hWnd2);
624
625 FlushMessages();
626 EMPTY_CACHE();
627
628 RedrawWindow(hWnd2, NULL, NULL, RDW_ERASE);
629 FlushMessages();
630 COMPARE_CACHE(empty_chain);
631 FlushMessages();
632 COMPARE_CACHE(empty_chain);
633
634 RedrawWindow(hWnd2, NULL, NULL, RDW_FRAME);
635 FlushMessages();
636 COMPARE_CACHE(empty_chain);
637
638 RedrawWindow(hWnd2, NULL, NULL, RDW_INTERNALPAINT);
639 FlushMessages();
640 COMPARE_CACHE(erase_nonthemed_sequence);
641
642 RedrawWindow(hWnd2, NULL, NULL, RDW_INVALIDATE);
643 FlushMessages();
644 COMPARE_CACHE(erase_nonthemed_sequence);
645
646 SendMessageW(hWnd2, WM_PRINTCLIENT, 0, PRF_ERASEBKGND);
647 FlushMessages();
648 COMPARE_CACHE(printclnt_nonthemed_sequence);
649
650 SendMessageW(hWnd2, WM_MOUSEMOVE, 0, 0);
651 FlushMessages();
652 COMPARE_CACHE(pseudomove_nonthemed_sequence);
653
654 SendMessageW(hWnd2, WM_MOUSEHOVER, 0, 0);
655 FlushMessages();
656 COMPARE_CACHE(pseudohover_sequence);
657
658 SendMessageW(hWnd2, WM_MOUSELEAVE, 0, 0);
659 FlushMessages();
660 COMPARE_CACHE(pseudoleave_sequence);
661
662 MOVE_CURSOR(150,150);
663 FlushMessages();
664 COMPARE_CACHE(mouseenter_nonthemed_sequence);
665
666 MOVE_CURSOR(151,151);
667 FlushMessages();
668 COMPARE_CACHE(mousemove_sequence);
669
670 MOVE_CURSOR(0,0);
671 FlushMessages();
672 COMPARE_CACHE(empty_chain);
673 FlushMessages();
674 COMPARE_CACHE(mouseleave_nonthemed_sequence);
675
676 DestroyWindow(hWnd1);
677 DestroyWindow(hWnd2);
678 }
679
680 void Test_MessagesThemed()
681 {
682 MOVE_CURSOR(0,0);
683
684 RegisterSimpleClass(TestProc, L"testClass");
685 hWnd1 = CreateWindowW(L"testClass", L"Test parent", WS_POPUP | WS_VISIBLE, 100, 100, 200, 200, 0, NULL, NULL, NULL);
686 ok (hWnd1 != NULL, "Expected CreateWindowW to succeed\n");
687 UpdateWindow(hWnd1);
688
689 hWnd2 = CreateWindowW(L"Button", L"test button", /*BS_RADIOBUTTON | */WS_CHILD | WS_VISIBLE, 0, 0, 100, 100, hWnd1, NULL, NULL, NULL);
690 ok (hWnd2 != NULL, "Expected CreateWindowW to succeed\n");
691 SetWindowSubclass(hWnd2, subclass_proc, 0, 0);
692 UpdateWindow(hWnd2);
693
694 FlushMessages();
695 EMPTY_CACHE();
696
697 RedrawWindow(hWnd2, NULL, NULL, RDW_ERASE);
698 FlushMessages();
699 COMPARE_CACHE(empty_chain);
700 FlushMessages();
701 COMPARE_CACHE(empty_chain);
702
703 RedrawWindow(hWnd2, NULL, NULL, RDW_FRAME);
704 FlushMessages();
705 COMPARE_CACHE(empty_chain);
706
707 RedrawWindow(hWnd2, NULL, NULL, RDW_INTERNALPAINT);
708 FlushMessages();
709 COMPARE_CACHE(erase_sequence);
710
711 RedrawWindow(hWnd2, NULL, NULL, RDW_INVALIDATE);
712 FlushMessages();
713 COMPARE_CACHE(erase_sequence);
714
715 SendMessageW(hWnd2, WM_PRINTCLIENT, 0, PRF_ERASEBKGND);
716 FlushMessages();
717 COMPARE_CACHE(printclnt_sequence);
718
719 SendMessageW(hWnd2, WM_MOUSEMOVE, 0, 0);
720 FlushMessages();
721 COMPARE_CACHE(pseudomove_sequence);
722
723 SendMessageW(hWnd2, WM_MOUSEHOVER, 0, 0);
724 FlushMessages();
725 COMPARE_CACHE(pseudohover_sequence);
726
727 SendMessageW(hWnd2, WM_MOUSELEAVE, 0, 0);
728 FlushMessages();
729 COMPARE_CACHE(pseudoleave_sequence);
730
731 MOVE_CURSOR(150,150);
732 FlushMessages();
733 COMPARE_CACHE(mouseenter_sequence);
734
735 MOVE_CURSOR(151,151);
736 FlushMessages();
737 COMPARE_CACHE(mousemove_sequence);
738
739 MOVE_CURSOR(0,0);
740 FlushMessages();
741 COMPARE_CACHE(empty_chain);
742 FlushMessages();
743 COMPARE_CACHE(mouseleave_sequence);
744
745 DestroyWindow(hWnd1);
746 DestroyWindow(hWnd2);
747 }
748
749 START_TEST(button)
750 {
751 LoadLibraryW(L"comctl32.dll"); /* same as statically linking to comctl32 and doing InitCommonControls */
752 Test_TextMargin();
753 Test_Imagelist();
754 Test_GetIdealSizeNoThemes();
755
756 Test_MessagesNonThemed();
757 if (IsThemeActive())
758 Test_MessagesThemed();
759 else
760 skip("No active theme, skipping Test_MessagesThemed\n");
761
762 }
763