在 Visual C++ 中设置小图标和大图标

Posted

技术标签:

【中文标题】在 Visual C++ 中设置小图标和大图标【英文标题】:Setting small and large icon in Visual C++ 【发布时间】:2012-12-10 00:42:57 【问题描述】:

我正在将旧的 (Visual Studio 6.0) 应用程序移植到 Visual Studio 2012 以添加一些增强功能。资源视图中的应用程序图标显然有 2 个版本的图标,一个 32x32 4bit 位图和一个 16x16 4bit 位图。

在主 AppDlg.cpp 中有 2 次对 SetIcon() 的调用如下(由 MFC 应用程序向导默认创建):

SetIcon(m_hIcon, TRUE);         // Set big icon
SetIcon(m_hIcon, FALSE);        // Set small icon 

但是,显示在应用程序对话框窗口左上角的图标是较大的,缩小到 16x16 而不是小图标。系统托盘中显示的图标也会发生这种情况。

在 Windows 资源管理器(详细视图/列表视图)中查看可执行文件时,它似乎使用了正确的小文件。所以在某些情况下它会选择小的。

如何让它为对话框和系统托盘的左上角选择较小的 16x16 图标?

【问题讨论】:

嗯,如果这真的是您的代码,那么您对大图标和小图标都使用相同的图标。从你的描述看,m_hIcon好像是个大图标,所以你把一个大图标设置为你的小图标,自然会导致缩放。 不,它有一个小图标和一个大图标。正如我所说,小图标实际上是在 Windows 资源管理器详细/列表视图中列出可执行文件时使用的,因此它存在并在某些情况下将其拾取。 单个HICON 不能同时包含小图标和大图标。它是一个或另一个。图标目录有大图标和小图标(Explorer 使用图标目录),但图标是特定大小的。 图标资源其实就是一个图标目录。当您调用LoadIcon 时,将搜索图标目录并拍摄单个图像。该单个图像以HICON 的形式返回。令人困惑。 LoadImage 函数可以让你指定你想要的尺寸。 【参考方案1】:

已知的 Microsoft 错误。请参阅this 讨论。 (如果您不想阅读,只需注释掉 SetIcon(m_hIcon, FALSE) 行就可以了)。请注意,SetIcon 仅设置对话框标题栏上的图标(小图标)以及当您使用 Alt-tab(大图标)时

您在 Windows 资源管理器中看到的图标是主要的应用程序图标(您的 rc 文件中 ID 最低的图标)。它与主对话框的 SetIcon() 方法无关

系统托盘中的图标完全不同。通常,您会使用 Shell_NotifyIcon API 来设置图标,但我敢打赌,您的项目将有一个设置图标的帮助程序类 CSystemTray Chris Maunder 是许多程序员使用的流行类。只需在您的程序中搜索 Shell_NotifyIcon 即可准确了解系统托盘图标所使用的资源

【讨论】:

感谢您的回复。我注释掉了SetIcon(m_hIcon, TRUE),但它不起作用,但是当我注释掉SetIcon(m_hIcon, FALSE) 时它起作用了。关于托盘图标,我没有使用CSystemTray(我在这篇文章之前很久以前就做过这个代码:))。正如你所说,我打电话给::Shell_NotifyIcon(),它需要一个NOTIFYICONDATA,其中有一个名为hIcon的成员。我只是将其设置为GetIcon(TRUE)。我尝试将其更改为GetIcon(FALSE),但程序在没有设置图标的情况下消失了(可能是因为我为其他问题禁用了SetIcon(m_hIcon, FALSE))。 为了从应用程序的主图标加载小图标,这一行可以做到这一点:HICON hTrayIcon = (HICON)LoadImage( AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_ICON, 16, 16, LR_SHARED ); 然后hTrayIcon 可以用于系统托盘。

以上是关于在 Visual C++ 中设置小图标和大图标的主要内容,如果未能解决你的问题,请参考以下文章

在棒棒糖版本上方的通知中设置小图标

在 nana C++ GUI 应用程序中设置窗口图标

visual c++ 在 presubclass 按钮中绘制一个高质量的图标

如何在 Visual C++ 中显示我自己选择的消息框图标或我自己的 PNG

小图块的图标和文字居中

如何在静态库 (Visual Studio) 中嵌入图标 (.ico)