一旦制作窗口,左上角的图标就不会改变

时间:2012-01-27 15:25:17

标签: c++ winapi icons

我正在尝试添加支持,以便在制作完成后轻松更改窗口的图标。为此,我使用

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小图标之后创建了一个消息框,那么一切正常。我怎么开始解释一个消息框让它起作用?

0 个答案:

没有答案