[v2 PATCH] comctl32/trackbar: Scale thumb size with resolution.

Nikolay Sivov nsivov at codeweavers.com
Tue Jul 17 06:13:03 CDT 2018


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/comctl32/trackbar.c | 25 ++++++++++++++-----------
 1 file changed, 14 insertions(+), 11 deletions(-)

diff --git a/dlls/comctl32/trackbar.c b/dlls/comctl32/trackbar.c
index d774823d60..7cb73ca682 100644
--- a/dlls/comctl32/trackbar.c
+++ b/dlls/comctl32/trackbar.c
@@ -1468,25 +1468,28 @@ TRACKBAR_SetUnicodeFormat (TRACKBAR_INFO *infoPtr, BOOL fUnicode)
     return bTemp;
 }
 
+static int get_scaled_metric(const TRACKBAR_INFO *infoPtr, int value)
+{
+    return MulDiv(value, GetDpiForWindow(infoPtr->hwndSelf), 96);
+}
 
 static LRESULT
 TRACKBAR_InitializeThumb (TRACKBAR_INFO *infoPtr)
 {
+    int client_size;
     RECT rect;
-    int clientWidth, clientMetric;
 
-    /* initial thumb length */
-    clientMetric = (infoPtr->dwStyle & TBS_ENABLESELRANGE) ? 23 : 21;
+    infoPtr->uThumbLen = get_scaled_metric(infoPtr, infoPtr->dwStyle & TBS_ENABLESELRANGE ? 23 : 21);
+
     GetClientRect(infoPtr->hwndSelf,&rect);
-    if (infoPtr->dwStyle & TBS_VERT) {
-	clientWidth = rect.right - rect.left;
-    } else {
-	clientWidth = rect.bottom - rect.top;
-    }
-    if (clientWidth >= clientMetric)
-        infoPtr->uThumbLen = clientMetric;
+    if (infoPtr->dwStyle & TBS_VERT)
+        client_size = rect.right - rect.left;
     else
-        infoPtr->uThumbLen = clientWidth > 9 ? clientWidth - 6 : 4;
+        client_size = rect.bottom - rect.top;
+
+    if (client_size < infoPtr->uThumbLen)
+        infoPtr->uThumbLen = client_size > get_scaled_metric(infoPtr, 9) ?
+            client_size - get_scaled_metric(infoPtr, 5) : get_scaled_metric(infoPtr, 4);
 
     TRACKBAR_CalcChannel (infoPtr);
     TRACKBAR_UpdateThumb (infoPtr);
-- 
2.18.0




More information about the wine-devel mailing list