在模态对话框中显示一个图标
Show an Icon inside Modal Dialog Box
我是 MFC 的新手,已经研究了几天这个问题,但找不到任何有效的解决方案。
问题:
我有一个对话框 class(模态对话框),其样式在 .rc 文件(下面的代码)中定义,并获取图标的资源 ID(int m_icon
与IDR_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 仍然是空的。 LoadImage
和 GetDlgItem(ABOUT_ICON)
returns 都不是 nullptr
(已经检查过了)。
您无需执行 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
看看 BEGIN
行之后的 ICON
行。
你有它作为 ABOUT_ICON, ABOUT_ICON, 11, 10, 21, 20
,但第二个参数告诉框架控件的 ID 是什么。因为你想要一个 Static
控件,所以你使用 IDC_STATIC
的 ID 告诉框架没有 ID,而是它应该创建一个通用的 Static
控件。
如果这不能解决问题,我会调查 ABOUT_ICON
是否正确连接,它实际上 是 指向一个图标。
另外,你为什么在 RC 文件中工作? MFC 为您提供了一个很棒的 GUI 编辑器。例如,您可以使用 UI:
修改它
我是 MFC 的新手,已经研究了几天这个问题,但找不到任何有效的解决方案。
问题:
我有一个对话框 class(模态对话框),其样式在 .rc 文件(下面的代码)中定义,并获取图标的资源 ID(int m_icon
与IDR_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 仍然是空的。 LoadImage
和 GetDlgItem(ABOUT_ICON)
returns 都不是 nullptr
(已经检查过了)。
您无需执行 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
看看 BEGIN
行之后的 ICON
行。
你有它作为 ABOUT_ICON, ABOUT_ICON, 11, 10, 21, 20
,但第二个参数告诉框架控件的 ID 是什么。因为你想要一个 Static
控件,所以你使用 IDC_STATIC
的 ID 告诉框架没有 ID,而是它应该创建一个通用的 Static
控件。
如果这不能解决问题,我会调查 ABOUT_ICON
是否正确连接,它实际上 是 指向一个图标。
另外,你为什么在 RC 文件中工作? MFC 为您提供了一个很棒的 GUI 编辑器。例如,您可以使用 UI:
修改它