Dou*_*dek 6 c++ icons visual-studio-2008
(我正在使用Visual Studio 2008,但我记得也有旧版本的类似问题.)
我尝试了几种不同的方法(其中许多方法在其他问题中提到过),但我仍然遇到一些奇怪的问题:
将图标作为资源包含时,它会立即显示为可执行文件的图标,但是为了显示在任务栏上的图标,我必须重新启动计算机.在那之前,它继续显示为以前的图标.清理解决方案,重新启动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 );
Run Code Online (Sandbox Code Playgroud)
但是,发送后WM_SETICON,GetLastError()返回6,"句柄无效.". hWnd是一个有效的窗口句柄,hIcon似乎是一个有效的图标句柄.我已经尝试寻找WM_SETICON可能导致该错误的原因,并且至少要找出它认为无效的WHICH句柄,但还没有运气.我在调用之前立即清除了错误代码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 );
Run Code Online (Sandbox Code Playgroud)
......但是同样的事情发生了; 在调用之后SendMessage(),GetLastError()给出相同的错误状态.
我尝试了不同的尺寸(例如48x48,所有这些尺寸都出现在图标文件中),但没有不同的效果.我知道这肯定是找到并加载图像,因为如果我指定一个不存在的大小或无效的资源ID或错误的文件名(取决于我如何加载它),它很久就会失败SendMessage().
奇怪的是,如果我指定ICON_SMALL而不是ICON_BIG,则调用成功且没有错误状态,但是从文档中,我需要使用ICON_BIG设置alt-tabbing时使用的图标.此外,如果我使用ICON_BIG但加载16x16图标,我没有错误状态,但没有任何变化.
关于什么可能导致WM_SETICON失败的任何想法?我发布的任何代码都有严重错误(除了格式化/样式/转换问题,因为它简化为基础知识)?
我重新审视了这个问题,看看是否可以结束我的问题。我无法仅通过将应用程序的图标嵌入到可执行文件中来使其显示在 alt-tab 列表中;它将显示在任务栏中,作为资源管理器中的文件图标,以及其他地方都很好。
我想我应该尝试一些更简单的方法来手动设置图标,然后改为使用LoadIcon(),如下面的代码所示:
HICON hIcon = LoadIcon( GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1) );
if( hIcon )
{
SendMessage( GetHandle(), WM_SETICON, ICON_BIG, (LPARAM)hIcon );
DestroyIcon( hIcon );
}
// ... Same for ICON_SMALL
Run Code Online (Sandbox Code Playgroud)
这似乎已经成功了。我真的不知道为什么,但到目前为止,这是唯一有影响的更改。这确实不是我应该花更多时间的问题,所以我就继续吧。