【问题标题】:Setting the main icon of a CTaskDialog as a Question?将 CTaskDialog 的主图标设置为问题?
【发布时间】:2020-07-28 09:08:08
【问题描述】:

我正在处理这个CTaskDialog

代码如下:

CTaskDialog dlg(_T("How would you like to download the data?"), 
                _T("Download Schedule Information"),
                _T("Meeting Schedule Assistant"), TDCBF_OK_BUTTON | TDCBF_CANCEL_BUTTON);
dlg.SetMainIcon(TD_INFORMATION_ICON);
dlg.SetFooterIcon(TD_INFORMATION_ICON);
dlg.SetFooterText(_T("All assignments for the selected weeks will be reset."));
dlg.AddRadioButton(44444, _T("Download data for all weeks"));
dlg.AddRadioButton(44445, _T("Download data for selected week"));
dlg.AddRadioButton(44446, _T("Download data for selected week and all additional weeks"));
// Set Width in dialog units (40% screen width)
int iPixelWidth = (::GetSystemMetrics(SM_CXSCREEN) / 100) * 40;
int iDialogUnitsWidth = MulDiv(iPixelWidth, 4, LOWORD(GetDialogBaseUnits()));
dlg.SetDialogWidth(iDialogUnitsWidth);

if(dlg.DoModal() == IDOK)
{
    auto iSelection = dlg.GetSelectedRadioButtonID();
}

是否可以将主图标设置为问题?我只能在源代码中看到这些定义:

#define TD_WARNING_ICON         MAKEINTRESOURCEW(-1)
#define TD_ERROR_ICON           MAKEINTRESOURCEW(-2)
#define TD_INFORMATION_ICON     MAKEINTRESOURCEW(-3)
#define TD_SHIELD_ICON          MAKEINTRESOURCEW(-4)

【问题讨论】:

    标签: visual-c++ mfc taskdialog


    【解决方案1】:

    SetMainIcon member function 是您正在寻找的。像大多数处理 Win32 资源的函数一样,它有两个重载:

    void SetMainIcon(
       HICON hMainIcon
    );
    
    void SetMainIcon(
       LPCWSTR lpszMainIcon
    );
    

    第一个获取图标资源的句柄 (HICON),而第二个获取一个字符串,用于标识可以从中加载图标资源的资源。

    如果您想将任务对话框设置为显示您的应用程序的图标,那么您只需传入适当的HICON。您还可以使用从应用程序资源加载的自定义图标。

    我不完全确定,但我认为您要问的是如何使用问号图标。首先请注意,自 Windows 95 以来,已不推荐在消息框中使用此类图标,Microsoft 强烈反对使用它们。建议您使用它们来表示联机帮助的入口点。引用官方 Win32 风格指南的 Standard Icons 部分:

    Question mark icons

    • 问号图标仅用于帮助入口点。有关详细信息,请参阅Help entry point 指南。
    • 请勿使用问号图标提问。同样,请仅将问号图标用于帮助入口点。无论如何,无需使用问号图标提问,将主要指令作为问题呈现就足够了。 不要经常将问号图标替换为警告图标。 仅当问题具有重大后果时,才将问号图标替换为警告图标。否则,不要使用图标。

    所以,这就是没有定义标准问号图标的原因。这些 TD_*_ICON 定义直接来自任务对话框的 Win32 标头(它们与您在 TASKDIALOGCONFIG structure 中使用的标头相同),而不是 MFC 包装类的一部分。

    如果您绝对必须使用此图标,解决方法如下:

    const HICON hiconQuestion = AfxGetApp()->LoadStandardIcon(IDI_QUESTION);
    dlg.SetMainIcon(hiconQuestion);
    

    (请注意,相同的HICON 可以传递给CTaskDialogSetFooterIcon 成员函数。)

    【讨论】:

    • 谢谢。我假设一个问题图标,因为它是一个问题!嗬!让我看看我是否可以使用我的应用程序图标。
    • 如果它以任何方式具有破坏性,那么您应该使用警告图标。否则,也许考虑根本不使用图标?这就是标准 Windows 应用程序所做的事情(例如记事本、画图等)。
    • 很好的建议!并感谢您提供详尽的回答和有用的指导。
    猜你喜欢
    • 2023-02-17
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多