[PATCH 8/9] comctl32/taskdialog: Add support for footer icon.
Zhiyi Zhang
zzhang at codeweavers.com
Mon Jul 16 02:39:59 CDT 2018
Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
dlls/comctl32/taskdialog.c | 37 ++++++++++++++++++++++++++++++++++---
1 file changed, 34 insertions(+), 3 deletions(-)
diff --git a/dlls/comctl32/taskdialog.c b/dlls/comctl32/taskdialog.c
index c38e973fb6..538c92cddd 100644
--- a/dlls/comctl32/taskdialog.c
+++ b/dlls/comctl32/taskdialog.c
@@ -67,6 +67,7 @@ struct taskdialog_info
HWND expanded_info;
HWND expando_button;
HWND verification_box;
+ HWND footer_icon;
HWND *buttons;
INT button_count;
HWND default_button;
@@ -446,17 +447,24 @@ static ULONG_PTR taskdialog_get_standard_icon(LPCWSTR icon)
static void taskdialog_set_icon(struct taskdialog_info *dialog_info, INT element, HICON icon)
{
DWORD flags = dialog_info->taskconfig->dwFlags;
+ INT cx = 0, cy = 0;
HICON hicon;
if (!icon) return;
- if ((flags & TDF_USE_HICON_MAIN) && element == TDIE_ICON_MAIN)
+ if (((flags & TDF_USE_HICON_MAIN) && element == TDIE_ICON_MAIN)
+ || ((flags & TDF_USE_HICON_FOOTER) && element == TDIE_ICON_FOOTER))
hicon = icon;
else
{
- hicon = LoadImageW(dialog_info->taskconfig->hInstance, (LPCWSTR)icon, IMAGE_ICON, 0, 0, LR_SHARED | LR_DEFAULTSIZE);
+ if (element == TDIE_ICON_FOOTER)
+ {
+ cx = GetSystemMetrics(SM_CXSMICON);
+ cy = GetSystemMetrics(SM_CYSMICON);
+ }
+ hicon = LoadImageW(dialog_info->taskconfig->hInstance, (LPCWSTR)icon, IMAGE_ICON, cx, cy, LR_SHARED | LR_DEFAULTSIZE);
if (!hicon)
- hicon = LoadImageW(NULL, (LPCWSTR)taskdialog_get_standard_icon((LPCWSTR)icon), IMAGE_ICON, 0, 0,
+ hicon = LoadImageW(NULL, (LPCWSTR)taskdialog_get_standard_icon((LPCWSTR)icon), IMAGE_ICON, cx, cy,
LR_SHARED | LR_DEFAULTSIZE);
}
@@ -467,6 +475,8 @@ static void taskdialog_set_icon(struct taskdialog_info *dialog_info, INT element
SendMessageW(dialog_info->hwnd, WM_SETICON, (WPARAM)ICON_BIG, (LPARAM)hicon);
SendMessageW(dialog_info->main_icon, STM_SETICON, (WPARAM)hicon, 0);
}
+ else if (element == TDIE_ICON_FOOTER)
+ SendMessageW(dialog_info->footer_icon, STM_SETICON, (WPARAM)hicon, 0);
}
static void taskdialog_check_default_radio_buttons(struct taskdialog_info *dialog_info)
@@ -718,6 +728,15 @@ static void taskdialog_add_buttons(struct taskdialog_info *dialog_info)
dialog_info->button_count = count;
}
+static void taskdialog_add_footer_icon(struct taskdialog_info *dialog_info)
+{
+ if (!dialog_info->taskconfig->u2.hFooterIcon) return;
+
+ dialog_info->footer_icon =
+ CreateWindowW(WC_STATICW, NULL, WS_CHILD | WS_VISIBLE | SS_ICON, 0, 0, 0, 0, dialog_info->hwnd, NULL, 0, 0);
+ taskdialog_set_icon(dialog_info, TDIE_ICON_FOOTER, dialog_info->taskconfig->u2.hFooterIcon);
+}
+
static void taskdialog_label_layout(struct taskdialog_info *dialog_info, HWND hwnd, INT start_x, LONG dialog_width,
LONG *dialog_height, BOOL syslink)
{
@@ -932,6 +951,17 @@ static void taskdialog_layout(struct taskdialog_info *dialog_info)
Free(button_layout_infos);
Free(line_widths);
+ /* Footer icon */
+ if (dialog_info->footer_icon)
+ {
+ x = h_spacing;
+ y = dialog_height + v_spacing;
+ size.cx = GetSystemMetrics(SM_CXSMICON);
+ size.cy = GetSystemMetrics(SM_CYSMICON);
+ SetWindowPos(dialog_info->footer_icon, 0, x, y, size.cx, size.cy, SWP_NOZORDER);
+ dialog_height = y + size.cy;
+ }
+
/* Expanded information */
if ((taskconfig->dwFlags & TDF_EXPAND_FOOTER_AREA) && dialog_info->expanded)
taskdialog_label_layout(dialog_info, dialog_info->expanded_info, 0, dialog_width, &dialog_height, syslink);
@@ -1027,6 +1057,7 @@ static void taskdialog_init(struct taskdialog_info *dialog_info, HWND hwnd)
taskdialog_add_expando_button(dialog_info);
taskdialog_add_verification_box(dialog_info);
taskdialog_add_buttons(dialog_info);
+ taskdialog_add_footer_icon(dialog_info);
/* Set default button */
if (!dialog_info->default_button && dialog_info->command_links)
--
2.18.0
More information about the wine-devel
mailing list