(estoy usando Visual Studio 2008, aunque recuerdo haber tenido problemas similares con versiones anteriores también.)Problemas con el establecimiento de icono de la aplicación
He intentado varios métodos diferentes (muchos de ellos se menciona en this other question), pero todavía estoy teniendo algunos problemas extraños:
Cuando se incluye un icono como un recurso, lo hace aparecer como el icono del archivo ejecutable de inmediato, pero para el icono aparezca en la barra de tareas, tengo que reiniciar el ordenador. Hasta entonces, continúa apareciendo como cualquier icono anterior. Limpiar la solución, reiniciar VS, no tiene ningún efecto. No es realmente un gran problema, ya que no afectará a un ejecutable liberado, pero sería bueno saber dónde se guarda el antiguo icono en la memoria caché y cómo deshacerse de él.
No importa lo que haga, el ícono que se muestra cuando alt-tabbing es el icono predeterminado de la aplicación (cuadrado y blanco y genérico). Esto incluye insertar el icono en el ejecutable, así como configurar
ICON_BIG
conWM_SETICON
.
En cuanto a la segunda cuestión, mi código es algo como:
hIcon = (HICON)(
LoadImage(NULL, szFilename, IMAGE_ICON, 32, 32, LR_LOADFROMFILE));
if(hIcon)
SendMessage(hWnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
Sin embargo, después de enviar WM_SETICON
, GetLastError()
retornos 6, "El identificador no es válido.". hWnd
es un identificador de ventana válido y hIcon
parece ser un identificador de icono válido. Intenté buscar las razones por las cuales WM_SETICON
podría causar ese error y, como mínimo, para averiguar QUÉ manejar, piensa que no es válido, pero aún no tiene suerte. Borré el código de error inmediatamente antes de llamar al SendMessage()
, por lo que debe establecerse en algún lugar del procesamiento del mensaje.
he intentado un método alternativo, cargando el icono del ejecutable, en sí, donde el identificador del recurso es 101
(que es el primer y único recurso incluidos):
hIcon = (HICON)(
LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(101),
IMAGE_ICON, 48, 48, 0));
if(hIcon)
SendMessage(hWnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
... pero la misma cosa sucede; después de llamar al SendMessage()
, GetLastError()
da el mismo estado de error.
He intentado diferentes dimensiones (como 48x48, todas las cuales están presentes en el archivo de icono), pero para ningún efecto diferente. Sé que definitivamente está buscando y cargando las imágenes, porque si especifico un tamaño que no existe o una identificación de recurso no válida o un nombre de archivo incorrecto (dependiendo de cómo lo estoy cargando), falla mucho antes de SendMessage()
.
Curiosamente, si especifico ICON_SMALL
en lugar de ICON_BIG
, la llamada se realiza correctamente sin estado de error, pero a partir de the docs, necesito utilizar ICON_BIG
para establecer el icono utilizado mientras alt-tabulación. Además, si uso ICON_BIG
pero cargo el icono de 16x16, no obtengo ningún estado de error, pero nada cambia.
¿Alguna idea sobre qué podría estar causando que WM_SETICON
fallara? ¿Hay algo terriblemente mal con el código que he publicado (aparte de los problemas de formato/estilo/casting, ya que está simplificado a solo lo básico)?
Me encuentro con el mismo problema hoy. Lamentablemente, esto no funciona para mí. Tengo que buscar en internet otras soluciones. – Lothar
El método 'LoadImage' funciona bien para mostrar el ícono en el menú' alt' + 'Tab' Tuve el problema de que no estaba configurando' LoadImage' de 'BIG_ICON' en 32x32, una vez que lo hice trabajado como un encanto. Ver: http://stackoverflow.com/a/24029664/1828637 – Noitidart