首页 > 解决方案 > 在模态对话框中显示一个图标

问题描述

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

问题:

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

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

在此处输入图像描述

其他类.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);

还有更多类似的东西,但图标空间仍然是空的。the 和 the都LoadImage没有GetDlgItem(ABOUT_ICON)返回 a nullptr(已经检查过了)。

标签: c++winapimfc

解决方案


你不应该做任何事情,SetIcon或者SendMessage让一个图标来显示。问题是您的 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

看看ICON一行之后的BEGIN行。

您将其设置为ABOUT_ICON, ABOUT_ICON, 11, 10, 21, 20,但第二个参数告诉框架控件的 ID 是什么。由于您想要一个Static控件,因此您使用它的 IDIDC_STATIC告诉框架没有 ID,但它应该创建一个通用Static控件。

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

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

MFC


推荐阅读