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

Show an Icon inside Modal Dialog Box

我是 MFC 的新手,已经研究了几天这个问题,但找不到任何有效的解决方案。

问题:

我有一个对话框 class(模态对话框),其样式在 .rc 文件(下面的代码)中定义,并获取图标的资源 ID(int m_iconIDR_MAINFRAME) 来自另一个 class (OtherClass.rc)。 对话框中的所有文本信息都是动态设置的(下面的代码),但同样不适用于图标。下图中标记的图标是我要设置的。

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

OtherClass.rc

IDR_MAINFRAME           ICON                    "res\MyIcon.ico"

Dialog.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

Dialog.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);

还有很多类似的东西,但图标 space 仍然是空的。 LoadImageGetDlgItem(ABOUT_ICON) returns 都不是 nullptr(已经检查过了)。

您无需执行 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:

修改它