Zhiyi Zhang : comctl32/taskdialog: Add support for main icon.
Alexandre Julliard
julliard at winehq.org
Thu Jun 14 16:53:23 CDT 2018
Module: wine
Branch: master
Commit: 0e9346e978944607563cc00283b50016eb3f08d1
URL: https://source.winehq.org/git/wine.git/?a=commit;h=0e9346e978944607563cc00283b50016eb3f08d1
Author: Zhiyi Zhang <zzhang at codeweavers.com>
Date: Thu Jun 14 16:01:25 2018 +0800
comctl32/taskdialog: Add support for main icon.
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 | 55 ++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 53 insertions(+), 2 deletions(-)
diff --git a/dlls/comctl32/taskdialog.c b/dlls/comctl32/taskdialog.c
index b6baffb..14c6ccb 100644
--- a/dlls/comctl32/taskdialog.c
+++ b/dlls/comctl32/taskdialog.c
@@ -54,6 +54,7 @@ struct taskdialog_info
HFONT font;
HFONT main_instruction_font;
/* Control handles */
+ HWND main_icon;
HWND main_instruction;
HWND content;
HWND *buttons;
@@ -246,6 +247,38 @@ static void taskdialog_get_label_size(struct taskdialog_info *dialog_info, HWND
ReleaseDC(hwnd, hdc);
}
+static void taskdialog_set_icon(struct taskdialog_info *dialog_info, INT element, HICON icon)
+{
+ DWORD flags = dialog_info->taskconfig->dwFlags;
+ HICON hicon;
+
+ if (!icon) return;
+
+ if ((flags & TDF_USE_HICON_MAIN) && element == TDIE_ICON_MAIN)
+ hicon = icon;
+ else
+ {
+ hicon = LoadImageW(dialog_info->taskconfig->hInstance, (LPCWSTR)icon, IMAGE_ICON, 0, 0, LR_SHARED | LR_DEFAULTSIZE);
+ }
+
+ if (!hicon) return;
+
+ if (element == TDIE_ICON_MAIN)
+ {
+ SendMessageW(dialog_info->hwnd, WM_SETICON, (WPARAM)ICON_BIG, (LPARAM)hicon);
+ SendMessageW(dialog_info->main_icon, STM_SETICON, (WPARAM)hicon, 0);
+ }
+}
+
+static void taskdialog_add_main_icon(struct taskdialog_info *dialog_info)
+{
+ if (!dialog_info->taskconfig->u.hMainIcon) return;
+
+ dialog_info->main_icon =
+ CreateWindowW(WC_STATICW, NULL, WS_CHILD | WS_VISIBLE | SS_ICON, 0, 0, 0, 0, dialog_info->hwnd, NULL, 0, NULL);
+ taskdialog_set_icon(dialog_info, TDIE_ICON_MAIN, dialog_info->taskconfig->u.hMainIcon);
+}
+
static HWND taskdialog_create_label(struct taskdialog_info *dialog_info, const WCHAR *text, HFONT font)
{
WCHAR *textW;
@@ -359,6 +392,7 @@ static void taskdialog_layout(struct taskdialog_info *dialog_info)
RECT ref_rect;
LONG screen_width, dialog_width, dialog_height = 0;
LONG h_spacing, v_spacing;
+ LONG main_icon_right, main_icon_bottom;
struct button_layout_info *button_layout_infos;
LONG button_min_width, button_height;
LONG *line_widths, line_count, align;
@@ -374,11 +408,27 @@ static void taskdialog_layout(struct taskdialog_info *dialog_info)
h_spacing = dialog_info->m.h_spacing;
v_spacing = dialog_info->m.v_spacing;
+ /* Main icon */
+ main_icon_right = 0;
+ main_icon_bottom = 0;
+ if (dialog_info->main_icon)
+ {
+ x = h_spacing;
+ y = dialog_height + v_spacing;
+ size.cx = GetSystemMetrics(SM_CXICON);
+ size.cy = GetSystemMetrics(SM_CYICON);
+ SetWindowPos(dialog_info->main_icon, 0, x, y, size.cx, size.cy, SWP_NOZORDER);
+ main_icon_right = x + size.cx;
+ main_icon_bottom = y + size.cy;
+ }
+
/* Main instruction */
- taskdialog_label_layout(dialog_info, dialog_info->main_instruction, 0, dialog_width, &dialog_height);
+ taskdialog_label_layout(dialog_info, dialog_info->main_instruction, main_icon_right, dialog_width, &dialog_height);
/* Content */
- taskdialog_label_layout(dialog_info, dialog_info->content, 0, dialog_width, &dialog_height);
+ taskdialog_label_layout(dialog_info, dialog_info->content, main_icon_right, dialog_width, &dialog_height);
+
+ dialog_height = max(dialog_height, main_icon_bottom);
/* Common and custom buttons */
button_layout_infos = Alloc(dialog_info->button_count * sizeof(*button_layout_infos));
@@ -509,6 +559,7 @@ static void taskdialog_init(struct taskdialog_info *dialog_info, HWND hwnd)
dialog_info->last_timer_tick = GetTickCount();
}
+ taskdialog_add_main_icon(dialog_info);
taskdialog_add_main_instruction(dialog_info);
taskdialog_add_content(dialog_info);
taskdialog_add_buttons(dialog_info);
More information about the wine-cvs
mailing list