ReactOS 0.4.16-dev-336-gb667d82
button.c
Go to the documentation of this file.
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
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
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
109{
110 HWND hwnd1, hwnd2;
111 BOOL ret;
112 SIZE s, textent;
113 HFONT font;
114 HDC hdc;
115 HANDLE hbmp;
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);
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
168 ok (hbmp != 0, "Expected LoadImage to succeed\n");
169
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
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
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);
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);
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");
352 ok(font != NULL, "\n");
354
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
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
422static 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
430{
431 int iwnd = get_iwnd(hwnd);
432
433 if(message > WM_USER || !iwnd )
435
436 switch(message)
437 {
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 if (pnmhdr->code == NM_CUSTOMDRAW)
448 {
450 RECORD_MESSAGE(iwnd, message, SENT, pnmhdr->code, pnmcd->dwDrawStage);
451 }
452 else
453 {
454 RECORD_MESSAGE(iwnd, message, SENT, pnmhdr->idFrom,pnmhdr->code);
455 }
456 break;
457 }
458 default:
459 RECORD_MESSAGE(iwnd, message, SENT, 0,0);
460 }
462}
463
465{
466 int iwnd = get_iwnd(hwnd);
467
468 if (iwnd != 0 && message == WM_NOTIFY)
469 {
470 NMHDR* pnmhdr = (NMHDR*)lParam;
471 if (pnmhdr->code == NM_CUSTOMDRAW)
472 {
474 RECORD_MESSAGE(iwnd, message, SENT, pnmhdr->code, pnmcd->dwDrawStage);
475 }
476 else
477 {
478 RECORD_MESSAGE(iwnd, message, SENT, pnmhdr->idFrom,pnmhdr->code);
479 }
480 }
481 else if (iwnd != 0 && message < WM_USER && message != WM_GETICON)
482 {
483 RECORD_MESSAGE(iwnd, message, SENT, 0,0);
484 }
485
487}
488
489static void FlushMessages()
490{
491 MSG msg;
492
493 while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE ))
494 {
495 int iwnd = get_iwnd(msg.hwnd);
496 if(iwnd)
497 {
498 if(msg.message <= WM_USER && iwnd != 0)
499 RECORD_MESSAGE(iwnd, msg.message, POST,0,0);
500 }
502 }
503}
504
506 {2, WM_PAINT, POST},
507 {1, WM_ERASEBKGND},
508 {1, WM_PRINTCLIENT},
509 {1, WM_CTLCOLORBTN},
512 {0,0}};
513
515 {2, WM_PAINT, POST},
516 {1, WM_CTLCOLORBTN},
519 {0,0}};
520
522 {2, WM_PAINT, POST},
523 {2, WM_ERASEBKGND},
524 {1, WM_ERASEBKGND},
525 {1, WM_PRINTCLIENT},
526 {1, WM_CTLCOLORBTN},
529 {0,0}};
530
532 {2, WM_PAINT, POST},
533 {2, WM_ERASEBKGND},
534 {1, WM_CTLCOLORBTN},
537 {0,0}};
538
540 {2, WM_PRINTCLIENT},
541 {1, WM_CTLCOLORBTN},
544 {0,0}};
545
547 {2, WM_PRINTCLIENT},
548 {1, WM_CTLCOLORBTN},
550 {0,0}};
551
553 {2, WM_MOUSEMOVE},
555 {2, WM_MOUSELEAVE, POST},
557 {2, WM_PAINT, POST},
558 {2, WM_ERASEBKGND},
559 {1, WM_ERASEBKGND},
560 {1, WM_PRINTCLIENT},
561 {1, WM_CTLCOLORBTN},
564 {0,0}};
565
567 {2, WM_MOUSEMOVE},
569 {2, WM_MOUSELEAVE, POST},
571 {2, WM_PAINT, POST},
572 {2, WM_ERASEBKGND},
573 {1, WM_CTLCOLORBTN},
576 {0,0}};
577
579 {2, WM_MOUSEHOVER},
580 {0,0}};
581
583 {2, WM_MOUSELEAVE},
584 {0,0}};
585
587 {2, WM_NCHITTEST},
588 {2, WM_SETCURSOR},
589 {1, WM_SETCURSOR},
590 {2, WM_MOUSEMOVE, POST},
592 {2, WM_PAINT, POST},
593 {2, WM_ERASEBKGND},
594 {1, WM_ERASEBKGND},
595 {1, WM_PRINTCLIENT},
596 {1, WM_CTLCOLORBTN},
599 {0,0}};
600
602 {2, WM_NCHITTEST},
603 {2, WM_SETCURSOR},
604 {1, WM_SETCURSOR},
605 {2, WM_MOUSEMOVE, POST},
607 {2, WM_PAINT, POST},
608 {2, WM_ERASEBKGND},
609 {1, WM_CTLCOLORBTN},
612 {0,0}};
613
615 {2, WM_NCHITTEST},
616 {2, WM_SETCURSOR},
617 {1, WM_SETCURSOR},
618 {2, WM_MOUSEMOVE, POST},
619 {0,0}};
620
622 {2, WM_MOUSELEAVE, POST},
624 {2, WM_PAINT, POST},
625 {2, WM_ERASEBKGND},
626 {1, WM_ERASEBKGND},
627 {1, WM_PRINTCLIENT},
628 {1, WM_CTLCOLORBTN},
631 {0,0}};
632
634 {2, WM_MOUSELEAVE, POST},
636 {2, WM_PAINT, POST},
637 {2, WM_ERASEBKGND},
638 {1, WM_CTLCOLORBTN},
641 {0,0}};
642
644 {2, WM_THEMECHANGED, SENT},
645 {1, WM_NOTIFY, SENT, 0, NM_THEMECHANGED },
646 {2, WM_PAINT, POST},
647 {2, WM_ERASEBKGND},
648 {1, WM_CTLCOLORBTN},
651 {0,0}};
652
654 {2, WM_ENABLE, SENT},
655 {1, WM_CTLCOLORBTN},
656 {1, WM_CTLCOLORBTN},
659 {0,0}};
660
662 {2, WM_LBUTTONDOWN, SENT},
663 {1, WM_KILLFOCUS, SENT},
665 {2, WM_SETFOCUS, SENT},
666 {2, BM_SETSTATE, SENT},
667 {2, WM_PAINT, POST},
668 {1, WM_CTLCOLORBTN},
671 {0,0}};
672
674 {2, WM_LBUTTONDOWN, SENT},
675 {2, BM_SETSTATE, SENT},
676 {0,0}};
677
679 {2, BM_CLICK, SENT},
680 {2, WM_LBUTTONDOWN, SENT},
681 {2, BM_SETSTATE, SENT},
682 {2, WM_LBUTTONUP, SENT},
683 {2, BM_SETSTATE , SENT},
685 {1, WM_COMMAND, SENT},
686 {2, WM_PAINT, POST},
687 {1, WM_CTLCOLORBTN},
690 {0,0}};
691
693 {2, WM_LBUTTONUP, SENT},
694 {0,0}};
695
697{
698 DWORD state;
699
700 MOVE_CURSOR(0,0);
701 EMPTY_CACHE();
702
703 RegisterSimpleClass(TestProc, L"testClass");
704 hWnd1 = CreateWindowW(L"testClass", L"Test parent", WS_POPUP | WS_VISIBLE, 100, 100, 200, 200, 0, NULL, NULL, NULL);
705 ok (hWnd1 != NULL, "Expected CreateWindowW to succeed\n");
706 SetWindowTheme(hWnd1, L"", L"");
708
709 hWnd2 = CreateWindowW(L"Button", L"test button", /*BS_RADIOBUTTON | */WS_CHILD | WS_VISIBLE, 0, 0, 100, 100, hWnd1, NULL, NULL, NULL);
710 ok (hWnd2 != NULL, "Expected CreateWindowW to succeed\n");
711 SetWindowTheme(hWnd2, L"", L"");
714
716 EMPTY_CACHE();
717
723
727
731
735
739
743
747
751
755
757 ok_hex(state, 0);
758 EMPTY_CACHE();
759
760 MOVE_CURSOR(150,150);
763
766 EMPTY_CACHE();
767
768 MOVE_CURSOR(151,151);
771
774 EMPTY_CACHE();
775
776 MOVE_CURSOR(0,0);
781
783 ok(state == 0, "Expected state 0, got %lu\n", state);
784 EMPTY_CACHE();
785
786 SendMessageW(hWnd2, WM_THEMECHANGED, 1, 0);
789
793
797
799 ok_hex(state, BST_PUSHED | BST_FOCUS | 0x20 | 0x40);
800 EMPTY_CACHE();
801
805
807 ok_hex(state, BST_PUSHED | BST_FOCUS | 0x20 | 0x40);
808 EMPTY_CACHE();
809
813
816 EMPTY_CACHE();
817
821
824 EMPTY_CACHE();
825
828}
829
831{
832 DWORD state;
833
834 MOVE_CURSOR(0,0);
835 EMPTY_CACHE();
836
837 RegisterSimpleClass(TestProc, L"testClass");
838 hWnd1 = CreateWindowW(L"testClass", L"Test parent", WS_POPUP | WS_VISIBLE, 100, 100, 200, 200, 0, NULL, NULL, NULL);
839 ok (hWnd1 != NULL, "Expected CreateWindowW to succeed\n");
841
842 hWnd2 = CreateWindowW(L"Button", L"test button", /*BS_RADIOBUTTON | */WS_CHILD | WS_VISIBLE, 0, 0, 100, 100, hWnd1, NULL, NULL, NULL);
843 ok (hWnd2 != NULL, "Expected CreateWindowW to succeed\n");
846
848 EMPTY_CACHE();
849
855
859
863
867
871
875
879
883
887
891
893 ok(state == 0, "Expected state 0, got %lu", state);
894 EMPTY_CACHE();
895
896 MOVE_CURSOR(150,150);
899
901 ok(state == BST_HOT, "Expected state BST_HOT, got %lu", state);
902 EMPTY_CACHE();
903
904 MOVE_CURSOR(151,151);
907
909 ok(state == BST_HOT, "Expected state BST_HOT, got %lu", state);
910 EMPTY_CACHE();
911
912 MOVE_CURSOR(0,0);
917
919 ok(state == 0, "Expected state 0, got %lu", state);
920 EMPTY_CACHE();
921
924}
925
927{
928 LoadLibraryW(L"comctl32.dll"); /* same as statically linking to comctl32 and doing InitCommonControls */
932
934 if (IsThemeActive())
936 else
937 skip("No active theme, skipping Test_MessagesThemed\n");
938
939}
940
static int state
Definition: maze.c:121
#define ok_hex(expression, result)
Definition: atltest.h:94
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
#define START_TEST(x)
Definition: atltest.h:75
#define msg(x)
Definition: auth_time.c:54
HWND hWnd
Definition: settings.c:17
HBITMAP hbmp
HIMAGELIST himl
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
BOOL WINAPI SetWindowSubclass(HWND hWnd, SUBCLASSPROC pfnSubclass, UINT_PTR uIDSubclass, DWORD_PTR dwRef)
Definition: commctrl.c:1268
LRESULT WINAPI DefSubclassProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: commctrl.c:1503
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define CALLBACK
Definition: compat.h:35
#define LoadLibraryW(x)
Definition: compat.h:747
BOOL WINAPI IsThemeActive(void)
Definition: system.c:606
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLdouble s
Definition: gl.h:2039
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
MSG_ENTRY mouseleave_sequence[]
Definition: button.c:621
static void FlushMessages()
Definition: button.c:489
MSG_ENTRY btnclick_nonthemed_sequence[]
Definition: button.c:678
MSG_ENTRY redraw_nonthemed_sequence[]
Definition: button.c:531
MSG_ENTRY mouseenter_sequence[]
Definition: button.c:586
MSG_ENTRY mouseleave_nonthemed_sequence[]
Definition: button.c:633
#define ok_size(s, width, height)
Definition: button.c:18
#define MOVE_CURSOR(x, y)
Definition: button.c:418
#define ok_rect(rc, l, r, t, b)
Definition: button.c:17
MSG_ENTRY btndown_repeat_nonthemed_sequence[]
Definition: button.c:673
static int get_iwnd(HWND hWnd)
Definition: button.c:422
void Test_Imagelist()
Definition: button.c:72
MSG_ENTRY paint_nonthemed_sequence[]
Definition: button.c:514
MSG_ENTRY btnup_stray_sequence[]
Definition: button.c:692
HWND hWnd1
Definition: button.c:416
MSG_ENTRY redraw_sequence[]
Definition: button.c:521
MSG_ENTRY mouseenter_nonthemed_sequence[]
Definition: button.c:601
MSG_ENTRY themechanged_sequence[]
Definition: button.c:643
MSG_ENTRY paint_sequence[]
Definition: button.c:505
void Test_MessagesNonThemed()
Definition: button.c:696
MSG_ENTRY printclnt_sequence[]
Definition: button.c:546
void Test_MessagesThemed()
Definition: button.c:830
HWND hWnd2
Definition: button.c:416
MSG_ENTRY pseudohover_sequence[]
Definition: button.c:578
MSG_ENTRY pseudomove_sequence[]
Definition: button.c:552
void Test_GetIdealSizeNoThemes()
Definition: button.c:108
MSG_ENTRY printclnt_nonthemed_sequence[]
Definition: button.c:539
MSG_ENTRY enable_nonthemed_sequence[]
Definition: button.c:653
void Test_TextMargin()
Definition: button.c:20
static LRESULT CALLBACK subclass_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, UINT_PTR id, DWORD_PTR ref_data)
Definition: button.c:429
MSG_ENTRY mousemove_sequence[]
Definition: button.c:614
MSG_ENTRY pseudoleave_sequence[]
Definition: button.c:582
MSG_ENTRY pseudomove_nonthemed_sequence[]
Definition: button.c:566
MSG_ENTRY btndown_nonthemed_sequence[]
Definition: button.c:661
HDC hdc
Definition: main.c:9
DWORD button
Definition: button.c:166
static HDC
Definition: imagelist.c:88
static DWORD *static HFONT(WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDVA *)
MSG_ENTRY empty_chain[]
Definition: msgtrace.c:20
#define EMPTY_CACHE()
Definition: msgtrace.h:59
#define RECORD_MESSAGE(...)
Definition: msgtrace.h:60
#define COMPARE_CACHE(msg_chain)
Definition: msgtrace.h:57
@ POST
Definition: msgtrace.h:7
@ SENT
Definition: msgtrace.h:6
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
Definition: mk_font.cpp:20
unsigned int UINT
Definition: ndis.h:50
#define L(x)
Definition: ntvdm.h:50
#define WS_CHILD
Definition: pedump.c:617
#define BS_USERBUTTON
Definition: pedump.c:659
#define WS_POPUP
Definition: pedump.c:616
#define WS_VISIBLE
Definition: pedump.c:620
long LONG
Definition: pedump.c:60
#define BS_OWNERDRAW
Definition: pedump.c:661
#define BS_CHECKBOX
Definition: pedump.c:653
#define BS_PUSHBUTTON
Definition: pedump.c:651
#define BS_DEFPUSHBUTTON
Definition: pedump.c:652
#define BST_HOT
Definition: commctrl.h:4673
#define NM_THEMECHANGED
Definition: commctrl.h:147
#define ImageList_LoadImage
Definition: commctrl.h:508
struct _IMAGELIST * HIMAGELIST
Definition: commctrl.h:324
#define BCM_GETIDEALSIZE
Definition: commctrl.h:4644
#define NM_CUSTOMDRAW
Definition: commctrl.h:137
#define BCM_SETIMAGELIST
Definition: commctrl.h:4647
#define BCN_HOTITEMCHANGE
Definition: commctrl.h:260
#define BCM_SETTEXTMARGIN
Definition: commctrl.h:4653
#define WM_MOUSELEAVE
Definition: commctrl.h:4980
#define CDDS_PREPAINT
Definition: commctrl.h:280
#define WM_MOUSEHOVER
Definition: commctrl.h:4979
#define CDDS_PREERASE
Definition: commctrl.h:282
#define BCM_GETTEXTMARGIN
Definition: commctrl.h:4655
#define BCM_GETIMAGELIST
Definition: commctrl.h:4650
#define TestProc(n)
Definition: queuetest.c:15
#define WM_PRINTCLIENT
Definition: richedit.h:70
#define WM_NOTIFY
Definition: richedit.h:61
#define DefWindowProc
Definition: ros2win.h:31
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
#define memset(x, y, z)
Definition: compat.h:39
HIMAGELIST himl
Definition: commctrl.h:4639
LONG lfHeight
Definition: dimm.idl:59
LONG lfWeight
Definition: dimm.idl:63
WCHAR lfFaceName[LF_FACESIZE]
Definition: dimm.idl:72
LONG lfWidth
Definition: dimm.idl:60
Definition: msgtrace.h:15
LONG cx
Definition: kdterminal.h:27
LONG cy
Definition: kdterminal.h:28
Definition: tftpd.h:60
UINT_PTR idFrom
Definition: winuser.h:3161
UINT code
Definition: winuser.h:3162
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
uint32_t DWORD_PTR
Definition: typedefs.h:65
static __inline ATOM RegisterSimpleClass(WNDPROC lpfnWndProc, LPCWSTR lpszClassName)
HRESULT WINAPI SetWindowTheme(_In_ HWND hwnd, _In_ LPCWSTR pszSubAppName, _In_ LPCWSTR pszSubIdList)
Definition: uxthemesupp.c:69
int ret
#define GetModuleHandle
Definition: winbase.h:3852
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
LONG_PTR LPARAM
Definition: windef.h:208
LONG_PTR LRESULT
Definition: windef.h:209
UINT_PTR WPARAM
Definition: windef.h:207
#define FW_BOLD
Definition: wingdi.h:378
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1546
HFONT WINAPI CreateFontIndirectW(_In_ const LOGFONTW *)
BOOL WINAPI GetTextExtentPoint32W(_In_ HDC hdc, _In_reads_(c) LPCWSTR lpString, _In_ int c, _Out_ LPSIZE psizl)
#define WM_PAINT
Definition: winuser.h:1623
#define WM_ERASEBKGND
Definition: winuser.h:1628
#define BS_BITMAP
Definition: winuser.h:258
#define WM_GETTEXTLENGTH
Definition: winuser.h:1622
#define BM_GETSTATE
Definition: winuser.h:1923
BOOL WINAPI RedrawWindow(_In_opt_ HWND, _In_opt_ LPCRECT, _In_opt_ HRGN, _In_ UINT)
#define IMAGE_BITMAP
Definition: winuser.h:211
#define WM_ENABLE
Definition: winuser.h:1618
#define WM_IME_NOTIFY
Definition: winuser.h:1833
#define WM_CAPTURECHANGED
Definition: winuser.h:1811
#define PRF_ERASEBKGND
Definition: winuser.h:2529
#define BM_SETSTATE
Definition: winuser.h:1926
#define WM_COMMAND
Definition: winuser.h:1743
#define WM_NCHITTEST
Definition: winuser.h:1689
#define WM_SETFOCUS
Definition: winuser.h:1616
#define WM_MOUSEMOVE
Definition: winuser.h:1778
#define WM_GETTEXT
Definition: winuser.h:1621
#define RDW_ERASE
Definition: winuser.h:1214
#define WM_LBUTTONDOWN
Definition: winuser.h:1779
#define WM_GETFONT
Definition: winuser.h:1654
#define BM_SETIMAGE
Definition: winuser.h:1925
#define WM_IME_SETCONTEXT
Definition: winuser.h:1832
#define WM_CTLCOLORBTN
Definition: winuser.h:1772
#define WM_SETFONT
Definition: winuser.h:1653
#define BM_CLICK
Definition: winuser.h:1920
#define BST_PUSHED
Definition: winuser.h:201
#define PM_REMOVE
Definition: winuser.h:1199
#define RDW_FRAME
Definition: winuser.h:1215
BOOL WINAPI UpdateWindow(_In_ HWND)
#define BST_FOCUS
Definition: winuser.h:200
#define PeekMessage
Definition: winuser.h:5842
#define BS_VCENTER
Definition: winuser.h:279
HDC WINAPI GetDC(_In_opt_ HWND)
#define PRF_CLIENT
Definition: winuser.h:2528
#define CreateWindowW(a, b, c, d, e, f, g, h, i, j, k)
Definition: winuser.h:4319
#define WM_LBUTTONUP
Definition: winuser.h:1780
#define LoadImage
Definition: winuser.h:5827
LRESULT WINAPI DispatchMessageW(_In_ const MSG *)
#define WM_SETCURSOR
Definition: winuser.h:1639
#define WM_USER
Definition: winuser.h:1898
#define RDW_INTERNALPAINT
Definition: winuser.h:1216
BOOL WINAPI DestroyWindow(_In_ HWND)
#define MAKEINTRESOURCE
Definition: winuser.h:591
#define WM_KILLFOCUS
Definition: winuser.h:1617
#define RDW_INVALIDATE
Definition: winuser.h:1217
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI SetRect(_Out_ LPRECT, _In_ int, _In_ int, _In_ int, _In_ int)