ReactOS 0.4.15-dev-5884-gab5aff5
scroll.c File Reference
#include <assert.h>
#include <stdarg.h>
#include <stdio.h>
#include <windows.h>
#include "wine/test.h"
Include dependency graph for scroll.c:

Go to the source code of this file.

Functions

static LRESULT CALLBACK MyWndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
 
static HWND create_main_test_wnd (void)
 
static void scrollbar_test_track (void)
 
static void test_EnableScrollBar (void)
 
static void test_SetScrollPos (void)
 
static void test_ShowScrollBar (void)
 
static void test_GetScrollBarInfo (void)
 
static void scrollbar_test_default (DWORD style)
 
static LRESULT CALLBACK scroll_init_proc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
 
static void scrollbar_test_init (void)
 
static void test_SetScrollInfo (void)
 
static LRESULT CALLBACK subclass_proc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
 
static void test_subclass (void)
 
 START_TEST (scroll)
 

Variables

static HWND hScroll
 
static BOOL bThemeActive = FALSE
 
static WNDPROC scrollbar_wndproc
 
static SCROLLINFO set_scrollinfo
 

Function Documentation

◆ create_main_test_wnd()

static HWND create_main_test_wnd ( void  )
static

Definition at line 56 of file scroll.c.

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}
#define ok(value,...)
Definition: atltest.h:57
#define NULL
Definition: types.h:112
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
HWND hMainWnd
Definition: magnifier.c:32
#define WS_OVERLAPPEDWINDOW
Definition: pedump.c:637
#define WS_VSCROLL
Definition: pedump.c:627
#define WS_HSCROLL
Definition: pedump.c:628
static HWND hScroll
Definition: scroll.c:28
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 CW_USEDEFAULT
Definition: winuser.h:225

Referenced by scrollbar_test_track(), test_EnableScrollBar(), test_GetScrollBarInfo(), test_SetScrollInfo(), test_SetScrollPos(), and test_ShowScrollBar().

◆ MyWndProc()

static LRESULT CALLBACK MyWndProc ( HWND  hWnd,
UINT  msg,
WPARAM  wParam,
LPARAM  lParam 
)
static

Definition at line 31 of file scroll.c.

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}
#define msg(x)
Definition: auth_time.c:54
HWND hWnd
Definition: settings.c:17
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
#define WS_CHILD
Definition: pedump.c:617
#define WS_VISIBLE
Definition: pedump.c:620
#define WM_HSCROLL
Definition: winuser.h:1733
BOOL WINAPI ReleaseCapture(void)
Definition: message.c:2890
LRESULT WINAPI DefWindowProcA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define WM_VSCROLL
Definition: winuser.h:1734
#define CreateWindowA(a, b, c, d, e, f, g, h, i, j, k)
Definition: winuser.h:4305
#define WM_CREATE
Definition: winuser.h:1598
__analysis_noreturn void WINAPI PostQuitMessage(_In_ int)
#define WM_DESTROY
Definition: winuser.h:1599

Referenced by START_TEST().

◆ scroll_init_proc()

static LRESULT CALLBACK scroll_init_proc ( HWND  hwnd,
UINT  msg,
WPARAM  wparam,
LPARAM  lparam 
)
static

Definition at line 457 of file scroll.c.

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}
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
#define cs
Definition: i386-dis.c:443
static UINT WPARAM wparam
Definition: combo.c:716
static UINT WPARAM LPARAM lparam
Definition: combo.c:716
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
#define SB_VERT
Definition: winuser.h:553
#define WM_NCCREATE
Definition: winuser.h:1673
#define SIF_ALL
Definition: winuser.h:1222
BOOL WINAPI GetScrollInfo(_In_ HWND, _In_ int, _Inout_ LPSCROLLINFO)
#define SB_HORZ
Definition: winuser.h:552

Referenced by scrollbar_test_init().

◆ scrollbar_test_default()

static void scrollbar_test_default ( DWORD  style)
static

Definition at line 287 of file scroll.c.

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}
#define broken(x)
Definition: _sntprintf.h:21
Arabic default style
Definition: afstyles.h:94
#define assert(x)
Definition: debug.h:53
unsigned long DWORD
Definition: ntddk_ex.h:95
#define todo_wine
Definition: custom.c:79
#define min(a, b)
Definition: monoChain.cc:55
#define WS_POPUP
Definition: pedump.c:616
static BOOL bThemeActive
Definition: scroll.c:29
#define max(a, b)
Definition: svc.c:63
int32_t INT
Definition: typedefs.h:58
int ret
LONG WINAPI GetWindowLongA(_In_ HWND, _In_ int)
struct tagSCROLLINFO SCROLLINFO
#define SIF_RANGE
Definition: winuser.h:1225
LONG WINAPI SetWindowLongW(_In_ HWND, _In_ int, _In_ LONG)
#define SIF_TRACKPOS
Definition: winuser.h:1227
BOOL WINAPI GetScrollRange(_In_ HWND, _In_ int, _Out_ LPINT, _Out_ LPINT)
BOOL WINAPI SetScrollRange(_In_ HWND, _In_ int, _In_ int, _In_ int, _In_ BOOL)
int WINAPI SetScrollInfo(_In_ HWND, _In_ int, _In_ LPCSCROLLINFO, _In_ BOOL)
#define GWL_STYLE
Definition: winuser.h:846
BOOL WINAPI DestroyWindow(_In_ HWND)
BOOL WINAPI EnableScrollBar(_In_ HWND, _In_ UINT, _In_ UINT)
#define ESB_ENABLE_BOTH
Definition: winuser.h:563

Referenced by START_TEST().

◆ scrollbar_test_init()

static void scrollbar_test_init ( void  )
static

Definition at line 521 of file scroll.c.

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}
#define ARRAY_SIZE(A)
Definition: main.h:33
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
static const char cls_name[]
Definition: compobj.c:2476
long LONG
Definition: pedump.c:60
static LRESULT CALLBACK scroll_init_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
Definition: scroll.c:457
#define memset(x, y, z)
Definition: compat.h:39
HINSTANCE hInstance
Definition: winuser.h:3196
HCURSOR hCursor
Definition: winuser.h:3198
UINT style
Definition: winuser.h:3192
UINT cbSize
Definition: winuser.h:3191
WNDPROC lpfnWndProc
Definition: winuser.h:3193
LPCSTR lpszClassName
Definition: winuser.h:3201
HBRUSH hbrBackground
Definition: winuser.h:3199
HGDIOBJ WINAPI GetStockObject(_In_ int)
#define WHITE_BRUSH
Definition: wingdi.h:902
#define CS_VREDRAW
Definition: winuser.h:653
BOOL WINAPI UnregisterClassA(_In_ LPCSTR, HINSTANCE)
#define CS_HREDRAW
Definition: winuser.h:648
#define IDC_ARROW
Definition: winuser.h:682
ATOM WINAPI RegisterClassExA(_In_ CONST WNDCLASSEXA *)
HCURSOR WINAPI LoadCursorA(_In_opt_ HINSTANCE, _In_ LPCSTR)
Definition: cursoricon.c:2059
const char * LPCSTR
Definition: xmlstorage.h:183
char CHAR
Definition: xmlstorage.h:175

Referenced by START_TEST().

◆ scrollbar_test_track()

static void scrollbar_test_track ( void  )
static

Definition at line 70 of file scroll.c.

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}
static HWND create_main_test_wnd(void)
Definition: scroll.c:56
BOOL WINAPI IsWindow(_In_opt_ HWND)
#define MAKELPARAM(l, h)
Definition: winuser.h:3998
LRESULT WINAPI SendMessageA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define WM_LBUTTONDOWN
Definition: winuser.h:1766

Referenced by START_TEST().

◆ START_TEST()

START_TEST ( scroll  )

Definition at line 704 of file scroll.c.

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}
#define VOID
Definition: acefi.h:82
#define GetProcAddress(x, y)
Definition: compat.h:753
#define FreeLibrary(x)
Definition: compat.h:748
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryA(LPCSTR lpLibFileName)
Definition: loader.c:111
#define BOOL
Definition: nt_native.h:43
static void test_subclass(void)
Definition: scroll.c:620
static void scrollbar_test_track(void)
Definition: scroll.c:70
static void scrollbar_test_init(void)
Definition: scroll.c:521
static void test_EnableScrollBar(void)
Definition: scroll.c:87
static void test_ShowScrollBar(void)
Definition: scroll.c:195
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 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
HBRUSH hbrBackground
Definition: winuser.h:3160
HICON hIcon
Definition: winuser.h:3158
HINSTANCE hInstance
Definition: winuser.h:3157
HCURSOR hCursor
Definition: winuser.h:3159
int cbWndExtra
Definition: winuser.h:3156
UINT style
Definition: winuser.h:3153
LPCSTR lpszMenuName
Definition: winuser.h:3161
LPCSTR lpszClassName
Definition: winuser.h:3162
WNDPROC lpfnWndProc
Definition: winuser.h:3154
int cbClsExtra
Definition: winuser.h:3155
static IsThemeActiveT pIsThemeActive
Definition: treelist.c:367
#define WINAPI
Definition: msvc.h:6
#define COLOR_WINDOW
Definition: winuser.h:912
HBRUSH WINAPI GetSysColorBrush(_In_ int)
ATOM WINAPI RegisterClassA(_In_ CONST WNDCLASSA *)
#define IDC_IBEAM
Definition: winuser.h:683

◆ subclass_proc()

static LRESULT CALLBACK subclass_proc ( HWND  hwnd,
UINT  msg,
WPARAM  wparam,
LPARAM  lparam 
)
static

Definition at line 609 of file scroll.c.

610{
611 if (msg == WM_CREATE && ((CREATESTRUCTA*)lparam)->lpCreateParams)
613
614 if (msg == SBM_SETSCROLLINFO)
616
618}
static WNDPROC scrollbar_wndproc
Definition: scroll.c:605
static SCROLLINFO set_scrollinfo
Definition: scroll.c:607
LRESULT WINAPI CallWindowProcA(_In_ WNDPROC, _In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)

Referenced by test_subclass().

◆ test_EnableScrollBar()

static void test_EnableScrollBar ( void  )
static

Definition at line 87 of file scroll.c.

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}
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define SetLastError(x)
Definition: compat.h:752
DWORD WINAPI GetLastError(void)
Definition: except.c:1040
#define ESB_DISABLE_BOTH
Definition: winuser.h:556
#define ESB_DISABLE_RTDN
Definition: winuser.h:561
BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL)
BOOL WINAPI IsWindowEnabled(_In_ HWND)
#define SB_CTL
Definition: winuser.h:554
#define ESB_DISABLE_LTUP
Definition: winuser.h:559

Referenced by START_TEST().

◆ test_GetScrollBarInfo()

static void test_GetScrollBarInfo ( void  )
static

Definition at line 220 of file scroll.c.

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}
HANDLE HWND
Definition: compat.h:19
static __inline const char * wine_dbgstr_rect(const RECT *rect)
Definition: debug.h:219
#define win_skip
Definition: test.h:160
& rect
Definition: startmenu.cpp:1413
DWORD rgstate[CCHILDREN_SCROLLBAR+1]
Definition: winuser.h:3744
#define OBJID_VSCROLL
Definition: winable.h:20
#define OBJID_HSCROLL
Definition: winable.h:21
#define OBJID_CLIENT
Definition: winable.h:19
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
struct tagSCROLLBARINFO * LPSCROLLBARINFO
#define STATE_SYSTEM_INVISIBLE
Definition: winuser.h:2867
#define STATE_SYSTEM_OFFSCREEN
Definition: winuser.h:2868
BOOL WINAPI OffsetRect(_Inout_ LPRECT, _In_ int, _In_ int)
#define SW_SHOW
Definition: winuser.h:769
BOOL WINAPI EqualRect(_In_ LPCRECT, _In_ LPCRECT)
BOOL WINAPI MoveWindow(_In_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ BOOL)

Referenced by START_TEST().

◆ test_SetScrollInfo()

static void test_SetScrollInfo ( void  )
static

Definition at line 549 of file scroll.c.

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}
#define SIF_PAGE
Definition: winuser.h:1223
#define SIF_DISABLENOSCROLL
Definition: winuser.h:1226
#define SIF_POS
Definition: winuser.h:1224

Referenced by START_TEST().

◆ test_SetScrollPos()

static void test_SetScrollPos ( void  )
static

Definition at line 138 of file scroll.c.

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}
int WINAPI SetScrollPos(_In_ HWND, _In_ int, _In_ int, _In_ BOOL)
int WINAPI GetScrollPos(_In_ HWND, _In_ int)

Referenced by START_TEST().

◆ test_ShowScrollBar()

static void test_ShowScrollBar ( void  )
static

Definition at line 195 of file scroll.c.

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}
BOOL WINAPI ShowScrollBar(_In_ HWND, _In_ int, _In_ BOOL)
BOOL WINAPI IsWindowVisible(_In_ HWND)

Referenced by START_TEST().

◆ test_subclass()

static void test_subclass ( void  )
static

Definition at line 620 of file scroll.c.

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}
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLuint res
Definition: glext.h:9613
static LRESULT CALLBACK subclass_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
Definition: scroll.c:609
LONG_PTR LPARAM
Definition: windef.h:208
LONG_PTR LRESULT
Definition: windef.h:209
BOOL WINAPI GetClassInfoExA(_In_opt_ HINSTANCE, _In_ LPCSTR, _Out_ LPWNDCLASSEXA)

Referenced by START_TEST().

Variable Documentation

◆ bThemeActive

◆ hScroll

◆ scrollbar_wndproc

WNDPROC scrollbar_wndproc
static

Definition at line 605 of file scroll.c.

Referenced by subclass_proc(), and test_subclass().

◆ set_scrollinfo

SCROLLINFO set_scrollinfo
static

Definition at line 607 of file scroll.c.

Referenced by subclass_proc(), and test_subclass().