Nikolay Sivov : comctl32/trackbar: Update thumb immediately on TBM_SETPOS.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Feb 3 07:40:01 CST 2016


Module: wine
Branch: stable
Commit: 5b23a4396411d29371f7b84968407a01ab92c5ec
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=5b23a4396411d29371f7b84968407a01ab92c5ec

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Sat Jan  9 23:45:20 2016 +0300

comctl32/trackbar: Update thumb immediately on TBM_SETPOS.

Signed-off-by: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit a65ddbf153b8865e0565bf210e637bf2b0053196)
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>

---

 dlls/comctl32/tests/trackbar.c | 49 ++++++++++++++++++++++++++++++++++++++++++
 dlls/comctl32/trackbar.c       |  7 ++++--
 2 files changed, 54 insertions(+), 2 deletions(-)

diff --git a/dlls/comctl32/tests/trackbar.c b/dlls/comctl32/tests/trackbar.c
index e496572..7c04d15 100644
--- a/dlls/comctl32/tests/trackbar.c
+++ b/dlls/comctl32/tests/trackbar.c
@@ -32,6 +32,16 @@
 static const DWORD defaultstyle = WS_VISIBLE | TBS_TOOLTIPS | TBS_ENABLESELRANGE | TBS_FIXEDLENGTH | TBS_AUTOTICKS;
 static HWND hWndParent;
 
+static LRESULT WINAPI trackbar_no_wmpaint_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+    WNDPROC oldproc = (WNDPROC)GetWindowLongPtrA(hwnd, GWLP_USERDATA);
+
+    if (message == WM_PAINT)
+        return 0;
+
+    return CallWindowProcA(oldproc, hwnd, message, wParam, lParam);
+}
+
 static struct msg_sequence *sequences[NUM_MSG_SEQUENCE];
 
 static const struct message empty_seq[] = {
@@ -465,6 +475,15 @@ static HWND create_trackbar(DWORD style, HWND parent){
     return hWndTrack;
 }
 
+static HWND create_trackbar2(DWORD style, HWND parent)
+{
+    RECT rect;
+    GetClientRect(parent, &rect);
+    return CreateWindowA(TRACKBAR_CLASSA, "Trackbar Control", style,
+                              rect.right, rect.bottom, 100, 50,
+                              parent, NULL, GetModuleHandleA(NULL), NULL);
+}
+
 /* test functions for setters, getters, and sequences */
 
 static void test_trackbar_buddy(void)
@@ -595,6 +614,8 @@ static void test_page_size(void)
 static void test_position(void)
 {
     HWND hWndTrackbar;
+    RECT rect, rect2;
+    WNDPROC oldproc;
     int r;
 
     hWndTrackbar = create_trackbar(defaultstyle, hWndParent);
@@ -626,6 +647,34 @@ static void test_position(void)
     ok_sequence(sequences, PARENT_SEQ_INDEX, parent_position_test_seq, "parent position test sequence", TRUE);
 
     DestroyWindow(hWndTrackbar);
+
+    hWndTrackbar = create_trackbar2(defaultstyle, hWndParent);
+    ok(hWndTrackbar != NULL, "Expected non NULL value\n");
+
+    /* subclassing procedure blocks WM_PAINT */
+    oldproc = (WNDPROC)SetWindowLongPtrA(hWndTrackbar, GWLP_WNDPROC, (LONG_PTR)trackbar_no_wmpaint_proc);
+    SetWindowLongPtrA(hWndTrackbar, GWLP_USERDATA, (LONG_PTR)oldproc);
+
+    memset(&rect, 0, sizeof(rect));
+    memset(&rect2, 0, sizeof(rect2));
+
+    SendMessageA(hWndTrackbar, TBM_GETTHUMBRECT, 0, (LPARAM)&rect);
+
+    /* without repaint */
+    SendMessageA(hWndTrackbar, TBM_SETPOS, FALSE, 25);
+    r = SendMessageA(hWndTrackbar, TBM_GETPOS, 0, 0);
+    ok(r == 25, "got %d\n", r);
+    SendMessageA(hWndTrackbar, TBM_GETTHUMBRECT, 0, (LPARAM)&rect2);
+    ok(rect.left == rect2.left, "got %d\n", rect.left);
+
+    /* with repaint */
+    SendMessageA(hWndTrackbar, TBM_SETPOS, TRUE, 30);
+    r = SendMessageA(hWndTrackbar, TBM_GETPOS, 0, 0);
+    ok(r == 30, "got %d\n", r);
+    SendMessageA(hWndTrackbar, TBM_GETTHUMBRECT, 0, (LPARAM)&rect2);
+    ok(rect.left != rect2.left, "got %d\n", rect.left);
+
+    DestroyWindow(hWndTrackbar);
 }
 
 static void test_range(void)
diff --git a/dlls/comctl32/trackbar.c b/dlls/comctl32/trackbar.c
index 6d092a3..c0f58db 100644
--- a/dlls/comctl32/trackbar.c
+++ b/dlls/comctl32/trackbar.c
@@ -1229,9 +1229,12 @@ TRACKBAR_SetPos (TRACKBAR_INFO *infoPtr, BOOL fPosition, LONG lPosition)
 
     if (infoPtr->lPos > infoPtr->lRangeMax)
 	infoPtr->lPos = infoPtr->lRangeMax;
-    infoPtr->flags |= TB_THUMBPOSCHANGED;
 
-    if (fPosition && oldPos != lPosition) TRACKBAR_InvalidateThumbMove(infoPtr, oldPos, lPosition);
+    if (fPosition && oldPos != lPosition)
+    {
+        TRACKBAR_UpdateThumb(infoPtr);
+        TRACKBAR_InvalidateThumbMove(infoPtr, oldPos, lPosition);
+    }
 
     return 0;
 }




More information about the wine-cvs mailing list