Visual studio 在Visual C+中设置大小图标+;

Visual studio 在Visual C+中设置大小图标+;,visual-studio,visual-c++,mfc,Visual Studio,Visual C++,Mfc,我正在将一个旧的(Visual Studio 6.0)应用程序移植到Visual Studio 2012,以便添加一些增强功能。资源视图中的应用程序图标显然有两个版本的图标,一个32x32 4位位图和一个16x16 4位位图 在主AppDlg.cpp中,有2个对SetIcon()的调用,如下所示(默认情况下由MFC应用程序向导创建): 但是,显示在应用程序对话框窗口左上角的图标是较大的图标,缩小为16x16,而不是较小的图标。系统托盘中显示的图标也会出现这种情况 在Windows资源管理器(详细

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

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

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

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

如何使其在对话框和系统托盘的左上角选择较小的16x16图标?

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

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


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

嗯,如果这确实是您的代码,那么无论大小,您都使用相同的图标。根据您的描述,它看起来像是一个大图标,所以您将一个大图标设置为小图标,这自然会导致缩放。不,它有一个小图标和一个大图标。正如我所说,小图标实际上是在windows资源管理器详细信息/列表视图中列出可执行文件时使用的,因此在某些情况下,它是存在的,并且可以拾取它。单个
HICON
中不能同时包含小图标和大图标。不是一个就是另一个。图标目录有大图标和小图标(Explorer使用图标目录),但图标是特定大小的。图标资源实际上是图标目录。调用
LoadIcon
时,将搜索图标目录并拍摄一张图像。该单个图像作为
HICON
返回。这很混乱。LoadImage函数允许您指定所需的大小。谢谢您的回复。我注释掉了
SetIcon(mu hIcon,TRUE)
但它不起作用,然而当我注释掉
SetIcon(mu hIcon,FALSE)
它起作用了。关于托盘图标,我没有使用
CSystemTray
(早在撰写本文之前,我就已经编写了此代码:)。正如您所说,我要调用
::Shell\u NotifyIcon()
,它需要一个
notifyiconda
,它有一个名为
hIcon
的成员。我只是将其设置为
GetIcon(TRUE)
。我尝试将其更改为
GetIcon(FALSE)
,但是程序没有设置图标就消失了(可能是因为我在另一个问题上禁用了
SetIcon(m_hIcon,FALSE)
)。为了从应用程序的主图标加载小图标,这行代码做了如下操作:
hIcon hTrayIcon=(hIcon)LoadImage(AfxGetInstanceHandle()、MAKEINTRESOURCE(IDR_大型机)、IMAGE_图标、16、16、LR_共享)
hTrayIcon
可用于系统托盘。
SetIcon(m_hIcon, TRUE);         // Set big icon
SetIcon(m_hIcon, FALSE);        // Set small icon