我必须对使用 MFC 开发的现有应用程序进行更改。此应用程序使用带有 Document\View 架构的 SDI 模板。我需要在应用程序执行时显示的窗口上放置一个图标。目前它没有任何图标可显示(某些 MFC 应用程序默认显示 MFC 徽标)。有人可以帮帮我吗?我用谷歌搜索了很多,但没有成功。另外我想知道为什么我们对 resource.h 文件中的所有资源都使用 IDR_MAINFRAME(同名)。我观察到它的值固定在 128。这有什么具体原因吗?如果你以前遇到过,请推荐一些关于 MFC 的好链接或书籍?
3 回答
This is a known problem on Visual studio late versions. I tried everything I could, it still doesn't work. Finally I found a solution from somewhere else. You have to force the application to use the icon by code:
BOOL CMyApp::InitInstance()
{
...........
CWinAppEx::InitInstance();
...........
HICON hIcon = LoadIcon(IDR_MAINFRAME);
HICON hPrev = pMainFrame->SetIcon(hIcon,FALSE);
if (hPrev != NULL && hPrev != hIcon)
DestroyIcon(hPrev);
return TRUE;
}
我建议您创建一个新的 MFC 应用程序来查看默认设置。您应该看到在您的 .RC 文件中有一行看起来像这样:
IDR_MAINFRAME ICON "res\\app.ico"
如果它不存在,您可以添加它。查看 MFC 文件 winfrm.cpp 你可以看到 MFC 试图在CFrameWnd::GetIconWndClass()
HICON hIcon = ::LoadIconW(hInst, ATL_MAKEINTRESOURCEW(nIDResource));
由于资源由它们的类型和 id 标识,因此您可以对不同类型的多个资源使用相同的 id。这在 MFC 框架代码需要加载工具栏、菜单和图标等时非常有用,而开发人员无需为每个项目指定不同的 id。
我在 MFC 上看到的最好的 MFC 书籍是 Mike Blaszczak 的“Professional MFC”。它没有一些新的“MFC 功能包”添加,但它很好地涵盖了旧的东西。我还建议您下载像Agent Ransack这样的源搜索工具来搜索 MFC 源代码。
- 是的,该值必须是 128。它是为 MFC SDI/MDI 保留的。
- IDR_表示“用于多种资源类型(主要用于菜单、加速器和功能区)。”。通常,这些资源是特定于 MFC 的。
- 该图标默认可见。确保你不调用
SetIcon
你的主窗口!
更多关于图标
As of Vista and later, icons may contain PNG images. I believe these icons might cause issues in XP or earlier. Try creating the icon using Visual Studio and see if the icon comes back. I'm assuming you are running Visual Studio 2008 or later. It might also be a good idea to update the Windows SDK in order to get this new PNG feature (rc.exe was updated to handle these new icons).