在模态对话框中显示图标

问题描述

我是MFC的新手,已经在这个问题上工作了几天,并且找不到任何可行的解决方案。

问题:

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

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

enter image description here

OtherClass.rc

IDR_MAINFRAME           ICON                    "res\\MyIcon.ico"

Dialog.rc

ABOUTBOX DIALOGEX 0,285,77
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "<<Aboutbox>>"
FONT 8,"MS Shell Dlg",0x0
BEGIN
    ICON            ABOUT_ICON,ABOUT_ICON,11,10,21,20
    LTEXT           "",IDC_STATIC,40,163,8,SS_NOPREFIX
    LTEXT           "<<Package Name 1.00>>",ABOUT_NAME,20,SS_NOPREFIX
    LTEXT           "<<FileName>>",ABOUT_FILENAME,30,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,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(已经检查过)。

解决方法

您无需执行SetIconSendMessage之类的操作即可显示图标。出问题了,您的RC文件有误。它应该看起来像这样:

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

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

ICON行之后查看BEGIN行。

您将其设为ABOUT_ICON,ABOUT_ICON,20,但是第二个参数告诉框架控件的ID是什么。由于您需要Static控件,因此可以使用IDC_STATIC的ID来告诉框架没有ID,但是应该创建通用的Static控件。

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

此外,为什么还要使用RC文件? MFC为您提供了出色的GUI编辑器。例如,您可以使用UI对其进行修改:

MFC

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...