ScrollDC patch.

Rein Klazes rklazes at xs4all.nl
Sun Feb 3 14:01:48 CST 2002


Hello,

This fixes display problems with scrolling of a listview control using
native common controls. Comctl32 calls ScrollWindowsEx with rect equal
to the client rectangele and clipping rectangle uqual to the client
rectangle minus the header. During scrolling downwards the header
pixels are painted all over the listview control.
MS documentations says that ScrollWindowEx will paint pixels that are
scrolled from outside into the clip rectangle. This, I verified under
Win2000, is NOT true. Both ScrollWindow(Ex) and ScrollDC only move
pixels that are, and remain in, the clip rectangle. 


Changelog:
	dlls/x11drv	: scroll.c
	In X11DRV_ScrollDC only move pixels that are within the 
	clip rectangle, before and after they are scrolled.

Rein.
-- 
Rein Klazes
rklazes at xs4all.nl
-------------- next part --------------
--- wine/dlls/x11drv/scroll.c	Mon Oct 15 19:56:45 2001
+++ mywine/dlls/x11drv/scroll.c	Sun Feb  3 14:39:23 2002
@@ -19,7 +19,7 @@
 #include "win.h"
 #include "debugtools.h"
 
-DEFAULT_DEBUG_CHANNEL(x11drv);
+DEFAULT_DEBUG_CHANNEL(scroll);
 
 
 /*************************************************************************
@@ -63,7 +63,7 @@
 BOOL X11DRV_ScrollDC( HDC hdc, INT dx, INT dy, const RECT *rc,
                       const RECT *clipRect, HRGN hrgnUpdate, LPRECT rcUpdate )
 {
-    RECT rect, rClip, rSrc;
+    RECT rect, rClip, rDst;
 
     TRACE( "%04x %d,%d hrgnUpdate=%04x rcUpdate = %p\n", hdc, dx, dy, hrgnUpdate, rcUpdate );
     if (clipRect) TRACE( "cliprc = (%d,%d,%d,%d)\n",
@@ -82,16 +82,16 @@
     }
     else rClip = rect;
 
-    rSrc = rClip;
-    OffsetRect( &rSrc, -dx, -dy );
-    IntersectRect( &rSrc, &rSrc, &rect );
+    rDst = rClip;
+    OffsetRect( &rDst, dx,  dy );
+    IntersectRect( &rDst, &rDst, &rClip );
 
-    if (!IsRectEmpty(&rSrc))
+    if (!IsRectEmpty(&rDst))
     {
         /* copy bits */
-        if (!BitBlt( hdc, rSrc.left + dx, rSrc.top + dy,
-                     rSrc.right - rSrc.left, rSrc.bottom - rSrc.top,
-                     hdc, rSrc.left, rSrc.top, SRCCOPY))
+        if (!BitBlt( hdc, rDst.left, rDst.top,
+                     rDst.right - rDst.left, rDst.bottom - rDst.top,
+                     hdc, rDst.left - dx, rDst.top - dy, SRCCOPY))
             return FALSE;
     }
 
@@ -100,22 +100,14 @@
     if (hrgnUpdate || rcUpdate)
     {
         HRGN hrgn = hrgnUpdate, hrgn2;
-        POINT pt;
 
         /* map everything to device coordinates */
-        pt.x = rect.left + dx;
-        pt.y = rect.top + dy;
-        LPtoDP( hdc, &pt, 1 );
-        LPtoDP( hdc, (LPPOINT)&rect, 2 );
         LPtoDP( hdc, (LPPOINT)&rClip, 2 );
-        dx = pt.x - rect.left;
-        dy = pt.y - rect.top;
+        LPtoDP( hdc, (LPPOINT)&rDst, 2 );
 
-        hrgn2 = CreateRectRgnIndirect( &rect );
+        hrgn2 = CreateRectRgnIndirect( &rDst );
         if (hrgn) SetRectRgn( hrgn, rClip.left, rClip.top, rClip.right, rClip.bottom );
         else hrgn = CreateRectRgn( rClip.left, rClip.top, rClip.right, rClip.bottom );
-        CombineRgn( hrgn, hrgn, hrgn2, RGN_AND );
-        OffsetRgn( hrgn2, dx, dy );
         CombineRgn( hrgn, hrgn, hrgn2, RGN_DIFF );
 
         if( rcUpdate )
@@ -134,6 +126,9 @@
 
 /*************************************************************************
  *		ScrollWindowEx   (X11DRV.@)
+ *
+ * Note: contrary to what the doc says, pixels that are scrolled from the 
+ *      outside of clipRect to the inside are NOT painted.
  */
 INT X11DRV_ScrollWindowEx( HWND hwnd, INT dx, INT dy,
                            const RECT *rect, const RECT *clipRect,


More information about the wine-patches mailing list