ReactOS 0.4.15-dev-7788-g1ad9096
scroll.c
Go to the documentation of this file.
1/*
2 * Unit tests for scrollbar
3 *
4 * Copyright 2008 Lyutin Anatoly (Etersoft)
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 */
20
21#include <assert.h>
22#include <stdarg.h>
23#include <stdio.h>
24#include <windows.h>
25
26#include "wine/test.h"
27
30
32{
33 switch(msg)
34 {
35
36 case WM_CREATE:
37 {
38 hScroll = CreateWindowA( "SCROLLBAR", "", WS_CHILD | WS_VISIBLE, 0, 0, 120, 100, hWnd, (HMENU)100, GetModuleHandleA(0), 0 );
39
40 return 0;
41 }
42 case WM_DESTROY:
44 break;
45 case WM_HSCROLL:
46 case WM_VSCROLL:
47 /* stop tracking */
49 return 0;
50 default:
52 }
53 return 0;
54}
55
57{
59
60 hScroll = NULL;
61 hMainWnd = CreateWindowExA( 0, "MyTestWnd", "Scroll",
64 ok(hMainWnd != NULL, "Failed to create parent window. Tests aborted.\n");
65 ok(hScroll != NULL, "got NULL scroll bar handle\n");
66
67 return hMainWnd;
68}
69
70static void scrollbar_test_track(void)
71{
72 HWND mainwnd;
73
74 mainwnd = create_main_test_wnd();
75
76 /* test that scrollbar tracking is terminated when
77 * the control loses mouse capture */
79 /* a normal return from SendMessage */
80 /* not normal for instances such as closing the window */
81 ok( IsWindow( hScroll), "Scrollbar has gone!\n");
82
84 DestroyWindow(mainwnd);
85}
86
87static void test_EnableScrollBar(void)
88{
89 HWND mainwnd;
90 BOOL ret;
91
92 mainwnd = create_main_test_wnd();
93
95 ok( ret, "The scrollbar should be disabled.\n" );
96 ok( !IsWindowEnabled( hScroll ), "The scrollbar window should be disabled.\n" );
97
99 ok( ret, "The scrollbar should be enabled.\n" );
100 ok( IsWindowEnabled( hScroll ), "The scrollbar window should be enabled.\n" );
101
102 /* test buttons separately */
104 ok( ret, "The scrollbar LTUP button should be disabled.\n" );
105 ok( IsWindowEnabled( hScroll ), "The scrollbar window should be enabled.\n" );
107 ok( ret, "The scrollbar should be enabled.\n" );
108 ok( IsWindowEnabled( hScroll ), "The scrollbar window should be enabled.\n" );
109
111 ok( ret, "The scrollbar RTDN button should be disabled.\n" );
112 ok( IsWindowEnabled( hScroll ), "The scrollbar window should be enabled.\n" );
114 ok( ret, "The scrollbar should be enabled.\n" );
115 ok( IsWindowEnabled( hScroll ), "The scrollbar window should be enabled.\n" );
116
117 SetLastError( 0xdeadbeef );
119 ok( !ret, "EnableScrollBar should fail.\n" );
122 || broken(GetLastError() == 0xdeadbeef), /* winxp */
123 "GetLastError() = %u\n", GetLastError() );
124
125 /* disable window, try to re-enable */
127 ok( !ret, "got %d\n", ret );
128 ok( !IsWindowEnabled( hScroll ), "The scrollbar window should be disabled.\n" );
129
131 ok( ret, "got %d\n", ret );
132 ok( IsWindowEnabled( hScroll ), "The scrollbar window should be disabled.\n" );
133
135 DestroyWindow(mainwnd);
136}
137
138static void test_SetScrollPos(void)
139{
140 HWND mainwnd;
141 int ret;
142
143 mainwnd = create_main_test_wnd();
144
146 ok( !IsWindowEnabled( hScroll ), "The scroll should be disabled.\n" );
147
149 ok( !ret, "The position should not be set.\n" );
150
152 ok( !ret, "The position should be equal to zero\n");
153
154 ret = SetScrollRange( hScroll, SB_CTL, 0, 100, TRUE );
155 ok( ret, "The range should be set.\n" );
156
158 ok( !ret , "The position should not be set.\n" );
159
161 ok( ret == 30, "The position should be set!!!\n");
162
164 ok( IsWindowEnabled( hScroll ), "The scroll should be enabled.\n" );
165
167 ok( ret == 30, "The position should be set.\n" );
168
170 ok( ret == 30, "The position should not be equal to zero\n");
171
172 ret = SetScrollRange( hScroll, SB_CTL, 0, 100, TRUE );
173 ok( ret, "The range should be set.\n" );
174
176 ok( ret == 30, "The position should be set.\n" );
177
179 ok( ret == 30, "The position should not be equal to zero\n");
180
181 SetLastError( 0xdeadbeef );
182 ret = SetScrollPos( mainwnd, SB_CTL, 30, TRUE );
183 ok( !ret, "The position should not be set.\n" );
184 ok( GetLastError() == 0xdeadbeef, "GetLastError() = %u\n", GetLastError() );
185
186 SetLastError( 0xdeadbeef );
187 ret = GetScrollPos( mainwnd, SB_CTL );
188 ok( !ret, "The position should be equal to zero\n");
189 ok( GetLastError() == 0xdeadbeef, "GetLastError() = %u\n", GetLastError() );
190
192 DestroyWindow(mainwnd);
193}
194
195static void test_ShowScrollBar(void)
196{
197 HWND mainwnd;
198 BOOL ret;
199
200 mainwnd = create_main_test_wnd();
201
203 ok( ret, "The ShowScrollBar() should not failed.\n" );
204 ok( !IsWindowVisible( hScroll ), "The scrollbar window should not be visible\n" );
205
207 ok( ret, "The ShowScrollBar() should not failed.\n" );
208 ok( !IsWindowVisible( hScroll ), "The scrollbar window should be visible\n" );
209
211 ok( !ret, "The ShowScrollBar() should failed.\n" );
212
213 ret = ShowScrollBar( mainwnd, SB_CTL, TRUE );
214 ok( ret, "The ShowScrollBar() should not fail.\n" );
215
217 DestroyWindow(mainwnd);
218}
219
220static void test_GetScrollBarInfo(void)
221{
223 BOOL ret;
224 SCROLLBARINFO sbi;
225 RECT rect;
226 BOOL (WINAPI *pGetScrollBarInfo)(HWND, LONG, LPSCROLLBARINFO);
227
228 pGetScrollBarInfo = (void*)GetProcAddress(GetModuleHandleA("user32.dll"), "GetScrollBarInfo");
229 if (!pGetScrollBarInfo)
230 {
231 win_skip("GetScrollBarInfo is not available\n");
232 return;
233 }
234
236
237 /* Test GetScrollBarInfo to make sure it returns rcScrollBar in screen
238 * coordinates. */
239 sbi.cbSize = sizeof(sbi);
240 ret = pGetScrollBarInfo( hScroll, OBJID_CLIENT, &sbi);
241 ok( ret, "The GetScrollBarInfo() call should not fail.\n" );
243 ok( ret, "The GetWindowRect() call should not fail.\n" );
245 "unexpected rgstate(0x%x)\n", sbi.rgstate[0]);
246 ok(EqualRect(&rect, &sbi.rcScrollBar), "WindowRect %s != rcScrollBar %s\n",
248
249 /* Test windows horizontal and vertical scrollbar to make sure rcScrollBar
250 * is still returned in screen coordinates by moving the window, and
251 * making sure that it shifts the rcScrollBar value. */
253 sbi.cbSize = sizeof(sbi);
254 ret = pGetScrollBarInfo( hMainWnd, OBJID_HSCROLL, &sbi);
255 ok( ret, "The GetScrollBarInfo() call should not fail.\n" );
257 ok( ret, "The GetWindowRect() call should not fail.\n" );
258 MoveWindow( hMainWnd, rect.left+5, rect.top+5,
259 rect.right-rect.left, rect.bottom-rect.top, TRUE );
260 rect = sbi.rcScrollBar;
261 OffsetRect(&rect, 5, 5);
262 ret = pGetScrollBarInfo( hMainWnd, OBJID_HSCROLL, &sbi);
263 ok( ret, "The GetScrollBarInfo() call should not fail.\n" );
264 ok(EqualRect(&rect, &sbi.rcScrollBar), "PreviousRect %s != CurrentRect %s\n",
266
267 sbi.cbSize = sizeof(sbi);
268 ret = pGetScrollBarInfo( hMainWnd, OBJID_VSCROLL, &sbi);
269 ok( ret, "The GetScrollBarInfo() call should not fail.\n" );
271 ok( ret, "The GetWindowRect() call should not fail.\n" );
272 MoveWindow( hMainWnd, rect.left+5, rect.top+5,
273 rect.right-rect.left, rect.bottom-rect.top, TRUE );
274 rect = sbi.rcScrollBar;
275 OffsetRect(&rect, 5, 5);
276 ret = pGetScrollBarInfo( hMainWnd, OBJID_VSCROLL, &sbi);
277 ok( ret, "The GetScrollBarInfo() call should not fail.\n" );
278 ok(EqualRect(&rect, &sbi.rcScrollBar), "PreviousRect %s != CurrentRect %s\n",
280
283}
284
285/* some tests designed to show that Horizontal and Vertical
286 * window scroll bar info are not created independently */
288{
289 INT min, max, ret;
290 DWORD winstyle;
291 HWND hwnd;
292 SCROLLINFO si = { sizeof( SCROLLINFO), SIF_TRACKPOS };
293
294 hwnd = CreateWindowExA( 0, "static", "", WS_POPUP | style,
295 0, 0, 10, 10, 0, 0, 0, NULL);
296 assert( hwnd != 0);
297
299 ok( ret ||
300 broken( !ret) /* Win 9x/ME */ , "GetScrollRange failed.\n");
301 /* range is 0,0 if there are no H or V scroll bars. 0,100 otherwise */
302 if( !( style & ( WS_VSCROLL | WS_HSCROLL)))
303 ok( min == 0 && max == 0,
304 "Scroll bar range is %d,%d. Expected 0,0. Style %08x\n", min, max, style);
305 else
306 ok(( min == 0 && max == 100) ||
307 broken( min == 0 && max == 0), /* Win 9x/ME */
308 "Scroll bar range is %d,%d. Expected 0,100. Style %08x\n", min, max, style);
310 ok( ret ||
311 broken( !ret) /* Win 9x/ME */ , "GetScrollRange failed.\n");
312 /* range is 0,0 if there are no H or V scroll bars. 0,100 otherwise */
313 if( !( style & ( WS_VSCROLL | WS_HSCROLL)))
314 ok( min == 0 && max == 0,
315 "Scroll bar range is %d,%d. Expected 0,0. Style %08x\n", min, max, style);
316 else
317 ok(( min == 0 && max == 100) ||
318 broken( min == 0 && max == 0), /* Win 9x/ME */
319 "Scroll bar range is %d,%d. Expected 0,100. Style %08x\n", min, max, style);
320 /* test GetScrollInfo, vist for vertical SB */
321 ret = GetScrollInfo( hwnd, SB_VERT, &si);
322 /* should fail if no H or V scroll bar styles are present. Succeed otherwise */
323 if( !( style & ( WS_VSCROLL | WS_HSCROLL)))
324 ok( !ret, "GetScrollInfo succeeded unexpectedly. Style is %08x\n", style);
325 else
326 ok( ret ||
327 broken( !ret), /* Win 9x/ME */
328 "GetScrollInfo failed unexpectedly. Style is %08x\n", style);
329 /* Same for Horizontal SB */
330 ret = GetScrollInfo( hwnd, SB_HORZ, &si);
331 /* should fail if no H or V scroll bar styles are present. Succeed otherwise */
332 if( !( style & ( WS_VSCROLL | WS_HSCROLL)))
333 ok( !ret, "GetScrollInfo succeeded unexpectedly. Style is %08x\n", style);
334 else
335 ok( ret ||
336 broken( !ret), /* Win 9x/ME */
337 "GetScrollInfo failed unexpectedly. Style is %08x\n", style);
338 /* now set the Vertical Scroll range to something that could be the default value it
339 * already has */;
340 ret = SetScrollRange( hwnd, SB_VERT, 0, 100, FALSE);
341 ok( ret, "SetScrollRange failed.\n");
342 /* and request the Horizontal range */
344 ok( ret, "GetScrollRange failed.\n");
345 /* now the range should be 0,100 in ALL cases */
346 ok( min == 0 && max == 100,
347 "Scroll bar range is %d,%d. Expected 0,100. Style %08x\n", min, max, style);
348 /* See what is different now for GetScrollRange */
349 ret = GetScrollInfo( hwnd, SB_HORZ, &si);
350 /* should succeed in ALL cases */
351 ok( ret, "GetScrollInfo failed unexpectedly. Style is %08x\n", style);
352 ret = GetScrollInfo( hwnd, SB_VERT, &si);
353 /* should succeed in ALL cases */
354 ok( ret, "GetScrollInfo failed unexpectedly. Style is %08x\n", style);
355 /* report the windows style */
356 winstyle = GetWindowLongA( hwnd, GWL_STYLE );
357 /* WS_VSCROLL added to the window style */
358 if( !(style & WS_VSCROLL))
359 {
360 if (bThemeActive || style != WS_HSCROLL)
362 ok( (winstyle & (WS_HSCROLL|WS_VSCROLL)) == ( style | WS_VSCROLL),
363 "unexpected style change %08x/%08x\n", winstyle, style);
364 else
365 ok( (winstyle & (WS_HSCROLL|WS_VSCROLL)) == style,
366 "unexpected style change %08x/%08x\n", winstyle, style);
367 }
368 /* do the test again with H and V reversed.
369 * Start with a clean window */
371 hwnd = CreateWindowExA( 0, "static", "", WS_POPUP | style,
372 0, 0, 10, 10, 0, 0, 0, NULL);
373 assert( hwnd != 0);
374 /* Set Horizontal Scroll range to something that could be the default value it
375 * already has */;
376 ret = SetScrollRange( hwnd, SB_HORZ, 0, 100, FALSE);
377 ok( ret, "SetScrollRange failed.\n");
378 /* and request the Vertical range */
380 ok( ret, "GetScrollRange failed.\n");
381 /* now the range should be 0,100 in ALL cases */
382 ok( min == 0 && max == 100,
383 "Scroll bar range is %d,%d. Expected 0,100. Style %08x\n", min, max, style);
384 /* See what is different now for GetScrollRange */
385 ret = GetScrollInfo( hwnd, SB_HORZ, &si);
386 /* should succeed in ALL cases */
387 ok( ret, "GetScrollInfo failed unexpectedly. Style is %08x\n", style);
388 ret = GetScrollInfo( hwnd, SB_VERT, &si);
389 /* should succeed in ALL cases */
390 ok( ret, "GetScrollInfo failed unexpectedly. Style is %08x\n", style);
391 /* report the windows style */
392 winstyle = GetWindowLongA( hwnd, GWL_STYLE );
393 /* WS_HSCROLL added to the window style */
394 if( !(style & WS_HSCROLL))
395 {
396 if (bThemeActive || style != WS_VSCROLL)
398 ok( (winstyle & (WS_HSCROLL|WS_VSCROLL)) == ( style | WS_HSCROLL),
399 "unexpected style change %08x/%08x\n", winstyle, style);
400 else
401 ok( (winstyle & (WS_HSCROLL|WS_VSCROLL)) == style,
402 "unexpected style change %08x/%08x\n", winstyle, style);
403 }
404 /* Slightly change the test to use SetScrollInfo
405 * Start with a clean window */
407 hwnd = CreateWindowExA( 0, "static", "", WS_POPUP | style,
408 0, 0, 10, 10, 0, 0, 0, NULL);
409 assert( hwnd != 0);
410 /* set Horizontal position with SetScrollInfo */
411 si.nPos = 0;
412 si.nMin = 11;
413 si.nMax = 22;
414 si.fMask |= SIF_RANGE;
416 ok( ret, "SetScrollInfo failed. Style is %08x\n", style);
417 /* and request the Vertical range */
419 ok( ret, "GetScrollRange failed.\n");
420 /* now the range should be 0,100 in ALL cases */
421 ok( min == 0 && max == 100,
422 "Scroll bar range is %d,%d. Expected 0,100. Style %08x\n", min, max, style);
423 /* See what is different now for GetScrollRange */
424 ret = GetScrollInfo( hwnd, SB_HORZ, &si);
425 /* should succeed in ALL cases */
426 ok( ret, "GetScrollInfo failed unexpectedly. Style is %08x\n", style);
427 ret = GetScrollInfo( hwnd, SB_VERT, &si);
428 /* should succeed in ALL cases */
429 ok( ret, "GetScrollInfo failed unexpectedly. Style is %08x\n", style);
430 /* also test if the window scroll bars are enabled */
432 ok( !ret, "Vertical window scroll bar was not enabled\n");
434 ok( !ret, "Horizontal window scroll bar was not enabled\n");
436 /* finally, check if adding a WS_[HV]SCROLL style of a window makes the scroll info
437 * available */
438 if( style & (WS_HSCROLL | WS_VSCROLL)) return;/* only test if not yet set */
439 /* Start with a clean window */
441 hwnd = CreateWindowExA( 0, "static", "", WS_POPUP ,
442 0, 0, 10, 10, 0, 0, 0, NULL);
443 assert( hwnd != 0);
444 ret = GetScrollInfo( hwnd, SB_VERT, &si);
445 /* should fail */
446 ok( !ret, "GetScrollInfo succeeded unexpectedly. Style is %08x\n", style);
447 /* add scroll styles */
448 winstyle = GetWindowLongA( hwnd, GWL_STYLE );
450 ret = GetScrollInfo( hwnd, SB_VERT, &si);
451 /* should still fail */
452 ok( !ret, "GetScrollInfo succeeded unexpectedly. Style is %08x\n", style);
453 /* clean up */
455}
456
459{
460 SCROLLINFO horz, vert;
462 BOOL h_ret, v_ret;
463
464 switch(msg)
465 {
466 case WM_NCCREATE:
467 return cs->lpCreateParams ? DefWindowProcA(hwnd, msg, wparam, lparam) :
468 TRUE;
469
470 case WM_CREATE:
471 horz.cbSize = sizeof horz;
472 horz.fMask = SIF_ALL;
473 horz.nMin = 0xdeadbeaf;
474 horz.nMax = 0xbaadc0de;
475 vert = horz;
476 h_ret = GetScrollInfo(hwnd, SB_HORZ, &horz);
477 v_ret = GetScrollInfo(hwnd, SB_VERT, &vert);
478
479 if(cs->lpCreateParams)
480 {
481 /* WM_NCCREATE was passed to DefWindowProc */
482 if(cs->style & (WS_VSCROLL | WS_HSCROLL))
483 {
484 ok(h_ret && v_ret, "GetScrollInfo() should return NON-zero "
485 "but got h_ret=%d v_ret=%d\n", h_ret, v_ret);
486 ok(vert.nMin == 0 && vert.nMax == 100,
487 "unexpected init values(SB_VERT): min=%d max=%d\n",
488 vert.nMin, vert.nMax);
489 ok(horz.nMin == 0 && horz.nMax == 100,
490 "unexpected init values(SB_HORZ): min=%d max=%d\n",
491 horz.nMin, horz.nMax);
492 }
493 else
494 {
495 ok(!h_ret && !v_ret, "GetScrollInfo() should return zeru, "
496 "but got h_ret=%d v_ret=%d\n", h_ret, v_ret);
497 ok(vert.nMin == 0xdeadbeaf && vert.nMax == 0xbaadc0de,
498 "unexpected initialization(SB_VERT): min=%d max=%d\n",
499 vert.nMin, vert.nMax);
500 ok(horz.nMin == 0xdeadbeaf && horz.nMax == 0xbaadc0de,
501 "unexpected initialization(SB_HORZ): min=%d max=%d\n",
502 horz.nMin, horz.nMax);
503 }
504 }
505 else
506 {
507 ok(!h_ret && !v_ret, "GetScrollInfo() should return zeru, "
508 "but got h_ret=%d v_ret=%d\n", h_ret, v_ret);
509 ok(horz.nMin == 0xdeadbeaf && horz.nMax == 0xbaadc0de &&
510 vert.nMin == 0xdeadbeaf && vert.nMax == 0xbaadc0de,
511 "unexpected initialization\n");
512 }
513 return FALSE; /* abort creation */
514
515 default:
516 /* need for WM_GETMINMAXINFO, which precedes WM_NCCREATE */
517 return 0;
518 }
519}
520
521static void scrollbar_test_init(void)
522{
523 WNDCLASSEXA wc;
524 CHAR cls_name[] = "scroll_test_class";
526 int i;
527
528 memset( &wc, 0, sizeof wc );
529 wc.cbSize = sizeof wc;
536 RegisterClassExA(&wc);
537
538 for(i = 0; i < ARRAY_SIZE(style); i++)
539 {
540 /* need not to destroy these windows due creation abort */
542 100, 100, 100, 100, NULL, NULL, wc.hInstance, (LPVOID)TRUE);
544 100, 100, 100, 100, NULL, NULL, wc.hInstance, (LPVOID)FALSE);
545 }
547}
548
549static void test_SetScrollInfo(void)
550{
551 SCROLLINFO si;
552 HWND mainwnd;
553 BOOL ret;
554
555 mainwnd = create_main_test_wnd();
556
558 ok(ret, "scroll bar disabled\n");
559
561
563 ok(!ret, "scroll bar enabled\n");
564
565 memset(&si, 0, sizeof(si));
566 si.cbSize = sizeof(si);
567 si.fMask = 0xf;
569 ok(ret, "got %d\n", ret);
570
571 /* SetScrollInfo */
572 memset(&si, 0, sizeof(si));
573 si.cbSize = sizeof(si);
575 ok(!ret, "scroll bar enabled\n");
577 si.nMax = 100;
578 si.nMin = 10;
579 si.nPos = 0;
580 si.nPage = 100;
583 ok(!ret, "scroll bar enabled\n");
584
585 si.fMask = 0xf;
587 ok(ret, "got %d\n", ret);
588
590 ok(IsWindowEnabled(hScroll), "expected enabled scrollbar\n");
591
593 si.nMax = 10;
594 si.nMin = 100;
595 si.nPos = 0;
596 si.nPage = 100;
599 ok(ret, "scroll bar disabled\n");
600
602 DestroyWindow(mainwnd);
603}
604
606
608
610{
611 if (msg == WM_CREATE && ((CREATESTRUCTA*)lparam)->lpCreateParams)
613
614 if (msg == SBM_SETSCROLLINFO)
616
618}
619
620static void test_subclass(void)
621{
622 SCROLLBARINFO scroll_info;
624 WNDCLASSA wc;
625 LRESULT res;
626 HWND hwnd;
627 BOOL r;
628
630 ok(r, "GetClassInfoEx failed: %u\n", GetLastError());
631 scrollbar_wndproc = class_info.lpfnWndProc;
632
633 memset(&wc, 0, sizeof(wc));
634 wc.cbWndExtra = class_info.cbWndExtra + 3; /* more space than needed works */
636 wc.lpszClassName = "MyTestSubclass";
638 r = RegisterClassA(&wc);
639 ok(r, "RegisterClass failed: %u\n", GetLastError());
640
641 hwnd = CreateWindowExA( 0, "MyTestSubclass", "Scroll", WS_OVERLAPPEDWINDOW,
643 ok(hwnd != NULL, "Failed to create window: %u\n", GetLastError());
644
645 r = SetScrollRange(hwnd, SB_CTL, 0, 100, TRUE);
646 ok(r, "SetScrollRange failed: %u\n", GetLastError());
647
649 ok(!res, "SetScrollPos returned %lu\n", res);
650
651 memset(&set_scrollinfo, 0xcc, sizeof(set_scrollinfo));
653 ok(res == 2, "SetScrollPos returned %lu\n", res);
654 ok(set_scrollinfo.cbSize == sizeof(SCROLLINFO), "cbSize = %u\n", set_scrollinfo.cbSize);
656 ok(set_scrollinfo.fMask == (0x1000 | SIF_POS), "fMask = %x\n", set_scrollinfo.fMask);
657 ok(set_scrollinfo.nPos == 1, "nPos = %x\n", set_scrollinfo.nPos);
658
659 memset(&scroll_info, 0xcc, sizeof(scroll_info));
660 scroll_info.cbSize = sizeof(scroll_info);
661 res = SendMessageA(hwnd, SBM_GETSCROLLBARINFO, 0, (LPARAM)&scroll_info);
662 ok(res == 1, "SBM_GETSCROLLBARINFO returned %lu\n", res);
663
665
666 /* if we skip calling wndproc for WM_CREATE, window is not considered a scrollbar */
667 hwnd = CreateWindowExA( 0, "MyTestSubclass", "Scroll", WS_OVERLAPPEDWINDOW,
668 CW_USEDEFAULT, CW_USEDEFAULT, 100, 100, NULL, NULL, GetModuleHandleA(NULL), (void *)1 );
669 ok(hwnd != NULL, "Failed to create window: %u\n", GetLastError());
670
671 memset(&scroll_info, 0xcc, sizeof(scroll_info));
672 scroll_info.cbSize = sizeof(scroll_info);
673 res = SendMessageA(hwnd, SBM_GETSCROLLBARINFO, 0, (LPARAM)&scroll_info);
674 ok(!res, "SBM_GETSCROLLBARINFO returned %lu\n", res);
675
677
678 /* not enough space in extra data */
679 wc.cbWndExtra = class_info.cbWndExtra - 1;
680 wc.lpszClassName = "MyTestSubclass2";
681 r = RegisterClassA(&wc);
682 ok(r, "RegisterClass failed: %u\n", GetLastError());
683
684 hwnd = CreateWindowExA( 0, "MyTestSubclass2", "Scroll", WS_OVERLAPPEDWINDOW,
686 ok(hwnd != NULL, "Failed to create window: %u\n", GetLastError());
687
688 memset(&scroll_info, 0xcc, sizeof(scroll_info));
689 scroll_info.cbSize = sizeof(scroll_info);
690 res = SendMessageA(hwnd, SBM_GETSCROLLBARINFO, 0, (LPARAM)&scroll_info);
691 ok(!res, "SBM_GETSCROLLBARINFO returned %lu\n", res);
692
693 memset(&set_scrollinfo, 0xcc, sizeof(set_scrollinfo));
695 ok(res == 0, "SetScrollPos returned %lu\n", res);
696 ok(set_scrollinfo.cbSize == sizeof(SCROLLINFO), "cbSize = %u\n", set_scrollinfo.cbSize);
698 ok(set_scrollinfo.fMask == (0x1000 | SIF_POS), "fMask = %x\n", set_scrollinfo.fMask);
699 ok(set_scrollinfo.nPos == 1, "nPos = %x\n", set_scrollinfo.nPos);
700
702}
703
704START_TEST ( scroll )
705{
706 WNDCLASSA wc;
707 HMODULE hUxtheme;
709
711 wc.cbClsExtra = 0;
712 wc.cbWndExtra = 0;
714 wc.hIcon = NULL;
717 wc.lpszMenuName = NULL;
718 wc.lpszClassName = "MyTestWnd";
720 RegisterClassA(&wc);
721
729
730 /* Some test results vary depending of theming being active or not */
731 hUxtheme = LoadLibraryA("uxtheme.dll");
732 if (hUxtheme)
733 {
734 pIsThemeActive = (void*)GetProcAddress(hUxtheme, "IsThemeActive");
735 if (pIsThemeActive)
737 FreeLibrary(hUxtheme);
738 }
739
744
746}
@ lparam
Definition: SystemMenu.c:31
@ wparam
Definition: SystemMenu.c:30
#define broken(x)
Definition: _sntprintf.h:21
#define VOID
Definition: acefi.h:82
Arabic default style
Definition: afstyles.h:94
#define ok(value,...)
Definition: atltest.h:57
#define START_TEST(x)
Definition: atltest.h:75
static const char * wine_dbgstr_rect(const RECT *prc)
Definition: atltest.h:160
#define msg(x)
Definition: auth_time.c:54
HWND hWnd
Definition: settings.c:17
#define ARRAY_SIZE(A)
Definition: main.h:33
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define SetLastError(x)
Definition: compat.h:752
HANDLE HWND
Definition: compat.h:19
#define GetProcAddress(x, y)
Definition: compat.h:753
#define FreeLibrary(x)
Definition: compat.h:748
#define CALLBACK
Definition: compat.h:35
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryA(LPCSTR lpLibFileName)
Definition: loader.c:111
#define assert(x)
Definition: debug.h:53
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLuint res
Definition: glext.h:9613
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
#define cs
Definition: i386-dis.c:442
HWND hMainWnd
Definition: magnifier.c:32
#define todo_wine
Definition: custom.c:79
static const char cls_name[]
Definition: compobj.c:2476
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:63
#define min(a, b)
Definition: monoChain.cc:55
unsigned int UINT
Definition: ndis.h:50
#define BOOL
Definition: nt_native.h:43
#define WS_CHILD
Definition: pedump.c:617
#define WS_OVERLAPPEDWINDOW
Definition: pedump.c:637
#define WS_POPUP
Definition: pedump.c:616
#define WS_VSCROLL
Definition: pedump.c:627
#define WS_VISIBLE
Definition: pedump.c:620
long LONG
Definition: pedump.c:60
#define WS_HSCROLL
Definition: pedump.c:628
static void test_subclass(void)
Definition: scroll.c:620
static HWND hScroll
Definition: scroll.c:28
static BOOL bThemeActive
Definition: scroll.c:29
static void scrollbar_test_track(void)
Definition: scroll.c:70
static LRESULT CALLBACK scroll_init_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
Definition: scroll.c:457
static void scrollbar_test_init(void)
Definition: scroll.c:521
static LRESULT CALLBACK subclass_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
Definition: scroll.c:609
static void test_EnableScrollBar(void)
Definition: scroll.c:87
static void test_ShowScrollBar(void)
Definition: scroll.c:195
static WNDPROC scrollbar_wndproc
Definition: scroll.c:605
static void test_SetScrollInfo(void)
Definition: scroll.c:549
static LRESULT CALLBACK MyWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: scroll.c:31
static HWND create_main_test_wnd(void)
Definition: scroll.c:56
static void test_GetScrollBarInfo(void)
Definition: scroll.c:220
static void scrollbar_test_default(DWORD style)
Definition: scroll.c:287
static void test_SetScrollPos(void)
Definition: scroll.c:138
static SCROLLINFO set_scrollinfo
Definition: scroll.c:607
#define win_skip
Definition: test.h:160
#define memset(x, y, z)
Definition: compat.h:39
& rect
Definition: startmenu.cpp:1413
HBRUSH hbrBackground
Definition: winuser.h:3170
HICON hIcon
Definition: winuser.h:3168
HINSTANCE hInstance
Definition: winuser.h:3167
HCURSOR hCursor
Definition: winuser.h:3169
int cbWndExtra
Definition: winuser.h:3166
UINT style
Definition: winuser.h:3163
LPCSTR lpszMenuName
Definition: winuser.h:3171
LPCSTR lpszClassName
Definition: winuser.h:3172
WNDPROC lpfnWndProc
Definition: winuser.h:3164
int cbClsExtra
Definition: winuser.h:3165
HINSTANCE hInstance
Definition: winuser.h:3206
HCURSOR hCursor
Definition: winuser.h:3208
UINT style
Definition: winuser.h:3202
UINT cbSize
Definition: winuser.h:3201
WNDPROC lpfnWndProc
Definition: winuser.h:3203
LPCSTR lpszClassName
Definition: winuser.h:3211
HBRUSH hbrBackground
Definition: winuser.h:3209
DWORD rgstate[CCHILDREN_SCROLLBAR+1]
Definition: winuser.h:3754
#define max(a, b)
Definition: svc.c:63
static IsThemeActiveT pIsThemeActive
Definition: treelist.c:367
int32_t INT
Definition: typedefs.h:58
int ret
#define OBJID_VSCROLL
Definition: winable.h:20
#define OBJID_HSCROLL
Definition: winable.h:21
#define OBJID_CLIENT
Definition: winable.h:19
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
_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 WINAPI
Definition: msvc.h:6
HGDIOBJ WINAPI GetStockObject(_In_ int)
#define WHITE_BRUSH
Definition: wingdi.h:902
#define CS_VREDRAW
Definition: winuser.h:658
BOOL WINAPI IsWindow(_In_opt_ HWND)
#define WM_HSCROLL
Definition: winuser.h:1743
#define MAKELPARAM(l, h)
Definition: winuser.h:4008
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 COLOR_WINDOW
Definition: winuser.h:918
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
BOOL WINAPI ReleaseCapture(void)
Definition: message.c:2890
BOOL WINAPI UnregisterClassA(_In_ LPCSTR, HINSTANCE)
LONG WINAPI GetWindowLongA(_In_ HWND, _In_ int)
LRESULT WINAPI DefWindowProcA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
struct tagSCROLLINFO SCROLLINFO
#define WM_VSCROLL
Definition: winuser.h:1744
#define CreateWindowA(a, b, c, d, e, f, g, h, i, j, k)
Definition: winuser.h:4315
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
#define SIF_RANGE
Definition: winuser.h:1235
#define WM_CREATE
Definition: winuser.h:1608
__analysis_noreturn void WINAPI PostQuitMessage(_In_ int)
HBRUSH WINAPI GetSysColorBrush(_In_ int)
#define SB_VERT
Definition: winuser.h:553
LONG WINAPI SetWindowLongW(_In_ HWND, _In_ int, _In_ LONG)
#define ESB_DISABLE_BOTH
Definition: winuser.h:556
#define CS_HREDRAW
Definition: winuser.h:653
#define ESB_DISABLE_RTDN
Definition: winuser.h:561
#define IDC_ARROW
Definition: winuser.h:687
LRESULT WINAPI SendMessageA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI GetClassInfoExA(_In_opt_ HINSTANCE, _In_ LPCSTR, _Out_ LPWNDCLASSEXA)
#define SIF_PAGE
Definition: winuser.h:1233
struct tagSCROLLBARINFO * LPSCROLLBARINFO
#define WM_LBUTTONDOWN
Definition: winuser.h:1776
#define SIF_TRACKPOS
Definition: winuser.h:1237
int WINAPI SetScrollPos(_In_ HWND, _In_ int, _In_ int, _In_ BOOL)
BOOL WINAPI GetScrollRange(_In_ HWND, _In_ int, _Out_ LPINT, _Out_ LPINT)
#define WM_NCCREATE
Definition: winuser.h:1683
ATOM WINAPI RegisterClassA(_In_ CONST WNDCLASSA *)
ATOM WINAPI RegisterClassExA(_In_ CONST WNDCLASSEXA *)
BOOL WINAPI SetScrollRange(_In_ HWND, _In_ int, _In_ int, _In_ int, _In_ BOOL)
#define SIF_DISABLENOSCROLL
Definition: winuser.h:1236
#define STATE_SYSTEM_INVISIBLE
Definition: winuser.h:2877
#define SIF_ALL
Definition: winuser.h:1232
#define IDC_IBEAM
Definition: winuser.h:688
BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL)
#define STATE_SYSTEM_OFFSCREEN
Definition: winuser.h:2878
BOOL WINAPI IsWindowEnabled(_In_ HWND)
#define CW_USEDEFAULT
Definition: winuser.h:225
#define SIF_POS
Definition: winuser.h:1234
#define SB_CTL
Definition: winuser.h:554
BOOL WINAPI OffsetRect(_Inout_ LPRECT, _In_ int, _In_ int)
#define SW_SHOW
Definition: winuser.h:775
int WINAPI SetScrollInfo(_In_ HWND, _In_ int, _In_ LPCSCROLLINFO, _In_ BOOL)
#define WM_DESTROY
Definition: winuser.h:1609
BOOL WINAPI ShowScrollBar(_In_ HWND, _In_ int, _In_ BOOL)
int WINAPI GetScrollPos(_In_ HWND, _In_ int)
LRESULT(CALLBACK * WNDPROC)(HWND, UINT, WPARAM, LPARAM)
Definition: winuser.h:2906
#define GWL_STYLE
Definition: winuser.h:852
BOOL WINAPI GetScrollInfo(_In_ HWND, _In_ int, _Inout_ LPSCROLLINFO)
BOOL WINAPI IsWindowVisible(_In_ HWND)
BOOL WINAPI DestroyWindow(_In_ HWND)
BOOL WINAPI EnableScrollBar(_In_ HWND, _In_ UINT, _In_ UINT)
#define ESB_ENABLE_BOTH
Definition: winuser.h:563
BOOL WINAPI EqualRect(_In_ LPCRECT, _In_ LPCRECT)
BOOL WINAPI MoveWindow(_In_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ BOOL)
LRESULT WINAPI CallWindowProcA(_In_ WNDPROC, _In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
HCURSOR WINAPI LoadCursorA(_In_opt_ HINSTANCE, _In_ LPCSTR)
Definition: cursoricon.c:2090
#define SB_HORZ
Definition: winuser.h:552
#define ESB_DISABLE_LTUP
Definition: winuser.h:559
const char * LPCSTR
Definition: xmlstorage.h:183
char CHAR
Definition: xmlstorage.h:175