【发布时间】:2010-10-16 22:55:05
【问题描述】:
(我使用的是 Visual Studio 2008,但我记得旧版本也有类似的问题。)
我尝试了几种不同的方法(其中许多在this other question 中提到),但我仍然遇到一些奇怪的问题:
当包含一个图标作为资源时,它会立即显示为可执行文件的图标,但要让图标显示在任务栏上,我必须重新启动计算机。在那之前,它会继续显示为之前的图标。清理解决方案,重新启动 VS,没有任何效果。不是一个真正的大问题,因为它不会影响已发布的 exe,但很高兴知道它将旧图标缓存在哪里以及如何摆脱它。
无论我做什么,alt-tabbing 时显示的图标都是默认的应用程序图标(方形和白色和通用)。这包括在可执行文件中嵌入图标,以及将
ICON_BIG设置为WM_SETICON。
至于第二个问题,我的代码是这样的:
hIcon = (HICON)(
LoadImage( NULL, szFilename, IMAGE_ICON, 32, 32, LR_LOADFROMFILE ) );
if( hIcon )
SendMessage( hWnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon );
但是,发送WM_SETICON,GetLastError() 后返回6,“句柄无效。”。 hWnd 是一个有效的窗口句柄,hIcon 似乎是一个有效的图标句柄。我已经尝试寻找WM_SETICON 可能导致该错误的原因,并且至少要弄清楚它认为哪个句柄无效,但还没有运气。我在调用SendMessage() 之前立即清除了错误代码,因此必须在消息处理过程中设置它。
我尝试了另一种方法,从 exe 本身加载图标,其中资源的 ID 是 101(它是第一个也是唯一包含的资源):
hIcon = (HICON)(
LoadImage( GetModuleHandle( NULL ), MAKEINTRESOURCE( 101 ),
IMAGE_ICON, 48, 48, 0 ) );
if( hIcon )
SendMessage( hWnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon );
...但同样的事情也会发生;调用SendMessage() 后,GetLastError() 给出相同的错误状态。
我尝试了不同的尺寸(例如 48x48,所有这些都存在于图标文件中),但没有不同的效果。我知道它肯定会查找和加载图像,因为如果我指定不存在的大小或无效的资源 ID 或错误的文件名(取决于我加载它的方式),它会在 SendMessage() 之前很久就失败了。
奇怪的是,如果我指定ICON_SMALL 而不是ICON_BIG,则调用成功且没有错误状态,但是从the docs 开始,我需要使用ICON_BIG 来设置alt-tabbing 时使用的图标。此外,如果我使用 ICON_BIG 但加载 16x16 图标,我不会收到错误状态,但没有任何变化。
关于可能导致WM_SETICON 失败的任何想法?我发布的任何代码有什么严重错误(除了格式/样式/转换问题,因为它被简化为基础知识)?
【问题讨论】:
标签: c++ visual-studio-2008 icons