Я пытаюсь добавить поддержку, чтобы легко изменить значок окна после его создания.Для этого я использую
SetClassLongPtr (hwnd, GCLP_HICONSM, (LONG)(HICON)LoadImage (NULL, path, IMAGE_ICON, 16, 16, LR_LOADFROMFILE));
Однако это меняет значок на панели задач, но не в верхнем левом углу.Большой значок нормально работает в меню alt-tab.Есть идеи?
Редактировать
Хотя это предложение сработало, у меня возникли некоторые проблемы при его использовании на 64-разрядном ПК с Windows 7 (другим был 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 Теперь, если сначала я сделаю маленький значок, а потом большой, значок панели задач будет неправильным, ноэто не дает ошибок.Если после маленького значка я создаю окно сообщения, все нормально.Как мне начать объяснять, как работает одно окно сообщения?