(я использую Visual Studio 2008, хотя я помню, что у меня были похожие проблемы и со старыми версиями.)
Я пробовал несколько разных методов (многие из них упомянуты в этот другой вопрос ), но у меня все еще есть некоторые странные проблемы:
При включении значка в качестве ресурса он сразу отображается как значок исполняемого файла, но для того, чтобы значок появился на панели задач, я должен перезагрузить компьютер. До тех пор он продолжает отображаться как любой предыдущий значок. Очистка раствора, перезапуск VS, не дает никакого эффекта. Не очень большая проблема, поскольку она не повлияет на выпущенный exe-файл, но было бы неплохо узнать, где хранится старый значок в кэше и как от него избавиться.
Независимо от того, что я делаю, значок, отображаемый при alt-tabbing, является значком приложения по умолчанию (квадратный, белый и общий). Это включает в себя встраивание значка в исполняемый файл, а также установку ICON_BIG
с WM_SETICON
.
Что касается второго вопроса, мой код выглядит примерно так:
hIcon = (HICON)(
LoadImage( NULL, szFilename, IMAGE_ICON, 32, 32, LR_LOADFROMFILE ) );
if( hIcon )
SendMessage( hWnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon );
Однако после отправки WM_SETICON
, GetLastError()
возвращает 6, «Дескриптор недействителен». hWnd
- действительный дескриптор окна, а hIcon
- действительный дескриптор значка. Я попытался найти причины, по которым WM_SETICON
может вызвать эту ошибку, и, по крайней мере, выяснить, какой дескриптор он считает недействительным, но пока не повезло. Я очистил код ошибки непосредственно перед вызовом SendMessage()
, поэтому он должен быть установлен где-то при обработке сообщения.
Я попробовал альтернативный метод, загружая значок из самого exe-файла, где идентификатор ресурса равен 101
(это первый и единственный включенный ресурс):
hIcon = (HICON)(
LoadImage( GetModuleHandle( NULL ), MAKEINTRESOURCE( 101 ),
IMAGE_ICON, 48, 48, 0 ) );
if( hIcon )
SendMessage( hWnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon );
... но происходит то же самое; после вызова SendMessage()
, GetLastError()
выдает тот же статус ошибки.
Я пробовал разные размеры (например, 48x48, все они присутствуют в файле значков), но без разницы. Я знаю, что он определенно находит и загружает изображения, потому что, если я укажу несуществующий размер или неверный идентификатор ресурса или неправильное имя файла (в зависимости от того, как я его загружаю), произойдет сбой задолго до SendMessage()
.
Странно, если я укажу ICON_SMALL
вместо ICON_BIG
, вызов завершится успешно без состояния ошибки, но из документов мне нужно будет использовать ICON_BIG
, чтобы установить значок, используемый при alt -tabbing. Кроме того, если я использую ICON_BIG
, но загружаю значок 16x16, я не получаю статус ошибки, но ничего не меняется.
Есть идеи о том, что может вызвать сбой WM_SETICON
? Что-нибудь ужасно не так с любым кодом, который я выложил (кроме вопросов форматирования / стиля / приведения, так как он упрощен только до основ)?