Zhiyi Zhang : uxtheme: Support pressed state for themed scroll bars.

Alexandre Julliard julliard at winehq.org
Tue Jul 20 15:11:04 CDT 2021


Module: wine
Branch: master
Commit: 8c38f02d230fe6101bd8cbbaa9e170e514cbdf07
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=8c38f02d230fe6101bd8cbbaa9e170e514cbdf07

Author: Zhiyi Zhang <zzhang at codeweavers.com>
Date:   Tue Jul 20 21:04:40 2021 +0800

uxtheme: Support pressed state for themed scroll bars.

Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/uxtheme/scrollbar.c | 67 ++++++++++++++++++++++++++++++++++++++----------
 1 file changed, 53 insertions(+), 14 deletions(-)

diff --git a/dlls/uxtheme/scrollbar.c b/dlls/uxtheme/scrollbar.c
index 40fdbf4b89a..386f0446049 100644
--- a/dlls/uxtheme/scrollbar.c
+++ b/dlls/uxtheme/scrollbar.c
@@ -75,12 +75,29 @@ void WINAPI UXTHEME_ScrollBarDraw(HWND hwnd, HDC dc, INT bar, enum SCROLL_HITTES
             lowertrackstate = SCRBS_NORMAL;
             thumbstate = SCRBS_NORMAL;
 
-            if (hit_test == SCROLL_TOP_RECT)
-                uppertrackstate = SCRBS_HOT;
-            else if (hit_test == SCROLL_BOTTOM_RECT)
-                lowertrackstate = SCRBS_HOT;
-            else if (hit_test == SCROLL_THUMB)
-                thumbstate = SCRBS_HOT;
+            if (vertical == tracking_info->vertical && hit_test == tracking_info->hit_test
+                && GetCapture() == hwnd)
+            {
+                if (hit_test == SCROLL_TOP_RECT)
+                    uppertrackstate = SCRBS_PRESSED;
+                else if (hit_test == SCROLL_BOTTOM_RECT)
+                    lowertrackstate = SCRBS_PRESSED;
+                else if (hit_test == SCROLL_THUMB)
+                    thumbstate = SCRBS_PRESSED;
+            }
+            else
+            {
+                if (hit_test == SCROLL_TOP_RECT)
+                    uppertrackstate = SCRBS_HOT;
+                else if (hit_test == SCROLL_BOTTOM_RECT)
+                    lowertrackstate = SCRBS_HOT;
+                else if (hit_test == SCROLL_THUMB)
+                    thumbstate = SCRBS_HOT;
+            }
+
+            /* Thumb is also shown as pressed when tracking */
+            if (tracking_info->win == hwnd && tracking_info->bar == bar)
+                thumbstate = SCRBS_PRESSED;
         }
 
         if (bar == SB_CTL)
@@ -96,10 +113,21 @@ void WINAPI UXTHEME_ScrollBarDraw(HWND hwnd, HDC dc, INT bar, enum SCROLL_HITTES
                 uparrowstate = ABS_UPNORMAL;
                 downarrowstate = ABS_DOWNNORMAL;
 
-                if (hit_test == SCROLL_TOP_ARROW)
-                    uparrowstate = ABS_UPHOT;
-                else if (hit_test == SCROLL_BOTTOM_ARROW)
-                    downarrowstate = ABS_DOWNHOT;
+                if (vertical == tracking_info->vertical && hit_test == tracking_info->hit_test
+                    && GetCapture() == hwnd)
+                {
+                    if (hit_test == SCROLL_TOP_ARROW)
+                        uparrowstate = ABS_UPPRESSED;
+                    else if (hit_test == SCROLL_BOTTOM_ARROW)
+                        downarrowstate = ABS_DOWNPRESSED;
+                }
+                else
+                {
+                    if (hit_test == SCROLL_TOP_ARROW)
+                        uparrowstate = ABS_UPHOT;
+                    else if (hit_test == SCROLL_BOTTOM_ARROW)
+                        downarrowstate = ABS_DOWNHOT;
+                }
             }
 
             partrect = *rect;
@@ -150,10 +178,21 @@ void WINAPI UXTHEME_ScrollBarDraw(HWND hwnd, HDC dc, INT bar, enum SCROLL_HITTES
                 leftarrowstate = ABS_LEFTNORMAL;
                 rightarrowstate = ABS_RIGHTNORMAL;
 
-                if (hit_test == SCROLL_TOP_ARROW)
-                    leftarrowstate = ABS_LEFTHOT;
-                else if (hit_test == SCROLL_BOTTOM_ARROW)
-                    rightarrowstate = ABS_RIGHTHOT;
+                if (vertical == tracking_info->vertical && hit_test == tracking_info->hit_test
+                    && GetCapture() == hwnd)
+                {
+                    if (hit_test == SCROLL_TOP_ARROW)
+                        leftarrowstate = ABS_LEFTPRESSED;
+                    else if (hit_test == SCROLL_BOTTOM_ARROW)
+                        rightarrowstate = ABS_RIGHTPRESSED;
+                }
+                else
+                {
+                    if (hit_test == SCROLL_TOP_ARROW)
+                        leftarrowstate = ABS_LEFTHOT;
+                    else if (hit_test == SCROLL_BOTTOM_ARROW)
+                        rightarrowstate = ABS_RIGHTHOT;
+                }
             }
 
             partrect = *rect;




More information about the wine-cvs mailing list