Utilisation d’icônes

Les rubriques suivantes décrivent comment effectuer certaines tâches liées aux icônes :

Création d’une icône

L’exemple suivant crée deux handles d’icône : un pour l’icône de question standard et un pour une icône personnalisée incluse en tant que ressource dans le fichier de définition de ressource de l’application.

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

Les applications doivent implémenter des icônes personnalisées en tant que ressources et utiliser LoadIcon ou LoadImage plutôt que de créer l’icône au moment de l’exécution. L’utilisation de ressources d’icône évite la dépendance des appareils, simplifie la localisation et permet aux applications de partager des conceptions d’icônes.

CreateIcon peut être utilisé pour créer une icône monochrome personnalisée au moment de l’exécution. Utilisez la fonction utilitaire PackCursorMasks et la table des symboles de Création d’un curseur, puis créez une icône avec un seul plan et un bit par pixel :

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

Pour créer une icône alpha fusionnée au moment de l’exécution, consultez Création d’un curseur alpha mixte : passez-le TRUEfIcon dans ICONINFO pour créer une icône au lieu d’un curseur.

Avant de fermer, votre application doit utiliser DestroyIcon pour détruire une icône obtenue à partir de CreateIcon, CreateIconIndirect, CreateIconFromResourceEx sans l’indicateur LR_SHARED , ou LoadImage sans l’indicateur LR_SHARED . Les icônes chargées avec LoadIcon, ou créées ou chargées avec LR_SHARED, sont des ressources système partagées et ne doivent pas être détruites.

Obtention de la taille de l’icône

Consultez Obtention d’une taille de curseur. L’exemple fonctionne de la même manière pour les icônes : passez un HICON à la place de HCURSOR.

Affichage d’une icône

Votre application peut charger et créer des icônes à afficher dans la zone cliente ou les fenêtres enfants de l’application. L’exemple suivant montre comment dessiner une icône dans la zone cliente de la fenêtre dont le contexte d’appareil (DC) est identifié par le paramètre hdc .

DrawIcon(hdc, 10, 20, hIcon1);

Le système affiche automatiquement les icônes de classe d’une fenêtre. Votre application peut affecter des icônes de classe lors de l’inscription d’une classe de fenêtre. Votre application peut remplacer une icône de classe à l’aide de la fonction SetClassLongPtr . Cette fonction modifie les paramètres de fenêtre par défaut pour toutes les fenêtres d’une classe donnée. L’exemple suivant remplace une icône de classe par l’icône dont l’identificateur de ressource est 480.

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

Pour plus d’informations sur les classes de fenêtre, consultez Classes de fenêtre.

Partage des ressources d’icône

Le code suivant utilise les fonctions CreateIconFromResourceEx, DrawIcon et LookupIconIdFromDirectoryEx, et plusieurs des fonctions de ressource, pour créer un handle d’icône basé sur les données d’icône d’un autre fichier exécutable. Ensuite, il affiche l’icône dans une fenêtre.

Avertissement de sécurité : L’utilisation incorrecte de LoadLibrary peut compromettre la sécurité de votre application en chargeant la DLL incorrecte. Reportez-vous à la documentation LoadLibrary pour plus d’informations sur la façon de charger correctement des DLL avec différentes versions de Windows.

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);