On 28 Mar 2005 12:48:11 +0200, you wrote: > Rein Klazes <[EMAIL PROTECTED]> writes: > > > dlls/user : scroll.c > > dlls/user/tests : win.c > > > > - GetScrollRange should return an empty range, both upper and lower > > limit zero, if the window has no scrollbars (msdn); > > - GetScrollInfo's return value is FALSE if the window has no scrollbars; > > This breaks the message test: > > msg.c:2761: Test failed: GetScrollInfo error 5 > msg.c:2761: Test failed: GetScrollInfo error 5
I see, SB_CTL is treated different. Attached is an upgraded patch. Changelog: dlls/user : scroll.c dlls/user/tests : win.c - GetScrollRange should return an empty range, both upper and lower limit zero, if the window has no scrollbars (msdn); - GetScrollInfo's return value is TRUE is nBar is SB_CTL or if anything is filled in the SCROLLINFO structure, otherwise the return value is FALSE. Rein.
--- wine/dlls/user/scroll.c 2005-03-25 20:52:36.000000000 +0100 +++ mywine/dlls/user/scroll.c 2005-03-28 15:08:45.000000000 +0200 @@ -1330,8 +1330,6 @@ static INT SCROLL_GetScrollPos(HWND hwnd static BOOL SCROLL_GetScrollRange(HWND hwnd, INT nBar, LPINT lpMin, LPINT lpMax) { LPSCROLLBAR_INFO infoPtr = SCROLL_GetInternalInfo(hwnd, nBar, FALSE); - if (!infoPtr) - return FALSE; if (lpMin) *lpMin = infoPtr ? infoPtr->minVal : 0; if (lpMax) *lpMax = infoPtr ? infoPtr->maxVal : 0; @@ -1741,6 +1739,8 @@ done: * * RETURNS * TRUE if SCROLLINFO is filled + * ( if nBar is SB_CTL, GetScrollInfo returns TRUE even if nothing + * is filled) */ BOOL WINAPI GetScrollInfo(HWND hwnd, INT nBar, LPSCROLLINFO info) { @@ -1748,11 +1748,11 @@ BOOL WINAPI GetScrollInfo(HWND hwnd, INT /* Refer SB_CTL requests to the window */ if (nBar == SB_CTL) + { SendMessageW(hwnd, SBM_GETSCROLLINFO, (WPARAM)0, (LPARAM)info); - else - SCROLL_GetScrollInfo(hwnd, nBar, info); - - return TRUE; + return TRUE; + } + return SCROLL_GetScrollInfo(hwnd, nBar, info); } --- wine/dlls/user/tests/win.c 2005-03-26 08:11:50.000000000 +0100 +++ mywine/dlls/user/tests/win.c 2005-03-27 18:59:14.000000000 +0200 @@ -2650,6 +2650,43 @@ void test_scrollvalidate( HWND parent) DestroyWindow( hwnd2); } +/* couple of tests of return values of scrollbar functions + * called on a scrollbarless window */ +void test_scroll() +{ + BOOL ret; + INT min, max; + SCROLLINFO si; + HWND hwnd = CreateWindowExA(0, "Static", "Wine test window", + WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP, + 100, 100, 200, 200, 0, 0, 0, NULL); + /* horizontal */ + ret = GetScrollRange( hwnd, SB_HORZ, &min, &max); + ok( ret, "GetScrollRange returns FALSE\n"); + ok( min == 0, "minimum scroll pos is %d (should be zero)\n", min); + ok( max == 0, "maximum scroll pos is %d (should be zero)\n", min); + si.cbSize = sizeof( si); + si.fMask = SIF_PAGE; + si.nPage = 0xdeadbeef; + ret = GetScrollInfo( hwnd, SB_HORZ, &si); + ok( !ret, "GetScrollInfo returns %d (should be zero)\n", ret); + ok( si.nPage == 0xdeadbeef, "unexpected value for nPage is %d\n", si.nPage); + /* vertical */ + ret = GetScrollRange( hwnd, SB_VERT, &min, &max); + ok( ret, "GetScrollRange returns FALSE\n"); + ok( min == 0, "minimum scroll pos is %d (should be zero)\n", min); + ok( max == 0, "maximum scroll pos is %d (should be zero)\n", min); + si.cbSize = sizeof( si); + si.fMask = SIF_PAGE; + si.nPage = 0xdeadbeef; + ret = GetScrollInfo( hwnd, SB_VERT, &si); + ok( !ret, "GetScrollInfo returns %d (should be zero)\n", ret); + ok( si.nPage == 0xdeadbeef, "unexpected value for nPage is %d\n", si.nPage); + /* clean up */ + DestroyWindow( hwnd); +} + + START_TEST(win) { pGetAncestor = (void *)GetProcAddress( GetModuleHandleA("user32.dll"), "GetAncestor" ); @@ -2709,6 +2746,7 @@ START_TEST(win) test_validatergn(hwndMain); test_nccalcscroll( hwndMain); test_scrollvalidate( hwndMain); + test_scroll(); UnhookWindowsHookEx(hhook);