如何在使用MFC开发的SDI App的标题栏中添加图标?

时间:2012-08-22 15:16:00

标签: visual-c++ mfc sdi

我必须对使用MFC开发的现有应用程序进行更改。此应用程序使用带有Document \ View架构的SDI模板。我需要在执行应用程序时显示的窗口上放置一个图标。目前它没有任何图标显示(默认情况下某些MFC应用程序显示MFC徽标)。有人可以帮帮我吗?我用谷歌搜索了很多但没有取得任何成功。 另外我想知道为什么我们为resource.h文件中的所有资源使用IDR_MAINFRAME(相同名称)。我发现它的价值固定在128.这有什么特别的原因吗?如果你之前遇到过,请在MFC上建议一些好的链接或书籍吗?

3 个答案:

答案 0 :(得分:3)

这是Visual Studio后期版本的已知问题。我尽我所能,它仍然无法正常工作。最后我找到了其他地方的解决方案。您必须强制应用程序按代码使用图标:

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;
}

答案 1 :(得分:0)

我建议您创建一个新的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的“专业MFC”。它没有一些新的“MFC功能包”添加,但它很好地涵盖了旧的东西。我还建议您下载像Agent Ransack这样的源搜索工具,以便搜索MFC源代码。

答案 2 :(得分:0)

  1. 是,值必须为128.它保留给MFC SDI / MDI。
  2. IDR_表示“适用于多种资源类型(主要用于菜单,加速器和色带)。”通常,这些资源是特定于MFC的。
  3. 默认情况下,该图标可见。确保您为主窗口致电SetIcon
  4. 有关图标的更多信息

    从Vista及更高版本开始,图标可能包含PNG图像。我相信这些图标可能会导致XP或更早版本出现问题。尝试使用Visual Studio创建图标,然后查看图标是否返回。我假设您正在运行Visual Studio 2008或更高版本。更新Windows SDK以获得这个新的PNG功能(rc.exe已更新以处理这些新图标)也是一个好主意。