Uso delle icone

Negli argomenti seguenti viene descritto come eseguire determinate attività correlate alle icone:

Creazione di un'icona

L'esempio seguente crea due handle di icona: uno per l'icona della domanda standard e uno per un'icona personalizzata inclusa come risorsa nel file di definizione delle risorse dell'applicazione.

HICON hIcon1 = LoadIcon(NULL, IDI_QUESTION);
HICON hIcon2 = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYICON));

Le applicazioni devono implementare icone personalizzate come risorse e usare LoadIcon o LoadImage anziché creare l'icona in fase di esecuzione. L'uso delle risorse icona evita la dipendenza dai dispositivi, semplifica la localizzazione e consente alle applicazioni di condividere le progettazioni delle icone.

CreateIcon può essere usato per creare un'icona monocromatica personalizzata in fase di esecuzione. Usare l'PackCursorMaskshelper e la mappa dei simboli da Creazione di un cursore, quindi creare un'icona con un piano e un bit per pixel:

HICON hIcon = CreateIcon(hInstance, CURSOR_SIZE, CURSOR_SIZE, 1, 1, abAnd, abXor);

Per creare un'icona alfa blended in fase di esecuzione, vedere Creazione di un cursore alfa misto : passare TRUE per fIconin ICONINFO per creare un'icona anziché un cursore.

Prima di chiudere, l'applicazione deve usare DestroyIcon per eliminare definitivamente qualsiasi icona ottenuta da CreateIcon, CreateIconIndirect, CreateIconFromResourceEx senza il LR_SHARED flag o LoadImage senza il LR_SHARED flag. Le icone caricate con LoadIcon o create o caricate con LR_SHARED, sono risorse di sistema condivise e non devono essere eliminate definitivamente.

Recupero delle dimensioni dell'icona

Vedi Ottenere la dimensione di un cursore. L'esempio funziona in modo identico per le icone: basta passare un HICON al posto di HCURSOR.

Visualizzazione di un'icona

L'applicazione può caricare e creare icone da visualizzare nell'area cliente dell'applicazione o nelle finestre figlio. Nell'esempio seguente viene illustrato come disegnare un'icona nell'area client della finestra il cui contesto di dispositivo è identificato dal parametro hdc.

DrawIcon(hdc, 10, 20, hIcon1);

Il sistema visualizza automaticamente le icone di classe per una finestra. L'applicazione può assegnare icone di classe durante la registrazione di una classe finestra. L'applicazione può sostituire un'icona di classe usando la funzione SetClassLongPtr . Questa funzione modifica le impostazioni predefinite della finestra per tutte le finestre di una determinata classe. Nell'esempio seguente viene sostituita un'icona di classe con l'icona il cui identificatore di risorsa è 480.

SetClassLongPtr(hWnd, GCLP_HICON,
    (LONG_PTR)LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYICON)));

Per altre informazioni sulle classi di finestre, vedere classi finestra .

Risorse di icone per la condivisione

Il codice seguente usa le funzioni CreateIconFromResourceEx, DrawIcone LookupIconIdFromDirectoryExe diverse funzioni delle risorse, per creare un handle icona basato sui dati dell'icona di un altro file eseguibile. Visualizza quindi l'icona in una finestra.

avviso di sicurezza : Uso di LoadLibrary in modo non corretto può compromettere la sicurezza dell'applicazione caricando la DLL errata. Per informazioni su come caricare correttamente le DLL su diverse versioni di Windows, vedere la documentazione LoadLibrary.

int cx = GetSystemMetrics(SM_CXICON);
int cy = GetSystemMetrics(SM_CYICON);

// LoadLibraryExW with LOAD_LIBRARY_AS_DATAFILE avoids running the DLL/EXE.
// Always use a fully qualified path to prevent DLL planting.
HINSTANCE hExe = LoadLibraryEx(TEXT("C:\\path\\to\\myapp.exe"), NULL,
                               LOAD_LIBRARY_AS_DATAFILE);
if (hExe == NULL)
    return;

HRSRC hResource = FindResource(hExe, MAKEINTRESOURCE(440), RT_GROUP_ICON);
HGLOBAL hMem    = LoadResource(hExe, hResource);
BYTE *lpResource = LockResource(hMem);

int nID = LookupIconIdFromDirectoryEx(lpResource, TRUE, cx, cy, LR_DEFAULTCOLOR);

hResource  = FindResource(hExe, MAKEINTRESOURCE(nID), RT_ICON);
hMem       = LoadResource(hExe, hResource);
lpResource = LockResource(hMem);

HICON hIcon1 = CreateIconFromResourceEx(lpResource,
    SizeofResource(hExe, hResource), TRUE, 0x00030000,
    cx, cy, LR_DEFAULTCOLOR);

DrawIcon(hdc, 10, 20, hIcon1);

FreeLibrary(hExe);