ReactOS  0.4.15-dev-1033-gd7d716a
updown.c
Go to the documentation of this file.
1 /* Unit tests for the up-down control
2  *
3  * Copyright 2005 C. Scott Ananian
4  * Copyright (C) 2007 James Hawkins
5  * Copyright (C) 2007 Leslie Choong
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20  */
21 
22 /* TO TEST:
23  * - send click messages to the up-down control, check the current position
24  * - up-down control automatically positions itself next to its buddy window
25  * - up-down control sets the caption of the buddy window
26  * - test CreateUpDownControl API
27  * - check UDS_AUTOBUDDY style, up-down control selects previous window in z-order
28  * - check UDM_SETBUDDY message
29  * - check UDM_GETBUDDY message
30  * - up-down control and buddy control must have the same parent
31  * - check UDS_ALIGN[LEFT,RIGHT]...check that width of buddy window is decreased
32  * - check that UDS_SETBUDDYINT sets the caption of the buddy window when it is changed
33  * - check that the thousands operator is set for large numbers
34  * - check that the thousands operator is not set with UDS_NOTHOUSANDS
35  * - check UDS_ARROWKEYS, control subclasses the buddy window so that it processes the keys when it has focus
36  * - check UDS_HORZ
37  * - check changing past min/max values
38  * - check UDS_WRAP wraps values past min/max, incrementing past upper value wraps position to lower value
39  * - can change control's position, min/max pos, radix
40  * - check UDM_GETPOS, for up-down control with a buddy window, position is the caption of the buddy window, so change the
41  * caption of the buddy window then call UDM_GETPOS
42  * - check UDM_SETRANGE, max can be less than min, so clicking the up arrow decreases the current position
43  * - more stuff to test
44  */
45 
46 #include <windows.h>
47 #include <commctrl.h>
48 #include <stdio.h>
49 
50 #include "wine/test.h"
51 #include "msg.h"
52 
53 #define expect(EXPECTED,GOT) ok((GOT)==(EXPECTED), "Expected %d, got %d\n", (EXPECTED), (GOT))
54 
55 #define NUM_MSG_SEQUENCES 3
56 #define PARENT_SEQ_INDEX 0
57 #define EDIT_SEQ_INDEX 1
58 #define UPDOWN_SEQ_INDEX 2
59 
60 #define UPDOWN_ID 0
61 #define BUDDY_ID 1
62 
64 
65 static HWND (WINAPI *pCreateUpDownControl)(DWORD, INT, INT, INT, INT,
66  HWND, INT, HINSTANCE, HWND, INT, INT, INT);
67 static BOOL (WINAPI *pSetWindowSubclass)(HWND, SUBCLASSPROC, UINT_PTR, DWORD_PTR);
68 
70 
71 static const struct message add_updown_with_edit_seq[] = {
75  { WM_SIZE, sent|wparam|defwinproc, SIZE_RESTORED /*, MAKELONG(91, 75) exact size depends on font */ },
76  { 0 }
77 };
78 
79 static const struct message add_updown_to_parent_seq[] = {
80  { WM_NOTIFYFORMAT, sent|lparam, 0, NF_QUERY },
81  { WM_QUERYUISTATE, sent|optional },
83  { 0 }
84 };
85 
86 static const struct message get_edit_text_seq[] = {
87  { WM_GETTEXT, sent },
88  { 0 }
89 };
90 
91 static const struct message test_updown_pos_seq[] = {
92  { UDM_SETRANGE, sent|lparam, 0, MAKELONG(100,0) },
93  { UDM_GETRANGE, sent},
94  { UDM_SETPOS, sent|lparam, 0, 5},
95  { UDM_GETPOS, sent},
96  { UDM_SETPOS, sent|lparam, 0, 0},
97  { UDM_GETPOS, sent},
98  { UDM_SETPOS, sent|lparam, 0, MAKELONG(-1,0)},
99  { UDM_GETPOS, sent},
100  { UDM_SETPOS, sent|lparam, 0, 100},
101  { UDM_GETPOS, sent},
102  { UDM_SETPOS, sent|lparam, 0, 101},
103  { UDM_GETPOS, sent},
104  { 0 }
105 };
106 
107 static const struct message test_updown_pos32_seq[] = {
108  { UDM_SETRANGE32, sent|lparam, 0, 1000 },
109  { UDM_GETRANGE32, sent}, /* Cannot check wparam and lparam as they are ptrs */
110  { UDM_SETPOS32, sent|lparam, 0, 500 },
111  { UDM_GETPOS32, sent},
112  { UDM_SETPOS32, sent|lparam, 0, 0 },
113  { UDM_GETPOS32, sent},
114  { UDM_SETPOS32, sent|lparam, 0, -1 },
115  { UDM_GETPOS32, sent},
116  { UDM_SETPOS32, sent|lparam, 0, 1000 },
117  { UDM_GETPOS32, sent},
118  { UDM_SETPOS32, sent|lparam, 0, 1001 },
119  { UDM_GETPOS32, sent},
120  { 0 }
121 };
122 
123 static const struct message test_updown_buddy_seq[] = {
124  { UDM_GETBUDDY, sent },
125  { UDM_SETBUDDY, sent },
126  { WM_STYLECHANGING, sent|defwinproc },
127  { WM_STYLECHANGED, sent|defwinproc },
128  { WM_STYLECHANGING, sent|defwinproc },
129  { WM_STYLECHANGED, sent|defwinproc },
133  { WM_MOVE, sent|defwinproc },
134  { UDM_GETBUDDY, sent },
135  { 0 }
136 };
137 
138 static const struct message test_updown_base_seq[] = {
139  { UDM_SETBASE, sent|wparam, 10 },
140  { UDM_GETBASE, sent },
141  { UDM_SETBASE, sent|wparam, 80 },
142  { UDM_GETBASE, sent },
143  { UDM_SETBASE, sent|wparam, 16 },
144  { UDM_GETBASE, sent },
145  { UDM_SETBASE, sent|wparam, 80 },
146  { UDM_GETBASE, sent },
147  { UDM_SETBASE, sent|wparam, 10 },
148  { UDM_GETBASE, sent },
149  { 0 }
150 };
151 
152 static const struct message test_updown_unicode_seq[] = {
159  { 0 }
160 };
161 
162 static const struct message test_updown_pos_nochange_seq[] = {
163  { WM_GETTEXT, sent|id, 0, 0, BUDDY_ID },
164  { 0 }
165 };
166 
170  { WM_NOTIFY, sent|id, 0, 0, UDN_DELTAPOS },
176  /* no WM_NOTIFY(NM_RELEASEDCAPTURE) message */
177  { 0 }
178 };
179 
183  { WM_NOTIFY, sent|id, 0, 0, UDN_DELTAPOS },
189  /* no WM_NOTIFY(NM_RELEASEDCAPTURE) message */
190  { 0 }
191 };
192 
194 {
195  static LONG defwndproc_counter = 0;
196  struct message msg = { 0 };
197  LRESULT ret;
198 
199  /* log system messages, except for painting */
200  if (message < WM_USER &&
201  message != WM_PAINT &&
202  message != WM_ERASEBKGND &&
203  message != WM_NCPAINT &&
204  message != WM_NCHITTEST &&
205  message != WM_GETTEXT &&
206  message != WM_GETICON &&
208  {
209  msg.message = message;
210  msg.flags = sent|wparam|lparam;
211  if (defwndproc_counter) msg.flags |= defwinproc;
212  msg.wParam = wParam;
213  msg.lParam = lParam;
214  if (message == WM_NOTIFY && lParam)
215  msg.id = ((NMHDR*)lParam)->code;
217  }
218 
219  defwndproc_counter++;
221  defwndproc_counter--;
222 
223  return ret;
224 }
225 
227 {
228  WNDCLASSA cls;
229 
230  cls.style = 0;
232  cls.cbClsExtra = 0;
233  cls.cbWndExtra = 0;
235  cls.hIcon = 0;
236  cls.hCursor = LoadCursorA(0, (LPCSTR)IDC_ARROW);
238  cls.lpszMenuName = NULL;
239  cls.lpszClassName = "Up-Down test parent class";
240  return RegisterClassA(&cls);
241 }
242 
244 {
246  return NULL;
247 
248  return CreateWindowExA(0, "Up-Down test parent class",
249  "Up-Down test parent window",
252  0, 0, 100, 100,
254 }
255 
257 {
259  static LONG defwndproc_counter = 0;
260  struct message msg = { 0 };
261  LRESULT ret;
262 
263  msg.message = message;
264  msg.flags = sent|wparam|lparam;
265  if (defwndproc_counter) msg.flags |= defwinproc;
266  msg.wParam = wParam;
267  msg.lParam = lParam;
268  msg.id = BUDDY_ID;
270 
271  defwndproc_counter++;
272  ret = CallWindowProcA(oldproc, hwnd, message, wParam, lParam);
273  defwndproc_counter--;
274  return ret;
275 }
276 
278 {
279  WNDPROC oldproc;
280  HWND hwnd;
281  RECT rect;
282 
285  0, 0, rect.right, rect.bottom,
287  if (!hwnd) return NULL;
288 
292 
293  return hwnd;
294 }
295 
297 {
299  static LONG defwndproc_counter = 0;
300  struct message msg = { 0 };
301  LRESULT ret;
302 
303  msg.message = message;
304  msg.flags = sent|wparam|lparam;
305  if (defwndproc_counter) msg.flags |= defwinproc;
306  msg.wParam = wParam;
307  msg.lParam = lParam;
308  msg.id = UPDOWN_ID;
310 
311  defwndproc_counter++;
312  ret = CallWindowProcA(oldproc, hwnd, message, wParam, lParam);
313  defwndproc_counter--;
314 
315  return ret;
316 }
317 
319 {
320  WNDPROC oldproc;
321  HWND updown;
322  RECT rect;
323 
326  0, 0, rect.right, rect.bottom,
328  ok(updown != NULL, "Failed to create UpDown control.\n");
329  if (!updown) return NULL;
330 
331  SendMessageA(updown, UDM_SETBUDDY, (WPARAM)buddy, 0);
332  SendMessageA(updown, UDM_SETRANGE, 0, MAKELONG(100, 0));
333  SendMessageA(updown, UDM_SETPOS, 0, MAKELONG(50, 0));
334 
335  oldproc = (WNDPROC)SetWindowLongPtrA(updown, GWLP_WNDPROC,
337  SetWindowLongPtrA(updown, GWLP_USERDATA, (LONG_PTR)oldproc);
338 
339  return updown;
340 }
341 
342 static void test_updown_pos(void)
343 {
344  HWND updown;
345  int r;
346 
348 
350 
351  /* Set Range from 0 to 100 */
352  SendMessageA(updown, UDM_SETRANGE, 0 , MAKELONG(100,0) );
353  r = SendMessageA(updown, UDM_GETRANGE, 0,0);
354  expect(100,LOWORD(r));
355  expect(0,HIWORD(r));
356 
357  /* Set the position to 5, return is not checked as it was set before func call */
358  SendMessageA(updown, UDM_SETPOS, 0 , MAKELONG(5,0) );
359  /* Since UDM_SETBUDDYINT was not set at creation HIWORD(r) will always be 1 as a return from UDM_GETPOS */
360  /* Get the position, which should be 5 */
361  r = SendMessageA(updown, UDM_GETPOS, 0 , 0 );
362  expect(5,LOWORD(r));
363  expect(1,HIWORD(r));
364 
365  /* Set the position to 0, return should be 5 */
366  r = SendMessageA(updown, UDM_SETPOS, 0 , MAKELONG(0,0) );
367  expect(5,r);
368  /* Get the position, which should be 0 */
369  r = SendMessageA(updown, UDM_GETPOS, 0 , 0 );
370  expect(0,LOWORD(r));
371  expect(1,HIWORD(r));
372 
373  /* Set the position to -1, return should be 0 */
374  r = SendMessageA(updown, UDM_SETPOS, 0 , MAKELONG(-1,0) );
375  expect(0,r);
376  /* Get the position, which should be 0 */
377  r = SendMessageA(updown, UDM_GETPOS, 0 , 0 );
378  expect(0,LOWORD(r));
379  expect(1,HIWORD(r));
380 
381  /* Set the position to 100, return should be 0 */
382  r = SendMessageA(updown, UDM_SETPOS, 0 , MAKELONG(100,0) );
383  expect(0,r);
384  /* Get the position, which should be 100 */
385  r = SendMessageA(updown, UDM_GETPOS, 0 , 0 );
386  expect(100,LOWORD(r));
387  expect(1,HIWORD(r));
388 
389  /* Set the position to 101, return should be 100 */
390  r = SendMessageA(updown, UDM_SETPOS, 0 , MAKELONG(101,0) );
391  expect(100,r);
392  /* Get the position, which should be 100 */
393  r = SendMessageA(updown, UDM_GETPOS, 0 , 0 );
394  expect(100,LOWORD(r));
395  expect(1,HIWORD(r));
396 
398 
399  DestroyWindow(updown);
400 
401  /* there's no attempt to update buddy Edit if text didn't change */
402  SetWindowTextA(g_edit, "50");
404 
405  /* test sequence only on 5.8x versions */
406  r = SendMessageA(updown, UDM_GETPOS32, 0, 0);
407  if (r)
408  {
409  UDACCEL accel;
410 
412 
413  r = SendMessageA(updown, UDM_SETPOS, 0, 50);
414  expect(50,r);
415 
417  "test updown pos, no change", FALSE);
418 
419  SendMessageA(updown, UDM_SETRANGE, 0, MAKELONG(1, 40));
420  r = SendMessageA(updown, UDM_GETRANGE, 0, 0);
421  expect(1, LOWORD(r));
422  expect(40, HIWORD(r));
423 
424  accel.nSec = 0;
425  accel.nInc = 5;
426  r = SendMessageA(updown, UDM_SETACCEL, 1, (LPARAM)&accel);
427  expect(TRUE, r);
428 
429  r = SendMessageA(updown, UDM_GETPOS, 0, 0);
430  expect(40, LOWORD(r));
431  expect(1, HIWORD(r));
432 
433  r = SendMessageA(updown, UDM_SETPOS, 0, MAKELONG(0, 0));
434  expect(40, LOWORD(r));
435  expect(0, HIWORD(r));
436 
437  r = SendMessageA(updown, UDM_GETPOS, 0, 0);
438  expect(1, LOWORD(r));
439  expect(0, HIWORD(r));
440 
441  r = SendMessageA(updown, UDM_SETPOS, 0, MAKELONG(2, 0));
442  expect(1, LOWORD(r));
443  expect(0, HIWORD(r));
444 
446  expect(0, r);
447  r = SendMessageA(updown, UDM_GETPOS, 0, 0);
448  expect(1, LOWORD(r));
449  expect(0, HIWORD(r));
450 
451  r = SendMessageA(updown, UDM_SETPOS, 0, MAKELONG(50, 0));
452  expect(1, LOWORD(r));
453  expect(0, HIWORD(r));
454 
455  r = SendMessageA(updown, UDM_GETPOS, 0, 0);
456  expect(40, LOWORD(r));
457  expect(0, HIWORD(r));
458  }
459 
460  DestroyWindow(updown);
461 }
462 
463 static void test_updown_pos32(void)
464 {
465  HWND updown;
466  int r;
467  int low, high;
468 
470 
472 
473  /* Set the position to 0 to 1000 */
474  SendMessageA(updown, UDM_SETRANGE32, 0 , 1000 );
475 
476  low = high = -1;
477  r = SendMessageA(updown, UDM_GETRANGE32, (WPARAM) &low , (LPARAM) &high );
478  expect(0,r);
479  if (low == -1)
480  {
481  win_skip("UDM_SETRANGE32/UDM_GETRANGE32 not available\n");
482  DestroyWindow(updown);
483  return;
484  }
485 
486  expect(0,low);
487  expect(1000,high);
488 
489  /* Set position to 500 */
490  r = SendMessageA(updown, UDM_SETPOS32, 0 , 500 );
491  if (!r)
492  {
493  win_skip("UDM_SETPOS32 and UDM_GETPOS32 need 5.80\n");
494  DestroyWindow(updown);
495  return;
496  }
497  expect(50,r);
498 
499  /* Since UDM_SETBUDDYINT was not set at creation bRet will always be true as a return from UDM_GETPOS32 */
500 
501  r = SendMessageA(updown, UDM_GETPOS32, 0 , (LPARAM) &high );
502  expect(500,r);
503  expect(1,high);
504 
505  /* Set position to 0, return should be 500 */
506  r = SendMessageA(updown, UDM_SETPOS32, 0 , 0 );
507  expect(500,r);
508  r = SendMessageA(updown, UDM_GETPOS32, 0 , (LPARAM) &high );
509  expect(0,r);
510  expect(1,high);
511 
512  /* Set position to -1 which should become 0, return should be 0 */
513  r = SendMessageA(updown, UDM_SETPOS32, 0 , -1 );
514  expect(0,r);
515  r = SendMessageA(updown, UDM_GETPOS32, 0 , (LPARAM) &high );
516  expect(0,r);
517  expect(1,high);
518 
519  /* Set position to 1000, return should be 0 */
520  r = SendMessageA(updown, UDM_SETPOS32, 0 , 1000 );
521  expect(0,r);
522  r = SendMessageA(updown, UDM_GETPOS32, 0 , (LPARAM) &high );
523  expect(1000,r);
524  expect(1,high);
525 
526  /* Set position to 1001 which should become 1000, return should be 1000 */
527  r = SendMessageA(updown, UDM_SETPOS32, 0 , 1001 );
528  expect(1000,r);
529  r = SendMessageA(updown, UDM_GETPOS32, 0 , (LPARAM) &high );
530  expect(1000,r);
531  expect(1,high);
532 
534 
535  DestroyWindow(updown);
536 
537  /* there's no attempt to update buddy Edit if text didn't change */
538  SetWindowTextA(g_edit, "50");
540 
542 
543  r = SendMessageA(updown, UDM_SETPOS32, 0, 50);
544  expect(50,r);
546  "test updown pos, no change", FALSE);
547 
548  DestroyWindow(updown);
549 }
550 
551 static void test_updown_buddy(void)
552 {
553  HWND updown, buddyReturn, buddy;
554  RECT rect, rect2;
555  WNDPROC proc;
556  DWORD style;
557 
559 
561 
562  buddyReturn = (HWND)SendMessageA(updown, UDM_GETBUDDY, 0 , 0 );
563  ok(buddyReturn == g_edit, "Expected edit handle\n");
564 
565  buddyReturn = (HWND)SendMessageA(updown, UDM_SETBUDDY, (WPARAM) g_edit, 0);
566  ok(buddyReturn == g_edit, "Expected edit handle\n");
567 
568  buddyReturn = (HWND)SendMessageA(updown, UDM_GETBUDDY, 0 , 0 );
569  ok(buddyReturn == g_edit, "Expected edit handle\n");
570 
572  ok_sequence(sequences, EDIT_SEQ_INDEX, add_updown_with_edit_seq, "test updown buddy_edit", FALSE);
573 
574  DestroyWindow(updown);
575 
576  buddy = create_edit_control();
578 
579  updown= create_updown_control(UDS_ALIGNRIGHT, buddy);
580  ok(proc == (WNDPROC)GetWindowLongPtrA(buddy, GWLP_WNDPROC), "No subclassing expected\n");
581 
582  style = GetWindowLongA(updown, GWL_STYLE);
584  style = GetWindowLongA(updown, GWL_STYLE);
585  ok(style & UDS_ARROWKEYS, "Expected UDS_ARROWKEYS\n");
586  /* no subclass if UDS_ARROWKEYS set after creation */
587  ok(proc == (WNDPROC)GetWindowLongPtrA(buddy, GWLP_WNDPROC), "No subclassing expected\n");
588 
589  DestroyWindow(updown);
590 
592  ok(proc != (WNDPROC)GetWindowLongPtrA(buddy, GWLP_WNDPROC), "Subclassing expected\n");
593 
594  if (pSetWindowSubclass)
595  {
596  /* updown uses subclass helpers for buddy on >5.8x systems */
597  ok(GetPropA(buddy, "CC32SubclassInfo") != NULL, "Expected CC32SubclassInfo property\n");
598  }
599 
600  DestroyWindow(updown);
601  DestroyWindow(buddy);
602 
603  /* Create with buddy and UDS_HORZ, reset buddy. */
605 
606  buddyReturn = (HWND)SendMessageA(updown, UDM_GETBUDDY, 0, 0);
607  ok(buddyReturn == g_edit, "Unexpected buddy window.\n");
608 
609  GetClientRect(updown, &rect);
610 
611  buddyReturn = (HWND)SendMessageA(updown, UDM_SETBUDDY, 0, 0);
612  ok(buddyReturn == g_edit, "Unexpected buddy window.\n");
613 
614  GetClientRect(updown, &rect2);
615  ok(EqualRect(&rect, &rect2), "Unexpected window rect.\n");
616 
617  /* Remove UDS_HORZ, reset buddy again. */
618  style = GetWindowLongA(updown, GWL_STYLE);
619  SetWindowLongA(updown, GWL_STYLE, style & ~UDS_HORZ);
620  style = GetWindowLongA(updown, GWL_STYLE);
621  ok(!(style & UDS_HORZ), "Unexpected style.\n");
622 
623  buddyReturn = (HWND)SendMessageA(updown, UDM_SETBUDDY, 0, 0);
624  ok(buddyReturn == NULL, "Unexpected buddy window.\n");
625 
626  GetClientRect(updown, &rect2);
627  ok(EqualRect(&rect, &rect2), "Unexpected window rect.\n");
628 
629  DestroyWindow(updown);
630 
631  /* Without UDS_HORZ. */
632  updown = create_updown_control(0, g_edit);
633 
634  buddyReturn = (HWND)SendMessageA(updown, UDM_GETBUDDY, 0, 0);
635  ok(buddyReturn == g_edit, "Unexpected buddy window.\n");
636 
637  GetClientRect(updown, &rect);
638 
639  buddyReturn = (HWND)SendMessageA(updown, UDM_SETBUDDY, 0, 0);
640  ok(buddyReturn == g_edit, "Unexpected buddy window.\n");
641 
642  GetClientRect(updown, &rect2);
643  ok(EqualRect(&rect, &rect2), "Unexpected window rect.\n");
644 
645  DestroyWindow(updown);
646 
647  /* Create without buddy. */
650  0, 0, rect.right, rect.bottom, parent_wnd, (HMENU)1, GetModuleHandleA(NULL), NULL);
651  ok(updown != NULL, "Failed to create UpDown control.\n");
652 
653  GetClientRect(updown, &rect);
654  buddyReturn = (HWND)SendMessageA(updown, UDM_SETBUDDY, 0, 0);
655  ok(buddyReturn == NULL, "Unexpected buddy window.\n");
656  GetClientRect(updown, &rect2);
657 
658  ok(EqualRect(&rect, &rect2), "Unexpected window rect.\n");
659 
660  style = GetWindowLongA(updown, GWL_STYLE);
661  SetWindowLongA(updown, GWL_STYLE, style & ~UDS_HORZ);
662 
663  GetClientRect(updown, &rect2);
664  ok(EqualRect(&rect, &rect2), "Unexpected window rect.\n");
665 
666  buddyReturn = (HWND)SendMessageA(updown, UDM_SETBUDDY, (WPARAM)g_edit, 0);
667  ok(buddyReturn == NULL, "Unexpected buddy window.\n");
668  GetClientRect(updown, &rect);
669 
670  buddyReturn = (HWND)SendMessageA(updown, UDM_SETBUDDY, 0, 0);
671  ok(buddyReturn == g_edit, "Unexpected buddy window.\n");
672  GetClientRect(updown, &rect2);
673 todo_wine
674  ok(EqualRect(&rect, &rect2), "Unexpected window rect.\n");
675 
676  DestroyWindow(updown);
677 }
678 
679 static void test_updown_base(void)
680 {
681  HWND updown;
682  int r;
683  CHAR text[10];
684 
686 
688 
689  SendMessageA(updown, UDM_SETBASE, 10 , 0);
690  r = SendMessageA(updown, UDM_GETBASE, 0 , 0);
691  expect(10,r);
692 
693  /* Set base to an invalid value, should return 0 and stay at 10 */
694  r = SendMessageA(updown, UDM_SETBASE, 80 , 0);
695  expect(0,r);
696  r = SendMessageA(updown, UDM_GETBASE, 0 , 0);
697  expect(10,r);
698 
699  /* Set base to 16 now, should get 16 as the return */
700  r = SendMessageA(updown, UDM_SETBASE, 16 , 0);
701  expect(10,r);
702  r = SendMessageA(updown, UDM_GETBASE, 0 , 0);
703  expect(16,r);
704 
705  /* Set base to an invalid value, should return 0 and stay at 16 */
706  r = SendMessageA(updown, UDM_SETBASE, 80 , 0);
707  expect(0,r);
708  r = SendMessageA(updown, UDM_GETBASE, 0 , 0);
709  expect(16,r);
710 
711  /* Set base back to 10, return should be 16 */
712  r = SendMessageA(updown, UDM_SETBASE, 10 , 0);
713  expect(16,r);
714  r = SendMessageA(updown, UDM_GETBASE, 0 , 0);
715  expect(10,r);
716 
718 
719  DestroyWindow(updown);
720 
721  /* switch base with buddy attached */
723 
724  r = SendMessageA(updown, UDM_SETPOS, 0, 10);
725  expect(50, r);
726 
728  ok(lstrcmpA(text, "10") == 0, "Expected '10', got '%s'\n", text);
729 
730  r = SendMessageA(updown, UDM_SETBASE, 16, 0);
731  expect(10, r);
732 
734  /* FIXME: currently hex output isn't properly formatted, but for this
735  test only change from initial text matters */
736  ok(lstrcmpA(text, "10") != 0, "Expected '0x000A', got '%s'\n", text);
737 
738  DestroyWindow(updown);
739 }
740 
741 static void test_updown_unicode(void)
742 {
743  HWND updown;
744  int r;
745 
747 
749 
750  /* Set it to ANSI, don't check return as we don't know previous state */
751  SendMessageA(updown, UDM_SETUNICODEFORMAT, 0 , 0);
752  r = SendMessageA(updown, UDM_GETUNICODEFORMAT, 0 , 0);
753  expect(0,r);
754 
755  /* Now set it to Unicode format */
756  r = SendMessageA(updown, UDM_SETUNICODEFORMAT, 1 , 0);
757  expect(0,r);
758  r = SendMessageA(updown, UDM_GETUNICODEFORMAT, 0 , 0);
759  if (!r)
760  {
761  win_skip("UDM_SETUNICODEFORMAT not available\n");
762  DestroyWindow(updown);
763  return;
764  }
765  expect(1,r);
766 
767  /* And now set it back to ANSI */
768  r = SendMessageA(updown, UDM_SETUNICODEFORMAT, 0 , 0);
769  expect(1,r);
770  r = SendMessageA(updown, UDM_GETUNICODEFORMAT, 0 , 0);
771  expect(0,r);
772 
774 
775  DestroyWindow(updown);
776 }
777 
778 static void test_updown_create(void)
779 {
780  CHAR text[MAX_PATH];
781  HWND updown;
782  RECT r;
783 
785 
787  ok(updown != NULL, "Failed to create updown control\n");
788  ok_sequence(sequences, PARENT_SEQ_INDEX, add_updown_to_parent_seq, "add updown control to parent", TRUE);
789  ok_sequence(sequences, EDIT_SEQ_INDEX, add_updown_with_edit_seq, "add updown control with edit", FALSE);
790 
792 
794  ok(lstrlenA(text) == 0, "Expected empty string\n");
796 
797  DestroyWindow(updown);
798 
799  /* create with zero width */
800  updown = CreateWindowA (UPDOWN_CLASSA, 0, WS_CHILD | WS_BORDER | WS_VISIBLE, 0, 0, 0, 0,
802  ok(updown != NULL, "Failed to create updown control\n");
803  r.right = 0;
804  GetClientRect(updown, &r);
805  ok(r.right > 0, "Expected default width, got %d\n", r.right);
806  DestroyWindow(updown);
807  /* create with really small width */
808  updown = CreateWindowA (UPDOWN_CLASSA, 0, WS_CHILD | WS_BORDER | WS_VISIBLE, 0, 0, 2, 0,
810  ok(updown != NULL, "Failed to create updown control\n");
811  r.right = 0;
812  GetClientRect(updown, &r);
813  ok(r.right != 2 && r.right > 0, "Expected default width, got %d\n", r.right);
814  DestroyWindow(updown);
815  /* create with width greater than default */
816  updown = CreateWindowA (UPDOWN_CLASSA, 0, WS_CHILD | WS_BORDER | WS_VISIBLE, 0, 0, 100, 0,
818  ok(updown != NULL, "Failed to create updown control\n");
819  r.right = 0;
820  GetClientRect(updown, &r);
821  ok(r.right < 100 && r.right > 0, "Expected default width, got %d\n", r.right);
822  DestroyWindow(updown);
823  /* create with zero height, UDS_HORZ */
824  updown = CreateWindowA (UPDOWN_CLASSA, 0, UDS_HORZ | WS_CHILD | WS_BORDER | WS_VISIBLE, 0, 0, 0, 0,
826  ok(updown != NULL, "Failed to create updown control\n");
827  r.bottom = 0;
828  GetClientRect(updown, &r);
829  ok(r.bottom == 0, "Expected zero height, got %d\n", r.bottom);
830  DestroyWindow(updown);
831  /* create with really small height, UDS_HORZ */
832  updown = CreateWindowA (UPDOWN_CLASSA, 0, UDS_HORZ | WS_CHILD | WS_BORDER | WS_VISIBLE, 0, 0, 0, 2,
834  ok(updown != NULL, "Failed to create updown control\n");
835  r.bottom = 0;
836  GetClientRect(updown, &r);
837  ok(r.bottom == 0, "Expected zero height, got %d\n", r.bottom);
838  DestroyWindow(updown);
839  /* create with height greater than default, UDS_HORZ */
840  updown = CreateWindowA (UPDOWN_CLASSA, 0, UDS_HORZ | WS_CHILD | WS_BORDER | WS_VISIBLE, 0, 0, 0, 100,
842  ok(updown != NULL, "Failed to create updown control\n");
843  r.bottom = 0;
844  GetClientRect(updown, &r);
845  ok(r.bottom < 100 && r.bottom > 0, "Expected default height, got %d\n", r.bottom);
846  DestroyWindow(updown);
847 }
848 
849 static void test_UDS_SETBUDDYINT(void)
850 {
851  HWND updown;
852  DWORD style, ret;
853  CHAR text[10];
854 
855  /* cleanup buddy */
856  text[0] = '\0';
858 
859  /* creating without UDS_SETBUDDYINT */
861  /* try to set UDS_SETBUDDYINT after creation */
862  style = GetWindowLongA(updown, GWL_STYLE);
864  style = GetWindowLongA(updown, GWL_STYLE);
865  ok(style & UDS_SETBUDDYINT, "Expected UDS_SETBUDDY to be set\n");
866  SendMessageA(updown, UDM_SETPOS, 0, 20);
868  ok(lstrlenA(text) == 0, "Expected empty string\n");
869  DestroyWindow(updown);
870 
871  /* creating with UDS_SETBUDDYINT */
874  /* 50 is initial value here */
875  ok(lstrcmpA(text, "50") == 0, "Expected '50', got '%s'\n", text);
876  /* now remove style flag */
877  style = GetWindowLongA(updown, GWL_STYLE);
879  SendMessageA(updown, UDM_SETPOS, 0, 20);
881  ok(lstrcmpA(text, "20") == 0, "Expected '20', got '%s'\n", text);
882  /* set edit text directly, check position */
883  strcpy(text, "10");
885  ret = SendMessageA(updown, UDM_GETPOS, 0, 0);
886  expect(10, ret);
887  strcpy(text, "11");
889  ret = SendMessageA(updown, UDM_GETPOS, 0, 0);
890  expect(11, LOWORD(ret));
891  expect(0, HIWORD(ret));
892  /* set to invalid value */
893  strcpy(text, "21st");
895  ret = SendMessageA(updown, UDM_GETPOS, 0, 0);
896  expect(11, LOWORD(ret));
897  expect(TRUE, HIWORD(ret));
898  /* set style back */
899  style = GetWindowLongA(updown, GWL_STYLE);
901  SendMessageA(updown, UDM_SETPOS, 0, 30);
903  ok(lstrcmpA(text, "30") == 0, "Expected '30', got '%s'\n", text);
904  DestroyWindow(updown);
905 }
906 
907 static void test_CreateUpDownControl(void)
908 {
909  HWND updown, buddy;
910  DWORD range, pos;
911  RECT rect;
912 
914  updown = pCreateUpDownControl(WS_CHILD | WS_BORDER | WS_VISIBLE,
915  0, 0, rect.right, rect.bottom, parent_wnd, 1, GetModuleHandleA(NULL), g_edit, 100, 10, 50);
916  ok(updown != NULL, "Failed to create control.\n");
917 
918  buddy = (HWND)SendMessageA(updown, UDM_GETBUDDY, 0, 0);
919  ok(buddy == g_edit, "Unexpected buddy window.\n");
920 
921  range = SendMessageA(updown, UDM_GETRANGE, 0, 0);
922  ok(range == MAKELONG(100, 10), "Unexpected range.\n");
923 
924  pos = SendMessageA(updown, UDM_GETPOS, 0, 0);
925  ok(pos == MAKELONG(50, 1), "Unexpected position.\n");
926 
927  DestroyWindow(updown);
928 }
929 
931 {
932  HWND updown;
933  RECT rect;
934  UINT x, y;
935  int result;
936 
937  /* test updown control notifications without UDS_HORZ style */
939  SetFocus(updown);
941 
942  /* click on the up-arrow button */
943  GetClientRect(updown, &rect);
944  x = rect.left + (rect.right - rect.left) / 2;
945  y = rect.top + (rect.bottom - rect.top) / 4;
946  result = SendMessageA(updown, WM_LBUTTONDOWN, 0, MAKELPARAM(x, y));
947  expect(result, 0);
948  result = SendMessageA(updown, WM_LBUTTONUP, 0, MAKELPARAM(x, y));
949  expect(result, 0);
950 
952  "test updown to parent notify (vertical)", FALSE);
953 
954  DestroyWindow(updown);
955 
956  /* test updown control notifications with UDS_HORZ style */
958  SetFocus(updown);
960 
961  /* click on the right-arrow button */
962  GetClientRect(updown, &rect);
963  x = rect.left + (rect.right - rect.left) * 3 / 4;
964  y = rect.top + (rect.bottom - rect.top) / 2;
965  result = SendMessageA(updown, WM_LBUTTONDOWN, 0, MAKELPARAM(x, y));
966  expect(result, 0);
967  result = SendMessageA(updown, WM_LBUTTONUP, 0, MAKELPARAM(x, y));
968  expect(result, 0);
969 
971  "test updown to parent notify (horizontal)", FALSE);
972 
973  DestroyWindow(updown);
974 }
975 
976 static void init_functions(void)
977 {
978  HMODULE hComCtl32 = LoadLibraryA("comctl32.dll");
979 
980 #define X(f) p##f = (void*)GetProcAddress(hComCtl32, #f);
981 #define X2(f, ord) p##f = (void*)GetProcAddress(hComCtl32, (const char *)ord);
983  X2(SetWindowSubclass, 410);
984 #undef X
985 #undef X2
986 }
987 
988 START_TEST(updown)
989 {
990  init_functions();
991 
993 
995  ok(parent_wnd != NULL, "Failed to create parent window!\n");
997  ok(g_edit != NULL, "Failed to create edit control\n");
998 
1000  test_updown_pos();
1003  test_updown_base();
1008 
1011 }
HGDIOBJ WINAPI GetStockObject(_In_ int)
static SUBCLASSPROC
Definition: updown.c:67
static LRESULT WINAPI parent_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
Definition: updown.c:193
RECT rect2
Definition: edittest.c:51
const DOCKBAR PVOID HWND HWND * hwnd
Definition: tooldock.h:22
static HWND
Definition: updown.c:65
static const struct message test_updown_pos_notifications_horz_seq[]
Definition: updown.c:180
Definition: tftpd.h:59
#define NUM_MSG_SEQUENCES
Definition: updown.c:55
#define UDM_GETPOS
Definition: commctrl.h:2140
#define UDM_GETPOS32
Definition: commctrl.h:2152
int WINAPI GetWindowTextA(HWND hWnd, LPSTR lpString, int nMaxCount)
Definition: window.c:1330
#define WM_LBUTTONDOWN
Definition: winuser.h:1758
#define X(f)
#define X2(f, ord)
#define TRUE
Definition: types.h:120
static void test_CreateUpDownControl(void)
Definition: updown.c:907
LRESULT WINAPI SendMessageA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
static LRESULT WINAPI updown_subclass_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
Definition: updown.c:296
const WCHAR * text
Definition: package.c:1827
#define WM_NCCALCSIZE
Definition: winuser.h:1667
char CHAR
Definition: xmlstorage.h:175
#define WM_GETTEXT
Definition: winuser.h:1600
Definition: msg.h:39
#define MAKELPARAM(l, h)
Definition: winuser.h:3983
static void test_updown_unicode(void)
Definition: updown.c:741
#define SIZE_RESTORED
Definition: winuser.h:2480
static void test_updown_pos(void)
Definition: updown.c:342
GLenum GLuint GLenum GLsizei const GLchar * message
Definition: glext.h:5579
int cbClsExtra
Definition: winuser.h:3140
int WINAPI lstrcmpA(LPCSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:18
#define UDM_SETACCEL
Definition: commctrl.h:2143
#define WM_MOVE
Definition: winuser.h:1592
LPCSTR lpszMenuName
Definition: winuser.h:3146
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
static void test_updown_pos_notifications(void)
Definition: updown.c:930
#define WHITE_BRUSH
Definition: wingdi.h:901
HWND WINAPI SetFocus(_In_opt_ HWND)
#define WM_NCHITTEST
Definition: winuser.h:1668
static UINT_PTR
Definition: updown.c:67
UINT_PTR WPARAM
Definition: windef.h:207
HBRUSH hbrBackground
Definition: winuser.h:3145
static HANDLE proc()
Definition: pdb.c:32
#define WS_CHILD
Definition: pedump.c:617
#define BUDDY_ID
Definition: updown.c:61
static const struct message test_updown_pos_nochange_seq[]
Definition: updown.c:162
static DWORD_PTR
Definition: updown.c:67
#define UDM_GETRANGE32
Definition: commctrl.h:2148
BOOL WINAPI DestroyWindow(_In_ HWND)
#define DWORD
Definition: nt_native.h:44
& rect
Definition: startmenu.cpp:1413
WPARAM wParam
Definition: combotst.c:138
static BOOL register_parent_wnd_class(void)
Definition: updown.c:226
LRESULT WINAPI CallWindowProcA(_In_ WNDPROC, _In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define WM_NCPAINT
Definition: winuser.h:1669
int cbWndExtra
Definition: winuser.h:3141
#define WC_EDITA
Definition: commctrl.h:4682
#define EN_SETFOCUS
Definition: winuser.h:2009
static void test_updown_base(void)
Definition: updown.c:679
#define UDM_GETBASE
Definition: commctrl.h:2146
#define VK_UP
Definition: winuser.h:2200
LONG WINAPI GetWindowLongA(_In_ HWND, _In_ int)
#define FALSE
Definition: types.h:117
#define UPDOWN_SEQ_INDEX
Definition: updown.c:58
#define WM_PARENTNOTIFY
Definition: winuser.h:1785
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
HWND WINAPI CreateUpDownControl(DWORD style, INT x, INT y, INT cx, INT cy, HWND parent, INT id, HINSTANCE inst, HWND buddy, INT maxVal, INT minVal, INT curVal)
Definition: commctrl.c:829
static UINT WPARAM LPARAM lparam
Definition: combo.c:716
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryA(LPCSTR lpLibFileName)
Definition: loader.c:111
#define CreateWindowA(a, b, c, d, e, f, g, h, i, j, k)
Definition: winuser.h:4290
HCURSOR hCursor
Definition: winuser.h:3144
static void init_msg_sequences(struct msg_sequence **seq, int n)
Definition: msg.h:391
#define GWLP_USERDATA
Definition: treelist.c:63
static HWND create_parent_window(void)
Definition: updown.c:243
#define MAKELONG(a, b)
Definition: typedefs.h:249
#define UDS_ARROWKEYS
Definition: commctrl.h:2132
static HWND create_updown_control(DWORD style, HWND buddy)
Definition: updown.c:318
smooth NULL
Definition: ftsmooth.c:416
HWND WINAPI GetDesktopWindow(void)
Definition: window.c:656
#define SB_THUMBPOSITION
Definition: winuser.h:572
static void init_functions(void)
Definition: updown.c:976
#define WM_KEYDOWN
Definition: winuser.h:1697
LONG_PTR LPARAM
Definition: windef.h:208
#define UDM_SETRANGE
Definition: commctrl.h:2137
const char * LPCSTR
Definition: xmlstorage.h:183
#define UDM_SETRANGE32
Definition: commctrl.h:2147
#define SB_ENDSCROLL
Definition: winuser.h:574
#define WS_MAXIMIZEBOX
Definition: pedump.c:632
Definition: msg.h:41
#define GetWindowLongPtrA
Definition: winuser.h:4803
BOOL WINAPI SetWindowSubclass(HWND hWnd, SUBCLASSPROC pfnSubclass, UINT_PTR uIDSubclass, DWORD_PTR dwRef)
Definition: commctrl.c:1261
#define WS_CAPTION
Definition: pedump.c:624
#define WM_SIZE
Definition: winuser.h:1593
#define expect(EXPECTED, GOT)
Definition: updown.c:53
BOOL WINAPI SetWindowTextA(_In_ HWND, _In_opt_ LPCSTR)
UINT nSec
Definition: commctrl.h:2120
#define WM_WINDOWPOSCHANGING
Definition: winuser.h:1643
#define MAX_PATH
Definition: compat.h:34
#define WINAPI
Definition: msvc.h:6
#define ok_sequence(seq, index, exp, contx, todo)
Definition: msg.h:387
#define UDM_SETPOS32
Definition: commctrl.h:2151
unsigned long DWORD
Definition: ntddk_ex.h:95
static const struct message add_updown_to_parent_seq[]
Definition: updown.c:79
#define WM_PAINT
Definition: winuser.h:1602
static struct msg_sequence * sequences[NUM_MSG_SEQUENCES]
Definition: updown.c:69
#define PARENT_SEQ_INDEX
Definition: updown.c:56
static const struct message get_edit_text_seq[]
Definition: updown.c:86
int ret
Definition: msg.h:34
#define UDN_DELTAPOS
Definition: commctrl.h:2165
#define todo_wine
Definition: test.h:162
#define SetWindowLongPtrA
Definition: winuser.h:5320
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
UINT nInc
Definition: commctrl.h:2121
#define UDS_HORZ
Definition: commctrl.h:2133
START_TEST(updown)
Definition: updown.c:988
#define WM_COMMAND
Definition: winuser.h:1722
#define UPDOWN_CLASSA
Definition: commctrl.h:2114
LRESULT WINAPI DefWindowProcA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
LPCSTR lpszClassName
Definition: winuser.h:3147
uint32_t DWORD_PTR
Definition: typedefs.h:65
static void test_updown_buddy(void)
Definition: updown.c:551
#define WM_USER
Definition: winuser.h:1877
HCURSOR WINAPI LoadCursorA(_In_opt_ HINSTANCE, _In_ LPCSTR)
Definition: cursoricon.c:2059
static const struct message add_updown_with_edit_seq[]
Definition: updown.c:71
#define GWLP_WNDPROC
Definition: treelist.c:66
#define NF_QUERY
Definition: winuser.h:2435
GLenum GLint * range
Definition: glext.h:7539
UINT style
Definition: winuser.h:3138
LRESULT(CALLBACK * WNDPROC)(HWND, UINT, WPARAM, LPARAM)
Definition: winuser.h:2881
static const struct message test_updown_buddy_seq[]
Definition: updown.c:123
#define GWL_STYLE
Definition: winuser.h:846
#define UDM_SETBUDDY
Definition: commctrl.h:2141
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
#define EDIT_SEQ_INDEX
Definition: updown.c:57
#define WS_BORDER
Definition: pedump.c:625
int WINAPI lstrlenA(LPCSTR lpString)
Definition: lstring.c:145
static void test_updown_pos32(void)
Definition: updown.c:463
static LRESULT WINAPI edit_subclass_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
Definition: updown.c:256
BOOL WINAPI EqualRect(_In_ LPCRECT, _In_ LPCRECT)
static BOOL(WINAPI *pSetWindowSubclass)(HWND
static HINSTANCE
Definition: updown.c:65
#define WS_MINIMIZEBOX
Definition: pedump.c:631
HANDLE WINAPI GetPropA(_In_ HWND, _In_ LPCSTR)
HINSTANCE hInstance
Definition: winuser.h:3142
#define add_message(msg)
Definition: msg.c:2108
#define ARRAY_SIZE(a)
Definition: main.h:24
#define UDS_ALIGNRIGHT
Definition: commctrl.h:2129
#define WM_CTLCOLOREDIT
Definition: winuser.h:1749
#define ok(value,...)
Definition: atltest.h:57
#define WM_LBUTTONUP
Definition: winuser.h:1759
static void flush_sequences(struct msg_sequence **seq, int n)
Definition: msg.h:97
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
static HWND create_edit_control(void)
Definition: updown.c:277
#define UDM_SETPOS
Definition: commctrl.h:2139
#define UDM_GETRANGE
Definition: commctrl.h:2138
unsigned int UINT
Definition: ndis.h:50
#define WM_HSCROLL
Definition: winuser.h:1725
#define UDM_GETBUDDY
Definition: commctrl.h:2142
LONG WINAPI SetWindowLongA(_In_ HWND, _In_ int, _In_ LONG)
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
#define WM_DEVICECHANGE
Definition: winuser.h:1793
WNDPROC lpfnWndProc
Definition: winuser.h:3139
static void test_UDS_SETBUDDYINT(void)
Definition: updown.c:849
#define WM_WINDOWPOSCHANGED
Definition: winuser.h:1644
#define msg(x)
Definition: auth_time.c:54
#define IDC_ARROW
Definition: winuser.h:682
#define WM_CREATE
Definition: winuser.h:1590
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
HWND WINAPI CreateWindowExA(_In_ DWORD dwExStyle, _In_opt_ LPCSTR lpClassName, _In_opt_ LPCSTR lpWindowName, _In_ DWORD dwStyle, _In_ int X, _In_ int Y, _In_ int nWidth, _In_ int nHeight, _In_opt_ HWND hWndParent, _In_opt_ HMENU hMenu, _In_opt_ HINSTANCE hInstance, _In_opt_ LPVOID lpParam)
#define UDS_SETBUDDYINT
Definition: commctrl.h:2128
#define HIWORD(l)
Definition: typedefs.h:247
GLenum GLuint id
Definition: glext.h:5579
#define EN_UPDATE
Definition: winuser.h:2010
static const struct message test_updown_pos32_seq[]
Definition: updown.c:107
#define WM_ERASEBKGND
Definition: winuser.h:1607
static void test_updown_create(void)
Definition: updown.c:778
LONG_PTR LRESULT
Definition: windef.h:209
Arabic default style
Definition: afstyles.h:93
#define WS_VISIBLE
Definition: pedump.c:620
#define WS_SYSMENU
Definition: pedump.c:629
GLuint64EXT * result
Definition: glext.h:11304
static INT
Definition: updown.c:65
static const struct message test_updown_base_seq[]
Definition: updown.c:138
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
#define win_skip
Definition: test.h:149
#define UDM_GETUNICODEFORMAT
Definition: commctrl.h:2150
LPARAM lParam
Definition: combotst.c:139
#define LOWORD(l)
Definition: pedump.c:82
static const struct message test_updown_unicode_seq[]
Definition: updown.c:152
#define UDM_SETBASE
Definition: commctrl.h:2145
#define UPDOWN_ID
Definition: updown.c:60
ATOM WINAPI RegisterClassA(_In_ CONST WNDCLASSA *)
static const struct message test_updown_pos_seq[]
Definition: updown.c:91
static HWND parent_wnd
Definition: updown.c:63
#define WM_NOTIFY
Definition: richedit.h:61
static HWND g_edit
Definition: updown.c:63
static const struct message test_updown_pos_notifications_seq[]
Definition: updown.c:167
static UINT WPARAM wparam
Definition: combo.c:716
#define WM_VSCROLL
Definition: winuser.h:1726
#define UDM_SETUNICODEFORMAT
Definition: commctrl.h:2149
HICON hIcon
Definition: winuser.h:3143
#define EN_CHANGE
Definition: winuser.h:2004