charmap: scroll 1 position on SB_LINEDOWN and 1 page on SB_PAGEDOWN, update window...
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Tue, 13 Nov 2007 14:18:44 +0000 (14:18 +0000)
committerTimo Kreuzer <timo.kreuzer@reactos.org>
Tue, 13 Nov 2007 14:18:44 +0000 (14:18 +0000)
svn path=/trunk/; revision=30422

reactos/base/applications/charmap/map.c
reactos/base/applications/charmap/precomp.h

index 565d4d5..6b3825d 100644 (file)
@@ -91,7 +91,7 @@ FillGrid(PMAP infoPtr,
     for (y = 0; y < YCELLS; y++)\r
     for (x = 0; x < XCELLS; x++)\r
     {\r
-        ch = (WCHAR)((256 * infoPtr->iPage) + (XCELLS * y) + x);\r
+        ch = (WCHAR)((XCELLS * (y + infoPtr->iYStart)) + x);\r
 \r
         TagFontToCell(&infoPtr->Cells[y][x], ch);\r
 \r
@@ -348,43 +348,67 @@ OnVScroll(PMAP infoPtr,
           INT Value,\r
           INT Pos)\r
 {\r
+    INT iYDiff, iOldYStart = infoPtr->iYStart;\r
+\r
     switch (Value)\r
     {\r
         case SB_LINEUP:\r
-            infoPtr->iPage -=  1;\r
+            infoPtr->iYStart -=  1;\r
             break;\r
 \r
         case SB_LINEDOWN:\r
-            infoPtr->iPage +=  1;\r
+            infoPtr->iYStart +=  1;\r
             break;\r
 \r
         case SB_PAGEUP:\r
-            infoPtr->iPage -= 16;\r
+            infoPtr->iYStart -= YCELLS;\r
             break;\r
 \r
         case SB_PAGEDOWN:\r
-            infoPtr->iPage += 16;\r
+            infoPtr->iYStart += YCELLS;\r
             break;\r
 \r
-        case SB_THUMBPOSITION:\r
-            infoPtr->iPage = Pos;\r
+        case SB_THUMBTRACK:\r
+            infoPtr->iYStart = Pos;\r
             break;\r
 \r
        default:\r
             break;\r
        }\r
 \r
-    infoPtr->iPage = max(0,\r
-                         min(infoPtr->iPage, 255));\r
+    infoPtr->iYStart = max(0,\r
+                         min(infoPtr->iYStart, 255*16));\r
 \r
-    SetScrollPos(infoPtr->hMapWnd,\r
-                 SB_VERT,\r
-                 infoPtr->iPage,\r
-                 TRUE);\r
+    iYDiff = iOldYStart - infoPtr->iYStart;\r
+    if (iYDiff)\r
+    {\r
+        SetScrollPos(infoPtr->hMapWnd,\r
+                     SB_VERT,\r
+                     infoPtr->iYStart,\r
+                     TRUE);\r
 \r
-    InvalidateRect(infoPtr->hMapWnd,\r
-                   NULL,\r
-                   TRUE);\r
+        if (abs(iYDiff) < YCELLS)\r
+        {\r
+            RECT rect;\r
+            GetClientRect(infoPtr->hMapWnd, &rect);\r
+            rect.top += 2;\r
+            rect.bottom -= 2;\r
+            ScrollWindowEx(infoPtr->hMapWnd,\r
+                           0,\r
+                           iYDiff * infoPtr->CellSize.cy,\r
+                           &rect,\r
+                           &rect,\r
+                           NULL,\r
+                           NULL,\r
+                           SW_INVALIDATE);\r
+        }\r
+        else\r
+        {\r
+            InvalidateRect(infoPtr->hMapWnd,\r
+                           NULL,\r
+                           TRUE);\r
+        }\r
+    }\r
 }\r
 \r
 \r
index 2f9713c..040886c 100644 (file)
@@ -36,7 +36,7 @@ typedef struct _MAP
     PCELL pActiveCell;\r
     HFONT hFont;\r
     LOGFONTW CurrentFont;\r
-    INT iPage;\r
+    INT iYStart;\r
 } MAP, *PMAP;\r
 \r
 typedef struct {\r