我正在尝试添加支持,以便在制作完成后轻松更改窗口的图标。为此,我使用
SetClassLongPtr (hwnd, GCLP_HICONSM, (LONG)(HICON)LoadImage (NULL, path, IMAGE_ICON, 16, 16, LR_LOADFROMFILE));
但是,这会更改任务栏上的图标,但不会更改左上角的图标。大图标在alt-tab菜单上正常工作。有任何想法吗?
修改
虽然这个建议有效,但我在64位Windows 7 PC上使用同样的东西时遇到了一些问题(另一个是32位Windows XP)。我重新制作图标文件无济于事。在为大图标调用LoadImage()
之后,我收到了无效句柄的错误,但不是小。首先加载小图标使两者都有效。加载大型图标会先将小图标和大图标设置为大图标,但会显示错误。
这是功能。它是包装器的一部分,所以我希望解释是足够好的。忽略它属于WinClass。一旦一切正常,我就将它改为正常窗口的类。
//hwin = HWND, con = const
bool WinClass::setIcon (con hwin hwnd, con string & icon, con string & iconLarge)
{
//load large icon
HICON large = (HICON)LoadImage (null, iconLarge.c_str(), IMAGE_ICON, 32, 32, LR_LOADFROMFILE);
//if GetLastError() is not 0, give details and return false
//this one contains the invalid handle
errorRet();
//message box with confirmation and value of HICON
//itos = integer to string
msg (((string)"LoadImage() Succeeded! Icon handle has value ") += itos (*((int *)large)));
//tell window to change its icon (or die)
SendMessage (hwnd, WM_SETICON, (WPARAM)ICON_BIG, (LPARAM)large);
errorRet();
msg ("SendMessage() Succeeded!");
_hIcon = (HICON)SendMessage (hwnd, WM_GETICON, (WPARAM)ICON_BIG, 0);
errorRet();
msg ("SendMessage() Succeeded!");
//repeat for small icon
HICON sm = (HICON)LoadImage (null, icon.c_str(), IMAGE_ICON, 16, 16, LR_LOADFROMFILE);
errorRet();
msg ("LoadImage() Succeeded!");
SendMessage (hwnd, WM_SETICON, (WPARAM)ICON_SMALL, (LPARAM)sm);
errorRet();
msg ("SendMessage() Succeeded!");
_hIconSm = (HICON)SendMessage (hwnd, WM_GETICON, (WPARAM)ICON_SMALL, 0);
errorRet();
msg ("SendMessage() Succeeded!");
return true;
}
注意:如果我注释掉错误检查以便执行整个功能,我最终会左上图标右侧,任务栏图标错误,alt-tab图标右侧。
编辑2
现在,如果我首先执行小图标而后执行大图标,则任务栏图标是错误的,但它不会出错。如果我在SendMessage() set
小图标之后创建了一个消息框,那么一切正常。我怎么开始解释一个消息框让它起作用?