[PATCH 1/3] comctl32/taskdialog: Use BCM_GETIDEALSIZE to calculate button size.

Zhiyi Zhang zzhang at codeweavers.com
Mon Aug 26 06:57:33 CDT 2019


Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47621
Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
 dlls/comctl32/taskdialog.c | 58 ++++++++------------------------------
 1 file changed, 12 insertions(+), 46 deletions(-)

diff --git a/dlls/comctl32/taskdialog.c b/dlls/comctl32/taskdialog.c
index 4064fae839..3d98c644e8 100644
--- a/dlls/comctl32/taskdialog.c
+++ b/dlls/comctl32/taskdialog.c
@@ -418,47 +418,11 @@ static void taskdialog_get_label_size(struct taskdialog_info *dialog_info, HWND
     Free(text);
 }
 
-static void taskdialog_get_radio_button_size(struct taskdialog_info *dialog_info, HWND hwnd, LONG max_width, SIZE *size)
+static void taskdialog_get_button_size(HWND hwnd, LONG max_width, SIZE *size)
 {
-    DWORD style = DT_EXPANDTABS | DT_CALCRECT | DT_WORDBREAK;
-    HFONT hfont, old_hfont;
-    HDC hdc;
-    RECT rect = {0};
-    INT text_length;
-    WCHAR *text;
-    INT text_offset, radio_box_width, radio_box_height;
-
-    hdc = GetDC(hwnd);
-    hfont = (HFONT)SendMessageW(hwnd, WM_GETFONT, 0, 0);
-    old_hfont = SelectObject(hdc, hfont);
-
-    radio_box_width = 12 * GetDpiForWindow(hwnd) / 96 + 1;
-    radio_box_height = 12 * GetDpiForWindow(hwnd) / 96 + 1;
-    GetCharWidthW(hdc, '0', '0', &text_offset);
-    text_offset /= 2;
-
-    if (dialog_info->taskconfig->dwFlags & TDF_RTL_LAYOUT)
-        style |= DT_RIGHT | DT_RTLREADING;
-    else
-        style |= DT_LEFT;
-
-    rect.right = max_width - radio_box_width - text_offset;
-    text_length = GetWindowTextLengthW(hwnd);
-    text = Alloc((text_length + 1) * sizeof(WCHAR));
-    if (!text)
-    {
-        size->cx = 0;
-        size->cy = 0;
-        return;
-    }
-    GetWindowTextW(hwnd, text, text_length + 1);
-    size->cy = DrawTextW(hdc, text, text_length, &rect, style);
-    size->cx = min(max_width - radio_box_width - text_offset, rect.right - rect.left);
-    size->cx += radio_box_width + text_offset;
-    size->cy = max(size->cy, radio_box_height);
-    if (old_hfont) SelectObject(hdc, old_hfont);
-    Free(text);
-    ReleaseDC(hwnd, hdc);
+    size->cx = max_width;
+    size->cy = 0;
+    SendMessageW(hwnd, BCM_GETIDEALSIZE, 0, (LPARAM)size);
 }
 
 static void taskdialog_get_expando_size(struct taskdialog_info *dialog_info, HWND hwnd, SIZE *size)
@@ -951,7 +915,7 @@ static void taskdialog_layout(struct taskdialog_info *dialog_info)
     {
         x = main_icon_right + h_spacing;
         y = dialog_height + v_spacing;
-        taskdialog_get_radio_button_size(dialog_info, dialog_info->radio_buttons[i], dialog_width - x - h_spacing, &size);
+        taskdialog_get_button_size(dialog_info->radio_buttons[i], dialog_width - x - h_spacing, &size);
         size.cx = dialog_width - x - h_spacing;
         SetWindowPos(dialog_info->radio_buttons[i], 0, x, y, size.cx, size.cy, SWP_NOZORDER);
         dialog_height = y + size.cy;
@@ -961,8 +925,11 @@ static void taskdialog_layout(struct taskdialog_info *dialog_info)
     for (i = 0; i < dialog_info->command_link_count; i++)
     {
         x = main_icon_right + h_spacing;
-        y = dialog_height + v_spacing;
-        taskdialog_get_label_size(dialog_info, dialog_info->command_links[i], dialog_width - x - h_spacing, &size, FALSE);
+        y = dialog_height;
+        /* Only add spacing for the first command links. There is no vertical spacing between command links */
+        if (!i)
+            y += v_spacing;
+        taskdialog_get_button_size(dialog_info->command_links[i], dialog_width - x - h_spacing, &size);
         size.cx = dialog_width - x - h_spacing;
         /* Add spacing */
         size.cy += 4;
@@ -992,7 +959,7 @@ static void taskdialog_layout(struct taskdialog_info *dialog_info)
         y = expando_bottom + v_spacing;
         size.cx = DIALOG_MIN_WIDTH / 2;
         taskdialog_du_to_px(dialog_info, &size.cx, NULL);
-        taskdialog_get_radio_button_size(dialog_info, dialog_info->verification_box, size.cx, &size);
+        taskdialog_get_button_size(dialog_info->verification_box, size.cx, &size);
         SetWindowPos(dialog_info->verification_box, 0, x, y, size.cx, size.cy, SWP_NOZORDER);
         expando_right = max(expando_right, x + size.cx);
         expando_bottom = y + size.cy;
@@ -1007,8 +974,7 @@ static void taskdialog_layout(struct taskdialog_info *dialog_info)
     taskdialog_du_to_px(dialog_info, &button_min_width, &button_height);
     for (i = 0; i < dialog_info->button_count; i++)
     {
-        taskdialog_get_label_size(dialog_info, dialog_info->buttons[i], dialog_width - expando_right - h_spacing * 2,
-                                  &size, FALSE);
+        taskdialog_get_button_size(dialog_info->buttons[i], dialog_width - expando_right - h_spacing * 2, &size);
         button_layout_infos[i].width = max(size.cx, button_min_width);
     }
 
-- 
2.23.0.rc1





More information about the wine-devel mailing list