Zhiyi Zhang : comctl32/taskdialog: Create main instruction without templates.

Alexandre Julliard julliard at winehq.org
Tue Jun 12 17:36:03 CDT 2018


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

Author: Zhiyi Zhang <zzhang at codeweavers.com>
Date:   Tue Jun 12 12:10:43 2018 +0800

comctl32/taskdialog: Create main instruction without templates.

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

---

 dlls/comctl32/taskdialog.c | 90 +++++++++++++++++++++++++++++++---------------
 1 file changed, 62 insertions(+), 28 deletions(-)

diff --git a/dlls/comctl32/taskdialog.c b/dlls/comctl32/taskdialog.c
index bd9e68b..46a4ce1 100644
--- a/dlls/comctl32/taskdialog.c
+++ b/dlls/comctl32/taskdialog.c
@@ -50,7 +50,6 @@ static const UINT DIALOG_BUTTON_WIDTH = 50;
 static const UINT DIALOG_BUTTON_HEIGHT = 14;
 static const UINT DIALOG_TIMER_MS = 200;
 
-static const UINT ID_MAIN_INSTRUCTION = 0xf000;
 static const UINT ID_CONTENT          = 0xf001;
 
 static const UINT ID_TIMER = 1;
@@ -84,6 +83,8 @@ struct taskdialog_info
     DWORD last_timer_tick;
     HFONT font;
     HFONT main_instruction_font;
+    /* Control handles */
+    HWND main_instruction;
     /* Dialog metrics */
     struct
     {
@@ -114,24 +115,6 @@ static void template_write_data(char **ptr, const void *src, unsigned int size)
     *ptr += size;
 }
 
-static void taskdialog_set_main_instruction_font(struct taskdialog_info *dialog_info)
-{
-    NONCLIENTMETRICSW ncm;
-    HWND hwnd;
-
-    hwnd = GetDlgItem(dialog_info->hwnd, ID_MAIN_INSTRUCTION);
-    if(!hwnd) return;
-
-    ncm.cbSize = sizeof(ncm);
-    SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, ncm.cbSize, &ncm, 0);
-    /* 1.25 times the height */
-    ncm.lfMessageFont.lfHeight = ncm.lfMessageFont.lfHeight * 5 / 4;
-    ncm.lfMessageFont.lfWeight = FW_BOLD;
-    dialog_info->main_instruction_font = CreateFontIndirectW(&ncm.lfMessageFont);
-
-    SendMessageW(hwnd, WM_SETFONT, (WPARAM)dialog_info->main_instruction_font, TRUE);
-}
-
 static unsigned int taskdialog_add_control(struct taskdialog_template_desc *desc, WORD id, const WCHAR *class,
         HINSTANCE hInstance, const WCHAR *text, DWORD style)
 {
@@ -184,11 +167,6 @@ static unsigned int taskdialog_add_static_label(struct taskdialog_template_desc
     return size;
 }
 
-static unsigned int taskdialog_add_main_instruction(struct taskdialog_template_desc *desc)
-{
-    return taskdialog_add_static_label(desc, ID_MAIN_INSTRUCTION, desc->taskconfig->pszMainInstruction);
-}
-
 static unsigned int taskdialog_add_content(struct taskdialog_template_desc *desc)
 {
     return taskdialog_add_static_label(desc, ID_CONTENT, desc->taskconfig->pszContent);
@@ -351,7 +329,6 @@ static DLGTEMPLATE *create_taskdialog_template(const TASKDIALOGCONFIG *taskconfi
     desc.control_count = 0;
     desc.default_button = NULL;
 
-    size += taskdialog_add_main_instruction(&desc);
     size += taskdialog_add_content(&desc);
     size += taskdialog_add_buttons(&desc);
 
@@ -404,6 +381,30 @@ static void taskdialog_on_button_click(struct taskdialog_info *dialog_info, WORD
         EndDialog(dialog_info->hwnd, command_id);
 }
 
+static WCHAR *taskdialog_gettext(struct taskdialog_info *dialog_info, BOOL user_resource, const WCHAR *text)
+{
+    const WCHAR *textW = NULL;
+    INT length;
+    WCHAR *ret;
+
+    if (IS_INTRESOURCE(text))
+    {
+        if (!(length = LoadStringW(user_resource ? dialog_info->taskconfig->hInstance : COMCTL32_hModule,
+                                   (UINT_PTR)text, (WCHAR *)&textW, 0)))
+            return NULL;
+    }
+    else
+    {
+        textW = text;
+        length = strlenW(textW);
+    }
+
+    ret = Alloc((length + 1) * sizeof(WCHAR));
+    if (ret) memcpy(ret, textW, length * sizeof(WCHAR));
+
+    return ret;
+}
+
 static void taskdialog_get_label_size(struct taskdialog_info *dialog_info, HWND hwnd, LONG max_width, SIZE *size)
 {
     DWORD style = DT_EXPANDTABS | DT_CALCRECT | DT_WORDBREAK;
@@ -429,6 +430,39 @@ static void taskdialog_get_label_size(struct taskdialog_info *dialog_info, HWND
     ReleaseDC(hwnd, hdc);
 }
 
+static HWND taskdialog_create_label(struct taskdialog_info *dialog_info, const WCHAR *text, HFONT font)
+{
+    WCHAR *textW;
+    HWND hwnd;
+
+    if (!text) return NULL;
+
+    textW = taskdialog_gettext(dialog_info, TRUE, text);
+    hwnd = CreateWindowW(WC_STATICW, textW, WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, dialog_info->hwnd, NULL, 0, NULL);
+    if (textW) Free(textW);
+
+    SendMessageW(hwnd, WM_SETFONT, (WPARAM)font, 0);
+    return hwnd;
+}
+
+static void taskdialog_add_main_instruction(struct taskdialog_info *dialog_info)
+{
+    const TASKDIALOGCONFIG *taskconfig = dialog_info->taskconfig;
+    NONCLIENTMETRICSW ncm;
+
+    if (!taskconfig->pszMainInstruction) return;
+
+    ncm.cbSize = sizeof(ncm);
+    SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, ncm.cbSize, &ncm, 0);
+    /* 1.25 times the height */
+    ncm.lfMessageFont.lfHeight = ncm.lfMessageFont.lfHeight * 5 / 4;
+    ncm.lfMessageFont.lfWeight = FW_BOLD;
+    dialog_info->main_instruction_font = CreateFontIndirectW(&ncm.lfMessageFont);
+
+    dialog_info->main_instruction =
+        taskdialog_create_label(dialog_info, taskconfig->pszMainInstruction, dialog_info->main_instruction_font);
+}
+
 static void taskdialog_label_layout(struct taskdialog_info *dialog_info, HWND hwnd, INT start_x, LONG dialog_width,
                                     LONG *dialog_height)
 {
@@ -471,8 +505,7 @@ static void taskdialog_layout(struct taskdialog_info *dialog_info)
     v_spacing = dialog_info->m.v_spacing;
 
     /* Main instruction */
-    hwnd = GetDlgItem(dialog_info->hwnd, ID_MAIN_INSTRUCTION);
-    taskdialog_label_layout(dialog_info, hwnd, 0, dialog_width, &dialog_height);
+    taskdialog_label_layout(dialog_info, dialog_info->main_instruction, 0, dialog_width, &dialog_height);
 
     /* Content */
     hwnd = GetDlgItem(dialog_info->hwnd, ID_CONTENT);
@@ -624,7 +657,8 @@ static void taskdialog_init(struct taskdialog_info *dialog_info, HWND hwnd)
         dialog_info->last_timer_tick = GetTickCount();
     }
 
-    taskdialog_set_main_instruction_font(dialog_info);
+    taskdialog_add_main_instruction(dialog_info);
+
     taskdialog_layout(dialog_info);
 }
 




More information about the wine-cvs mailing list