C++ 左上角图标不显示';窗户一开,就别换了

C++ 左上角图标不显示';窗户一开,就别换了,c++,winapi,icons,C++,Winapi,Icons,我正在尝试添加支持,以便在创建窗口后轻松更改其图标。要做到这一点,我使用 SetClassLongPtr (hwnd, GCLP_HICONSM, (LONG)(HICON)LoadImage (NULL, path, IMAGE_ICON, 16, 16, LR_LOADFROMFILE)); 但是,这会更改任务栏上的图标,但不会更改左上角。大图标在alt选项卡菜单上正常工作。有什么想法吗 编辑 虽然这个建议有效,但我在64位Windows7电脑(另一台是32位WindowsXP)上使用它时

我正在尝试添加支持,以便在创建窗口后轻松更改其图标。要做到这一点,我使用

SetClassLongPtr (hwnd, GCLP_HICONSM, (LONG)(HICON)LoadImage (NULL, path, IMAGE_ICON, 16, 16, LR_LOADFROMFILE));
但是,这会更改任务栏上的图标,但不会更改左上角。大图标在alt选项卡菜单上正常工作。有什么想法吗

编辑
虽然这个建议有效,但我在64位Windows7电脑(另一台是32位WindowsXP)上使用它时遇到了一些问题。我重新制作了图标文件,但没有效果。调用大图标(而不是小图标)的
LoadImage()
后,我收到一个无效句柄错误。首先加载小图标可以使这两种方法都起作用。加载大图标首先将小图标和大图标设置为大图标,但会产生错误

这里是函数。这是包装的一部分,所以我希望解释得足够好。忽略它属于Winglass。一旦一切正常,我就把它改成普通窗口的类

//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()设置
ing小图标后创建一个消息框,则一切正常。我如何开始解释一个消息框的工作原理?

尝试向窗口发送一条WM_NCPAINT消息。可能不会有什么区别,但值得一试。你应该首先考虑发送WMY SETICON。修改课堂不是这样做的。使用
WM\u SETICON
。好的。当我问这个问题时,我很匆忙,对此表示抱歉。我试过画画,运气不好。我使用了WM_SETICON,在使用一个名为“small”的变量时遇到了一个恼人的问题,但一旦我解决了这个问题,它就起作用了:)我应该使用消息来设置所有的
SetClassLongPtr
事情,还是只设置一些,如果是的话,除了图标之外还有哪些?