Fix many of the scrollbar issues. However, MDI Scrollbars are still not working perfectly. Patch by tinus <o112w8r02@sneakemail.com>. Fixes bug 606
Modified: trunk/reactos/lib/user32/windows/mdi.c
Modified: trunk/reactos/subsys/win32k/ntuser/scrollbar.c

Modified: trunk/reactos/lib/user32/windows/mdi.c
--- trunk/reactos/lib/user32/windows/mdi.c	2005-05-02 11:38:48 UTC (rev 14945)
+++ trunk/reactos/lib/user32/windows/mdi.c	2005-05-02 11:42:41 UTC (rev 14946)
@@ -2034,8 +2034,16 @@
 #ifndef __REACTOS__
     HWND *list;
 #else
+    WINDOWINFO WindowInfo;
     HWND hWndCurrent;
 #endif
+    /* The rectangle returned by GetClientRect always has 0,0 as top left
+     * because it is in client coordinates. The rectangles returned by
+     * GetWindowRect are in screen coordinates to make this complicated.
+     *
+     * Apparently (in ReactOS at least) the rcClient returned by GetWindowInfo
+     * is in screen coordinates too.
+     */
 
     GetClientRect( hwnd, &clientRect );
     SetRectEmpty( &childRect );
@@ -2063,6 +2071,13 @@
         HeapFree( GetProcessHeap(), 0, list );
     }
 #else
+    WindowInfo.cbSize = sizeof(WindowInfo);
+    if (!GetWindowInfo(hwnd, &WindowInfo))
+    {
+	ERR("Can't get window info\n");
+	return;
+    }
+
     hWndCurrent = GetWindow(hwnd, GW_CHILD);
     while (hWndCurrent != NULL)
     {
@@ -2077,6 +2092,9 @@
             RECT WindowRect;
 
             GetWindowRect( hWndCurrent, &WindowRect );
+            OffsetRect(&WindowRect,
+       	               -WindowInfo.rcClient.left,
+       	               -WindowInfo.rcClient.top);
             UnionRect( &childRect, &WindowRect, &childRect );
         }
         hWndCurrent = GetWindow(hWndCurrent, GW_HWNDNEXT);
@@ -2086,23 +2104,30 @@
 
     /* set common info values */
     info.cbSize = sizeof(info);
-    info.fMask = SIF_POS | SIF_RANGE;
+    info.fMask = SIF_POS | SIF_RANGE | SIF_PAGE;
 
-    /* set the specific */
+    /* set the specific scrollbars*/
+    /* Note how we set nPos to 0 because we scroll the clients instead of
+     * the window, and we set nPage to 1 bigger than the clientRect because
+     * otherwise the scrollbar never disables. This causes a somewhat ugly
+     * effect though while scrolling.
+     */
     switch( scroll )
     {
 	case SB_BOTH:
 	case SB_HORZ:
 			info.nMin = childRect.left;
-			info.nMax = childRect.right - clientRect.right;
-			info.nPos = clientRect.left - childRect.left;
+			info.nMax = childRect.right;
+			info.nPos = 0;
+			info.nPage = 1 + clientRect.right - clientRect.left;
 			SetScrollInfo(hwnd, SB_HORZ, &info, TRUE);
 			if (scroll == SB_HORZ) break;
 			/* fall through */
 	case SB_VERT:
 			info.nMin = childRect.top;
-			info.nMax = childRect.bottom - clientRect.bottom;
-			info.nPos = clientRect.top - childRect.top;
+			info.nMax = childRect.bottom;
+			info.nPos = 0;
+			info.nPage = 1 + clientRect.bottom - clientRect.top;
 			SetScrollInfo(hwnd, SB_VERT, &info, TRUE);
 			break;
     }

Modified: trunk/reactos/subsys/win32k/ntuser/scrollbar.c
--- trunk/reactos/subsys/win32k/ntuser/scrollbar.c	2005-05-02 11:38:48 UTC (rev 14945)
+++ trunk/reactos/subsys/win32k/ntuser/scrollbar.c	2005-05-02 11:42:41 UTC (rev 14946)
@@ -360,7 +360,7 @@
   /* Check if the scrollbar should be hidden or disabled */
   if (0 != (lpsi->fMask & (SIF_RANGE | SIF_PAGE | SIF_DISABLENOSCROLL)))
     {
-      if (Info->nMin >= Info->nMax - max(Info->nPage - 1, 0))
+      if (Info->nMin >= (int)(Info->nMax - max(Info->nPage - 1, 0)))
         {
           /* Hide or disable scroll-bar */
           if (0 != (lpsi->fMask & SIF_DISABLENOSCROLL))