Uso de iconos
En los temas siguientes se describe cómo realizar determinadas tareas relacionadas con los iconos:
Para usar un icono, la aplicación debe obtener un identificador para el icono. En el ejemplo siguiente se muestra cómo crear dos identificadores de icono diferentes: uno para el icono de pregunta estándar y otro para un icono personalizado incluido como recurso en el archivo de definición de recursos de la aplicación.
HICON hIcon1; // icon handle
HICON hIcon2; // icon handle
// Create a standard question icon.
hIcon1 = LoadIcon(NULL, IDI_QUESTION);
// Create a custom icon based on a resource.
hIcon2 = LoadIcon(hinst, MAKEINTRESOURCE(460));
// Create a custom icon at run time.
Una aplicación debe implementar iconos personalizados como recursos y debe usar la función LoadIcon o LoadImage , en lugar de crear los iconos en tiempo de ejecución. Este enfoque evita la dependencia del dispositivo, simplifica la localización y permite a las aplicaciones compartir mapas de bits de iconos. Sin embargo, en el ejemplo siguiente se usa CreateIcon para crear un icono monocromo personalizado en tiempo de ejecución, basado en máscaras de bits de mapa de bits; se incluye para ilustrar cómo el sistema interpreta las máscaras de bits del mapa de bits del icono.
HICON hIcon3; // icon handle
// Yang icon AND bitmask
BYTE ANDmaskIcon[] = {0xFF, 0xFF, 0xFF, 0xFF, // line 1
0xFF, 0xFF, 0xC3, 0xFF, // line 2
0xFF, 0xFF, 0x00, 0xFF, // line 3
0xFF, 0xFE, 0x00, 0x7F, // line 4
0xFF, 0xFC, 0x00, 0x1F, // line 5
0xFF, 0xF8, 0x00, 0x0F, // line 6
0xFF, 0xF8, 0x00, 0x0F, // line 7
0xFF, 0xF0, 0x00, 0x07, // line 8
0xFF, 0xF0, 0x00, 0x03, // line 9
0xFF, 0xE0, 0x00, 0x03, // line 10
0xFF, 0xE0, 0x00, 0x01, // line 11
0xFF, 0xE0, 0x00, 0x01, // line 12
0xFF, 0xF0, 0x00, 0x01, // line 13
0xFF, 0xF0, 0x00, 0x00, // line 14
0xFF, 0xF8, 0x00, 0x00, // line 15
0xFF, 0xFC, 0x00, 0x00, // line 16
0xFF, 0xFF, 0x00, 0x00, // line 17
0xFF, 0xFF, 0x80, 0x00, // line 18
0xFF, 0xFF, 0xE0, 0x00, // line 19
0xFF, 0xFF, 0xE0, 0x01, // line 20
0xFF, 0xFF, 0xF0, 0x01, // line 21
0xFF, 0xFF, 0xF0, 0x01, // line 22
0xFF, 0xFF, 0xF0, 0x03, // line 23
0xFF, 0xFF, 0xE0, 0x03, // line 24
0xFF, 0xFF, 0xE0, 0x07, // line 25
0xFF, 0xFF, 0xC0, 0x0F, // line 26
0xFF, 0xFF, 0xC0, 0x0F, // line 27
0xFF, 0xFF, 0x80, 0x1F, // line 28
0xFF, 0xFF, 0x00, 0x7F, // line 29
0xFF, 0xFC, 0x00, 0xFF, // line 30
0xFF, 0xF8, 0x03, 0xFF, // line 31
0xFF, 0xFC, 0x3F, 0xFF}; // line 32
// Yang icon XOR bitmask
BYTE XORmaskIcon[] = {0x00, 0x00, 0x00, 0x00, // line 1
0x00, 0x00, 0x00, 0x00, // line 2
0x00, 0x00, 0x00, 0x00, // line 3
0x00, 0x00, 0x00, 0x00, // line 4
0x00, 0x00, 0x00, 0x00, // line 5
0x00, 0x00, 0x00, 0x00, // line 6
0x00, 0x00, 0x00, 0x00, // line 7
0x00, 0x00, 0x38, 0x00, // line 8
0x00, 0x00, 0x7C, 0x00, // line 9
0x00, 0x00, 0x7C, 0x00, // line 10
0x00, 0x00, 0x7C, 0x00, // line 11
0x00, 0x00, 0x38, 0x00, // line 12
0x00, 0x00, 0x00, 0x00, // line 13
0x00, 0x00, 0x00, 0x00, // line 14
0x00, 0x00, 0x00, 0x00, // line 15
0x00, 0x00, 0x00, 0x00, // line 16
0x00, 0x00, 0x00, 0x00, // line 17
0x00, 0x00, 0x00, 0x00, // line 18
0x00, 0x00, 0x00, 0x00, // line 19
0x00, 0x00, 0x00, 0x00, // line 20
0x00, 0x00, 0x00, 0x00, // line 21
0x00, 0x00, 0x00, 0x00, // line 22
0x00, 0x00, 0x00, 0x00, // line 23
0x00, 0x00, 0x00, 0x00, // line 24
0x00, 0x00, 0x00, 0x00, // line 25
0x00, 0x00, 0x00, 0x00, // line 26
0x00, 0x00, 0x00, 0x00, // line 27
0x00, 0x00, 0x00, 0x00, // line 28
0x00, 0x00, 0x00, 0x00, // line 29
0x00, 0x00, 0x00, 0x00, // line 30
0x00, 0x00, 0x00, 0x00, // line 31
0x00, 0x00, 0x00, 0x00}; // line 32
hIcon3 = CreateIcon(hinst, // application instance
32, // icon width
32, // icon height
1, // number of XOR planes
1, // number of bits per pixel
ANDmaskIcon, // AND bitmask
XORmaskIcon); // XOR bitmask
Para crear el icono, CreateIcon aplica la siguiente tabla de verdad a las máscaras de bits AND y XOR.
Máscara de bits AND | Máscara de bits XOR | Mostrar |
---|---|---|
0 | 0 | Negro |
0 | 1 | Blanco |
1 | 0 | Screen |
1 | 1 | Pantalla inversa |
Para crear un icono de color en tiempo de ejecución, debe usar la función CreateIconIndirect , que crea un icono basado en el contenido de una estructura ICONINFO .
Antes de cerrar, la aplicación debe usar DestroyIcon para destruir cualquier icono que haya creado mediante CreateIcon o CreateIconIndirect. No es necesario destruir iconos creados por otras funciones.
Este es el código de ejemplo cómo obtener el tamaño del icono del identificador HICON :
// Also works for cursors
BOOL GetIconDimensions(__in HICON hico, __out SIZE *psiz)
{
ICONINFO ii;
BOOL fResult = GetIconInfo(hico, &ii);
if (fResult) {
BITMAP bm;
fResult = GetObject(ii.hbmMask, sizeof(bm), &bm) == sizeof(bm);
if (fResult) {
psiz->cx = bm.bmWidth;
psiz->cy = ii.hbmColor ? bm.bmHeight : bm.bmHeight / 2;
}
if (ii.hbmMask) DeleteObject(ii.hbmMask);
if (ii.hbmColor) DeleteObject(ii.hbmColor);
}
return fResult;
}
La aplicación puede cargar y crear iconos para mostrarlos en el área cliente de la aplicación o en las ventanas secundarias. En el ejemplo siguiente se muestra cómo dibujar un icono en el área cliente de la ventana cuyo contexto de dispositivo (DC) se identifica mediante el parámetro hdc .
HICON hIcon1; // icon handle
HDC hdc; // handle to display context
DrawIcon(hdc, 10, 20, hIcon1);
El sistema muestra automáticamente los iconos de clase de una ventana. La aplicación puede asignar iconos de clase al registrar una clase de ventana. La aplicación puede reemplazar un icono de clase mediante la función SetClassLong . Esta función cambia la configuración de ventana predeterminada para todas las ventanas de una clase determinada. En el ejemplo siguiente se reemplaza un icono de clase por el icono cuyo identificador de recurso es 480.
HINSTANCE hinst; // handle to current instance
HWND hwnd; // main window handle
// Change the icon for hwnd's window class.
SetClassLongPtr(hwnd, // window handle
GCLP_HICON, // changes icon
(LONG_PTR) LoadIcon(hinst, MAKEINTRESOURCE(480))
);
Para obtener más información sobre las clases de ventana, vea Clases de ventana.
El código siguiente usa las funciones CreateIconFromResourceEx, DrawIcon y LookupIconIdFromDirectoryEx, y varias de las funciones de recursos, para crear un identificador de icono basado en datos de icono de otro archivo ejecutable. A continuación, muestra el icono en una ventana.
Advertencia de seguridad: El uso de LoadLibrary incorrectamente puede poner en peligro la seguridad de la aplicación cargando el archivo DLL incorrecto. Consulte la documentación de LoadLibrary para obtener información sobre cómo cargar correctamente archivos DLL con diferentes versiones de Windows.
HICON hIcon1; // icon handle
HINSTANCE hExe; // handle to loaded .EXE file
HRSRC hResource; // handle to FindResource
HRSRC hMem; // handle to LoadResource
BYTE *lpResource; // pointer to resource data
int nID; // ID of resource that best fits current screen
HDC hdc; // handle to display context
// Load the file from which to copy the icon.
// Note: LoadLibrary should have a fully explicit path.
//
hExe = LoadLibrary("myapp.exe");
if (hExe == NULL)
{
//Error loading module -- fail as securely as possible
return;
}
// Find the icon directory whose identifier is 440.
hResource = FindResource(hExe,
MAKEINTRESOURCE(440),
RT_GROUP_ICON);
// Load and lock the icon directory.
hMem = LoadResource(hExe, hResource);
lpResource = LockResource(hMem);
// Get the identifier of the icon that is most appropriate
// for the video display.
nID = LookupIconIdFromDirectoryEx((PBYTE) lpResource, TRUE,
CXICON, CYICON, LR_DEFAULTCOLOR);
// Find the bits for the nID icon.
hResource = FindResource(hExe,
MAKEINTRESOURCE(nID),
MAKEINTRESOURCE(RT_ICON));
// Load and lock the icon.
hMem = LoadResource(hExe, hResource);
lpResource = LockResource(hMem);
// Create a handle to the icon.
hIcon1 = CreateIconFromResourceEx((PBYTE) lpResource,
SizeofResource(hExe, hResource), TRUE, 0x00030000,
CXICON, CYICON, LR_DEFAULTCOLOR);
// Draw the icon in the client area.
DrawIcon(hdc, 10, 20, hIcon1);