2009-02-20 12 views
9

Noté que mi aplicación envía iconos a la bandeja de Windows con un tamaño de 16x16 píxeles, y mi PC con Vista tengo una barra de tareas de doble ancho que parece mostrar íconos a 18x18. Los artefactos de cambio de tamaño en el icono de mi aplicación se ven horribles. ¿Cómo puedo preguntar a Windows qué tamaño deberían tener los iconos?¿Cómo solicito a Windows el tamaño de los iconos de la bandeja del sistema?

edición:

estoy generando el icono de forma dinámica, con una superposición de texto de fuente de píxeles. Parece un desperdicio generar dinámicamente un conjunto de tamaños de iconos, por lo que sería bueno evitar crear un ícono con todos los tamaños "posibles" (aunque no estoy seguro de cuáles son).

GetSystemMetrics (SM_CXSMICON) devuelve 16 - el valor incorrecto.

GetThemeBackgroundContentRect tampoco sirvió de nada.

Respuesta

0

Cree sus iconos en varios formatos y deje que Windows seleccione el que desee.

Here's the Wikipedia article on the .ico format.

Si realmente necesita saber, GetSystemMetrics con un parámetro de SM_CXICON o SM_CYICON le dirá la anchura y altura que Windows quiere cargar.

+3

La primera mitad de esta respuesta es simplemente incorrecta. La API para los iconos de notificación es 'Shell_NotifyIcon'. Recibe un 'NOTIFYICONDATA' que contiene un' HICON'. Ahora, un 'HICON' se refiere a un solo icono, por lo que debe decidir el tamaño antes de llamar a' Shell_NotifyIcon'. El último párrafo es exacto sin embargo. –

1

La respuesta principal de Mark es la correcta: crea tus íconos en múltiples formatos y deja que Windows elija el correcto. No olvides hacer iconos de 32x32 y 64x64 para escenarios HighDPI.

Pero SM_CXICON/SM_CYICON no devolverá necesariamente el tamaño que se utilizará en la barra de tareas. La barra de tareas elige el tamaño de icono correcto para su tamaño (esto es más más importante en la Ventana 7).

Simplemente proporcione los iconos del tamaño adecuado y debe estar bien.

+2

Supongo que debería haber mencionado: estoy generando el ícono dinámicamente, con una superposición de texto de fuente de píxeles. Parece un desperdicio generar dinámicamente un conjunto de tamaños de iconos. GetSystemMetrics (SM_CXSMICON) devuelve 16 - el valor incorrecto nuevamente. – keelo

+1

Lamentablemente, la información no cambia mi respuesta; todavía necesita producir varios tamaños de iconos. O solo produce un icono de 256x256 y deja que el sistema lo reduzca por ti. –

+1

La generación de 256x256 con fuentes de píxeles dará como resultado un texto ilegible cuando el icono vuelva a muestrearse a 16x16, desafortunadamente. – keelo

0

Su mejor apuesta puede ser GetThemeBackgroundContentRect pasando TBN_BACKGROUND como iPartId para la bandeja de notificación de fondo.

GetThemeBackgroundContentRect debe devolver el tamaño definido por el tema actual que se puede usar para dibujar sin superponer los bordes del elemento principal. Si estoy leyendo esto correctamente, ese sería el icono de notificación de mayor tamaño permitido y, presumiblemente, el tamaño que se está utilizando.

Probando con múltiples configuraciones de DPI es probablemente la forma más fácil de saber si esto está devolviendo el valor correcto.

+3

GetThemeBackgroundContentRect con TBN_BACKGROUND no varió con el cambio del tamaño del icono de la bandeja, tampoco. – keelo

Cuestiones relacionadas