Piotr Caban : comctl32: Compute border size from client and window rectangles.

Alexandre Julliard julliard at winehq.org
Fri Jul 17 16:30:47 CDT 2020


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Fri Jul 17 16:17:24 2020 +0200

comctl32: Compute border size from client and window rectangles.

Fixes toolbar size when WS_EX_DLGMODALFRAME is used.

Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/comctl32/tests/toolbar.c | 26 ++++++++++++++++++++++----
 dlls/comctl32/toolbar.c       | 22 ++++++++++++----------
 2 files changed, 34 insertions(+), 14 deletions(-)

diff --git a/dlls/comctl32/tests/toolbar.c b/dlls/comctl32/tests/toolbar.c
index 3688394d71..f973d9cfff 100644
--- a/dlls/comctl32/tests/toolbar.c
+++ b/dlls/comctl32/tests/toolbar.c
@@ -434,18 +434,23 @@ static void basic_test(void)
     DestroyWindow(hToolbar);
 }
 
-static void rebuild_toolbar(HWND *hToolbar)
+static void rebuild_toolbar_ex(HWND *hToolbar, DWORD exstyle)
 {
     if (*hToolbar)
         DestroyWindow(*hToolbar);
-    *hToolbar = CreateWindowExA(0, TOOLBARCLASSNAMEA, NULL, WS_CHILD | WS_VISIBLE, 0, 0, 0, 0,
-        hMainWnd, (HMENU)5, GetModuleHandleA(NULL), NULL);
+    *hToolbar = CreateWindowExA(exstyle, TOOLBARCLASSNAMEA, NULL, WS_CHILD | WS_VISIBLE,
+        0, 0, 0, 0, hMainWnd, (HMENU)5, GetModuleHandleA(NULL), NULL);
     ok(*hToolbar != NULL, "Toolbar creation problem\n");
     ok(SendMessageA(*hToolbar, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0) == 0, "TB_BUTTONSTRUCTSIZE failed\n");
     ok(SendMessageA(*hToolbar, TB_AUTOSIZE, 0, 0) == 0, "TB_AUTOSIZE failed\n");
     ok(SendMessageA(*hToolbar, WM_SETFONT, (WPARAM)GetStockObject(SYSTEM_FONT), 0)==1, "WM_SETFONT\n");
 }
 
+static void rebuild_toolbar(HWND *hToolbar)
+{
+    rebuild_toolbar_ex(hToolbar, 0);
+}
+
 static void rebuild_toolbar_with_buttons(HWND *hToolbar)
 {
     TBBUTTON buttons[5];
@@ -1022,7 +1027,7 @@ static void tbsize_addbutton(tbsize_result_t *tbsr, int left, int top, int right
 
 static tbsize_result_t *tbsize_results;
 
-#define tbsize_results_num 28
+#define tbsize_results_num 29
 
 static void init_tbsize_results(void) {
     int fontheight = system_font_height();
@@ -1277,6 +1282,9 @@ static void init_tbsize_results(void) {
 
     tbsize_results[27] = init_tbsize_result(1, 0, 0, 672, 42, 67, 40);
     tbsize_addbutton(&tbsize_results[27],   0,   2,  40,  24);
+
+    tbsize_results[28] = init_tbsize_result(1, 0, 0, 672, 42, 67, 40);
+    tbsize_addbutton(&tbsize_results[28],   0,   2,  23,  24);
 }
 
 static void free_tbsize_results(void) {
@@ -1360,6 +1368,7 @@ static void test_sizes(void)
     int style;
     int i;
     int fontheight = system_font_height();
+    RECT rect;
 
     init_tbsize_results();
 
@@ -1631,6 +1640,15 @@ static void test_sizes(void)
     SendMessageA(hToolbar, TB_AUTOSIZE, 0, 0 );
     check_sizes();
 
+    /* Toolbar with borders around client area */
+    rebuild_toolbar_ex(&hToolbar, WS_EX_DLGMODALFRAME);
+    SetWindowLongA(hToolbar, GWL_STYLE, CCS_NODIVIDER | GetWindowLongA(hToolbar, GWL_STYLE));
+    SendMessageA(hToolbar, TB_ADDBUTTONSA, 1, (LPARAM)buttons1);
+    check_sizes();
+    GetClientRect(hToolbar, &rect);
+    ok(rect.top == 0, "rect.top = %d\n", rect.top);
+    ok(rect.bottom == 26, "rect.bottom = %d\n", rect.bottom);
+
     free_tbsize_results();
     DestroyWindow(hToolbar);
 }
diff --git a/dlls/comctl32/toolbar.c b/dlls/comctl32/toolbar.c
index b869cc4d7b..b2711a3eb8 100644
--- a/dlls/comctl32/toolbar.c
+++ b/dlls/comctl32/toolbar.c
@@ -3069,7 +3069,7 @@ TOOLBAR_AutoSize (TOOLBAR_INFO *infoPtr)
 
     if (!(infoPtr->dwStyle & CCS_NORESIZE))
     {
-        RECT window_rect, parent_rect;
+        RECT window_rect, client_rect, parent_rect, border;
         UINT uPosFlags = SWP_NOZORDER | SWP_NOACTIVATE;
         HWND parent;
         INT  x, y, cx, cy;
@@ -3079,6 +3079,13 @@ TOOLBAR_AutoSize (TOOLBAR_INFO *infoPtr)
         if (!parent || !infoPtr->bDoRedraw)
             return 0;
 
+        GetWindowRect(infoPtr->hwndSelf, &window_rect);
+        GetClientRect(infoPtr->hwndSelf, &client_rect);
+        border = window_rect;
+        MapWindowPoints(0, infoPtr->hwndSelf, (POINT *)&border, 2);
+        border.right -= border.left + client_rect.right - client_rect.left;
+        border.bottom -= border.top + client_rect.bottom - client_rect.top;
+
         GetClientRect(parent, &parent_rect);
 
         x = parent_rect.left;
@@ -3089,15 +3096,11 @@ TOOLBAR_AutoSize (TOOLBAR_INFO *infoPtr)
 
         if ((infoPtr->dwStyle & CCS_BOTTOM) == CCS_NOMOVEY)
         {
-            GetWindowRect(infoPtr->hwndSelf, &window_rect);
             MapWindowPoints( 0, parent, (POINT *)&window_rect, 2 );
             y = window_rect.top;
         }
         if ((infoPtr->dwStyle & CCS_BOTTOM) == CCS_BOTTOM)
-        {
-            GetWindowRect(infoPtr->hwndSelf, &window_rect);
             y = parent_rect.bottom - ( window_rect.bottom - window_rect.top);
-        }
 
         if (infoPtr->dwStyle & CCS_NOPARENTALIGN)
             uPosFlags |= SWP_NOMOVE;
@@ -3105,11 +3108,10 @@ TOOLBAR_AutoSize (TOOLBAR_INFO *infoPtr)
         if (!(infoPtr->dwStyle & CCS_NODIVIDER))
             cy += GetSystemMetrics(SM_CYEDGE);
 
-        if (infoPtr->dwStyle & WS_BORDER)
-        {
-            cx += 2 * GetSystemMetrics(SM_CXBORDER);
-            cy += 2 * GetSystemMetrics(SM_CYBORDER);
-        }
+        x += border.left;
+        y += border.top;
+        cx += border.right;
+        cy += border.bottom;
 
         SetWindowPos(infoPtr->hwndSelf, NULL, x, y, cx, cy, uPosFlags);
     }




More information about the wine-cvs mailing list