Верхний левый значок не изменяется после создания окна - PullRequest
1 голос
/ 27 января 2012

Я пытаюсь добавить поддержку, чтобы легко изменить значок окна после его создания.Для этого я использую

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 Теперь, если сначала я сделаю маленький значок, а потом большой, значок панели задач будет неправильным, ноэто не дает ошибок.Если после маленького значка я создаю окно сообщения, все нормально.Как мне начать объяснять, как работает одно окно сообщения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...