在模态对话框中显示一个图标

Posted

技术标签:

【中文标题】在模态对话框中显示一个图标【英文标题】:Show an Icon inside Modal Dialog Box 【发布时间】:2020-09-02 13:36:06 【问题描述】:

我对 MFC 完全陌生,并且已经在这个问题上工作了几天,但找不到任何可行的解决方案。

问题:

我有一个对话框类(模态对话框),其样式在 .rc 文件(代码如下)中定义,并从另一个类(其他类.rc)。 对话框中的所有文本信息都是动态设置的(下面的代码),但同样不适用于图标。下图中标记的图标是我要设置的。

图标资源在另一个 .rc 文件中定义,并且 LoadImage 似乎可以工作,因为我可以在窗口左上角设置小图标。唯一的问题是在此图像中设置大图标。 (完全没有显示,只是一个空白)

OtherClass.rc

IDR_MAINFRAME           ICON                    "res\\MyIcon.ico"

对话框.rc

ABOUTBOX DIALOGEX 0, 0, 285, 77
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "<<Aboutbox>>"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
    ICON            ABOUT_ICON, ABOUT_ICON, 11, 10, 21, 20
    LTEXT           "", IDC_STATIC, 40, 10, 163, 8, SS_NOPREFIX
    LTEXT           "<<Package Name 1.00>>", ABOUT_NAME, 40, 20, 163, 8, SS_NOPREFIX
    LTEXT           "<<FileName>>", ABOUT_FILENAME, 40, 30, 163, 8, SS_NOPREFIX

    DEFPUSHBUTTON   "OK", IDOK, 217, 7, 60, 14, WS_GROUP
END

对话框.cpp

BOOL AboutDlg::OnInitDialog()

    CDialog::OnInitDialog();

    // Window Title
    SetWindowText(L"About " + m_title);

    // Set Icon
    HICON hIcon = (HICON)LoadImage(GetModuleHandleW(NULL), MAKEINTRESOURCE(m_icon), IMAGE_ICON, 96, 96, LR_DEFAULTCOLOR);
    
    SetIcon(hIcon, TRUE);
    SetIcon(hIcon, FALSE);
    
    // Text
    SetDlgItemText(ABOUT_NAME, m_name);
    SetDlgItemText(ABOUT_FILENAME, m_filename);
    
    return TRUE;

我尝试做的是:

1. GetDlgItem(ABOUT_ICON)->SetIcon(hIcon, TRUE);
2. SendMessage(WM_SETICON, ICON_BIG, (LPARAM)hIcon);

还有更多类似的东西,但图标空间仍然是空的。 LoadImageGetDlgItem(ABOUT_ICON) 都不会返回 nullptr(已经检查过了)。

【问题讨论】:

【参考方案1】:

您无需执行任何操作,例如 SetIconSendMessage 即可获得要显示的图标。问题是您的 RC 文件有误。它应该是这样的:

ABOUTBOX DIALOGEX 0, 0, 285, 77
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "<<Aboutbox>>"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
    ICON            ABOUT_ICON, IDC_STATIC, 11, 10, 21, 20
    LTEXT           "", IDC_STATIC, 40, 10, 163, 8, SS_NOPREFIX
    LTEXT           "<<Package Name 1.00>>", ABOUT_NAME, 40, 20, 163, 8, SS_NOPREFIX
    LTEXT           "<<FileName>>", ABOUT_FILENAME, 40, 30, 163, 8, SS_NOPREFIX

    DEFPUSHBUTTON   "OK", IDOK, 217, 7, 60, 14, WS_GROUP
END

看看BEGIN 行之后的ICON 行。

您将其命名为ABOUT_ICON, ABOUT_ICON, 11, 10, 21, 20,但第二个参数告诉框架控件的 ID 是什么。因为你想要一个Static 控件,所以你使用IDC_STATIC 的ID,它告诉框架没有ID,但它应该创建一个通用的Static 控件。

如果这不能解决问题,我会调查ABOUT_ICON 是否正确连接,它实际上是 指向一个图标。

另外,你为什么在 RC 文件中工作? MFC 为您提供了一个很棒的 GUI 编辑器。例如,您可以使用 UI 对其进行修改:

【讨论】:

对话框是在 GUI 编辑器中设计的。我只需要做一些小的调整以允许动态更新图标。您的解决方案完美运行。创建CStatic 成员变量后,我只需要.Create 它并使用上面的LoadIcon 函数调用.SetIcon。谢谢 Visual Studio 的资源编辑器最后一次可用是在 VS 2012 中。此后的每个版本都在恶化,直到今天 it isn't usable at all 不再存在。尝试在具有不同缩放因子的双显示器系统上运行 Visual Studio 最新的图形对话框编辑器,并亲自查看 “出色的 GUI 编辑器” 是否仍然是合适的描述。手动编写资源脚本的能力早已从一项有用的技能提升为一项强制性技能。 @IInspectable -- 有趣...我在单个显示器上使用 96 DPI 屏幕,这就是为什么我仍然认为它很棒,哈哈,不过感谢您的提醒。以后我不会这么热心宣传他们的编辑了

以上是关于在模态对话框中显示一个图标的主要内容,如果未能解决你的问题,请参考以下文章

DataTables - 模态显示 - 图标不显示

渲染 rhandsontable 后,日期选择器显示在模态对话框后面

如何在 Redux 中显示一个执行异步操作的模态对话框?

MFC模态与非模态对话框

jcrop 在模态对话框中显示图像以解决裁剪大小问题

Qt 模态对话框不模态的问题