在 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++ 中设置小图标和大图标的主要内容,如果未能解决你的问题,请参考以下文章
visual c++ 在 presubclass 按钮中绘制一个高质量的图标