À propos des listes d’images
Une liste d’images est une collection d’images de la même taille, chacune d’elles pouvant être référencée par son index. Les listes d’images sont utilisées pour gérer efficacement de grands ensembles d’icônes ou de bitmaps. Toutes les images d’une liste d’images sont contenues dans une image bitmap simple et large au format d’appareil d’écran. Une liste d’images peut également inclure une bitmap monochrome qui contient des masques utilisés pour dessiner des images en toute transparence (style d’icône).
L’API Microsoft Win32 fournit des fonctions de liste d’images et des macros qui vous permettent de créer et de détruire des listes d’images, d’ajouter et de supprimer des images, de remplacer et de fusionner des images, de dessiner des images et de faire glisser des images. Pour utiliser les fonctions de liste d’images, incluez le fichier d’en-tête de contrôle commun dans vos fichiers de code source et créez un lien avec la bibliothèque d’exportation de contrôle commune. En outre, avant d’appeler une fonction de liste d’images, utilisez la fonction InitCommonControls ou InitCommonControlsEx pour vous assurer que la DLL de contrôle commune est chargée.
Les rubriques suivantes sont présentées dans cette section :
- Types
- Création et destruction de listes d’images
- Ajout et suppression d’images
- Remplacement et fusion d’images
- Dessin d’images
- Glisser des images
- Informations sur l’image
- Superpositions d’images
- Icônes anti-ataliased 32 bits
Types
Il existe deux types de listes d’images : non masquées et masquées. Une liste d’images non masquées se compose d’une bitmap de couleur qui contient une ou plusieurs images. Une liste d’images masquées se compose de deux bitmaps de taille égale. La première est une bitmap de couleur qui contient les images, et la seconde est une image bitmap monochrome qui contient une série de masques, un pour chaque image de la première bitmap.
Lorsqu’une image non masquée est dessinée, elle est simplement copiée dans le contexte de l’appareil cible ; autrement dit, il est dessiné sur la couleur d’arrière-plan existante du contexte de l’appareil. Lorsqu’une image masquée est dessinée, les bits de l’image sont combinés avec les bits du masque, ce qui produit généralement des zones transparentes dans la bitmap où la couleur d’arrière-plan du contexte de l’appareil cible s’affiche. Il existe plusieurs styles de dessin que vous pouvez spécifier lors du dessin d’une image masquée. Par exemple, vous pouvez spécifier que l’image doit être tergiversée pour indiquer un objet sélectionné.
Création et destruction de listes d’images
Vous créez une liste d’images en appelant la fonction ImageList_Create . Les paramètres incluent le type de liste d’images à créer, les dimensions de chaque image et le nombre d’images que vous envisagez d’ajouter à la liste. Pour une liste d’images non masquées, la fonction crée une image bitmap unique suffisamment grande pour contenir le nombre spécifié d’images des dimensions données. Ensuite, il crée un contexte d’appareil compatible avec l’écran et sélectionne l’image bitmap. Pour une liste d’images masquées, la fonction crée deux bitmaps et deux contextes d’appareil compatibles avec l’écran. Il sélectionne l’image bitmap dans un contexte d’appareil et l’image bitmap de masque dans l’autre. La DLL de contrôle commune contient le code exécutable pour les fonctions de liste d’images.
Dans ImageList_Create, vous spécifiez le nombre initial d’images qui seront dans une liste d’images, ainsi que le nombre d’images par lesquelles la liste peut s’agrandir. Par conséquent, si vous tentez d’ajouter plus d’images que vous n’avez initialement spécifié, la liste d’images s’agrandit automatiquement pour prendre en charge les nouvelles images.
Si ImageList_Create réussit, elle retourne un handle au type HIMAGELIST. Vous utilisez ce handle dans d’autres fonctions de liste d’images pour accéder à la liste d’images et gérer les images. Vous pouvez ajouter et supprimer des images, copier des images d’une liste d’images vers une autre et fusionner des images de deux listes d’images différentes. Lorsque vous n’avez plus besoin d’une liste d’images, vous pouvez la détruire en spécifiant son handle dans un appel à la fonction ImageList_Destroy .
Ajout et suppression d’images
Vous pouvez ajouter des images bitmap, des icônes ou des curseurs à une liste d’images. Vous ajoutez des images bitmap en spécifiant les handles à deux bitmaps dans un appel à la fonction ImageList_Add . La première bitmap contient une ou plusieurs images à ajouter à l’image bitmap, et la deuxième bitmap contient les masques à ajouter à l’image bitmap du masque. Pour les listes d’images non masquées, le deuxième handle bitmap est ignoré ; il peut être défini sur NULL.
La fonction ImageList_AddMasked ajoute également des images bitmap à une liste d’images masquées. Cette fonction est similaire à ImageList_Add, sauf que vous ne spécifiez pas de bitmap de masque. Au lieu de cela, vous spécifiez une couleur que le système combine à l’image bitmap pour générer automatiquement les masques. Chaque pixel de la couleur spécifiée dans l’image bitmap est remplacé par noir, et le bit correspondant dans le masque est défini sur 1. Par conséquent, tout pixel de l’image qui correspond à la couleur spécifiée est transparent lorsque l’image est dessinée.
La macro ImageList_AddIcon ajoute une icône ou un curseur à une liste d’images. Si la liste d’images est masquée, ImageList_AddIcon ajoute le masque fourni avec l’icône ou le curseur à l’image bitmap du masque. Si la liste d’images n’est pas masquée, le masque de l’icône ou du curseur n’est pas utilisé lors du dessin de l’image.
Vous pouvez créer une icône basée sur une image et un masque dans une liste d’images à l’aide de la fonction ImageList_GetIcon . La fonction retourne le handle à la nouvelle icône.
ImageList_Add, ImageList_AddMasked et ImageList_AddIcon attribuer un index à chaque image lors de son ajout à une liste d’images. Les index sont de base zéro ; autrement dit, la première image de la liste a un index de zéro, la suivante a un index d’un, et ainsi de suite. Après avoir ajouté une seule image, les fonctions retournent l’index de l’image. Lorsque plusieurs images sont ajoutées à la fois, les fonctions retournent l’index de la première image.
La fonction ImageList_Remove supprime une image d’une liste d’images.
Remplacement et fusion d’images
Les fonctions ImageList_Replace et ImageList_ReplaceIcon remplacent une image dans une liste d’images par une nouvelle image. ImageList_Replace remplace une image par une image bitmap et un masque, et ImageList_ReplaceIcon remplace une image par une icône ou un curseur.
La fonction ImageList_Merge fusionne deux images, stockant la nouvelle image dans une nouvelle liste d’images. La nouvelle image est créée en dessinant la deuxième image en toute transparence sur la première. Le masque de la nouvelle image est le résultat d’une opération LOGIQUE OR sur les bits des masques pour les deux images existantes.
Dessin d’images
Pour dessiner une image, vous utilisez la fonction ImageList_Draw ou ImageList_DrawEx . Vous spécifiez le handle d’une liste d’images, l’index de l’image à dessiner, le handle dans le contexte de l’appareil de destination, un emplacement dans le contexte de l’appareil et un ou plusieurs styles de dessin.
Lorsque vous spécifiez le style ILD_TRANSPARENT , ImageList_Draw ou ImageList_DrawEx utilise un processus en deux étapes pour dessiner une image masquée. Tout d’abord, il effectue une opération AND logique sur les bits de l’image et les bits du masque. Ensuite, il effectue une opération XOR logique sur les résultats de la première opération et les bits d’arrière-plan du contexte de l’appareil de destination. Ce processus crée des zones transparentes dans l'image résultante ; autrement dit, chaque bit blanc dans le masque rend le bit correspondant dans l'image résultante transparent.
Avant de dessiner une image masquée sur un arrière-plan de couleur unie, vous devez utiliser la fonction ImageList_SetBkColor pour définir la couleur d’arrière-plan de la liste d’images sur la même couleur que la destination. La définition de la couleur élimine la nécessité de créer des zones transparentes dans l’image et permet à ImageList_Draw ou ImageList_DrawEx de copier simplement l’image dans le contexte de l’appareil de destination, ce qui entraîne une augmentation significative des performances. Pour dessiner l’image, spécifiez le style ILD_NORMAL dans un appel à ImageList_Draw ou ImageList_DrawEx.
Vous pouvez définir la couleur d’arrière-plan d’une liste d’images masquées à tout moment afin qu’elle dessine correctement sur n’importe quel arrière-plan uni. La définition de la couleur d’arrière-plan sur CLR_NONE entraîne le dessin transparent des images par défaut. Pour récupérer la couleur d’arrière-plan d’une liste d’images, utilisez la fonction ImageList_GetBkColor .
Les styles ILD_BLEND25 et ILD_BLEND50 tergiversent l’image avec la couleur de mise en surbrillance du système. Ces styles sont utiles si vous utilisez une image masquée pour représenter un objet que l'utilisateur peut sélectionner. Par exemple, vous pouvez utiliser le style ILD_BLEND50 pour dessiner l’image lorsque l’utilisateur la sélectionne.
Une image non masquée est copiée dans le contexte de l’appareil de destination à l’aide de l’opération raster SRCCOPY. Les couleurs dans l'image s'affichent de la même façon indépendamment de la couleur d'arrière-plan du contexte de périphérique. Les styles de dessin spécifiés dans ImageList_Draw ou ImageList_DrawEx également n’ont aucun effet sur l’apparence d’une image non masquée.
Glisser des images
L’API Win32 inclut des fonctions permettant de faire glisser une image sur l’écran. Les fonctions Glisser-déplacer déplacent une image en douceur, en couleurs, sans aucun clignotement du curseur. Les images masquées et démasquées peuvent être glissées.
La fonction ImageList_BeginDrag commence une opération de glissement. Les paramètres incluent la poignée de la liste d’images, l’index de l’image à faire glisser et l’emplacement du point chaud dans l’image. La zone réactive est un seul pixel que les fonctions de glissement identifient comme l'emplacement exact de l'image à l'écran. Généralement, une application définit la zone réactive afin qu'elle coïncide avec la zone réactive du curseur de la souris. La fonction ImageList_DragMove déplace l’image vers un nouvel emplacement.
La fonction ImageList_DragEnter définit la position initiale de l’image glisser dans une fenêtre et dessine l’image à la position. Les paramètres incluent le handle de la fenêtre dans lequel dessiner l’image et les coordonnées de la position initiale dans la fenêtre. Les coordonnées sont exprimées par rapport au coin supérieur gauche de la fenêtre, pas de la zone cliente. Il en va de même pour toutes les fonctions de glissement d’image qui prennent des coordonnées en tant que paramètres. Cela signifie que vous devez compenser la largeur des éléments de fenêtre tels que la bordure, la barre de titre et la barre de menus lors de la spécification des coordonnées. Si vous spécifiez un handle de fenêtre NULL lors de l’appel de ImageList_DragEnter, les fonctions de glissement dessinent l’image dans le contexte de l’appareil associé à la fenêtre de bureau, et les coordonnées sont relatives à l’angle supérieur gauche de l’écran.
La fonction ImageList_SetDragCursorImage crée une image de glissement en combinant l’image donnée (généralement une image de curseur de souris) avec l’image de glissement actuelle. Étant donné que les fonctions de glissement utilisent la nouvelle image pendant une opération de glissement, vous devez utiliser la fonction ShowCursor pour masquer le curseur de la souris réel après avoir appelé ImageList_SetDragCursorImage. Sinon, le système peut sembler être composé de deux curseurs de souris pour la durée de l'opération Glisser-déplacer.
Lorsqu’une application appelle ImageList_BeginDrag, le système crée une liste d’images interne temporaire, puis copie l’image de glissement spécifiée vers la liste interne. Vous pouvez récupérer le handle vers la liste d’images de glissement temporaire à l’aide de la fonction ImageList_GetDragImage . La fonction récupère également l'emplacement actuel de glissement et le décalage de l'image glissée par rapport à la position de glissement.
Informations sur l’image
Il existe un certain nombre de fonctions qui récupèrent des informations à partir d’une liste d’images. La fonction ImageList_GetImageInfo remplit une structure IMAGEINFO avec des informations sur une seule image, notamment les handles des bitmaps d’image et de masque, le nombre de plans de couleurs et de bits par pixel, ainsi que le rectangle englobant de l’image dans l’image bitmap. Vous pouvez utiliser ces informations pour manipuler directement les bitmaps de l’image. La fonction ImageList_GetImageCount récupère le nombre d’images dans une liste d’images.
Superpositions d’images
Chaque liste d’images comprend une liste d’index à utiliser comme superpositions. Une superposition est une image qui est dessinée en toute transparence sur une autre image. Toute image figurant actuellement dans la liste d’images peut être utilisée comme superposition. Vous pouvez spécifier jusqu’à quatre superpositions par liste d’images. Cette limite a été étendue à 15 dans la version 4.71.
Vous ajoutez l’index d’une image à la liste des superpositions à l’aide de la fonction ImageList_SetOverlayImage , en spécifiant le handle dans la liste d’images, l’index de l’image existante et l’index de superposition souhaité. En effet, cela indique à la liste d’images que « l’image à l’index x peut être utilisée comme superposition, et je veux faire référence à la superposition en tant qu’index de superposition y ». Les index de superposition sont de base un plutôt que de base zéro, car un index de superposition de zéro signifie qu’aucune superposition ne sera utilisée.
Vous spécifiez une superposition lors du dessin d’une image avec la fonction ImageList_Draw ou ImageList_DrawEx . La superposition est spécifiée en effectuant une opération LOGIQUE OR entre les indicateurs de dessin souhaités et le résultat de la macro INDEXTOOVERLAYMASK . La macro INDEXTOOVERLAYMASK prend l’index de superposition et le met en forme pour l’inclusion avec les indicateurs de ces fonctions. Cette opération dessine l’image avec la superposition spécifiée. L’exemple suivant montre comment une superposition est ajoutée et spécifiée lors du dessin de l’image.
ImageList_SetOverlayImage(himl, 0, 3);
ImageList_Draw(himl, 1, hdc, 0, 0, ILD_MASK | INDEXTOOVERLAYMASK(3));
Cette opération dessine l’image 1, puis la superpose avec l’image 0. Étant donné que 3 est l’index de superposition que vous avez spécifié dans l’appel ImageList_SetOverlayImage , 3 est placé dans la macro INDEXTOOVERLAYMASK .
Icônes anticrénelées 32 bits
L’anticrénelage est une technique d’adoucissement ou de flou des bords tranchants. Cela donne aux images un aspect plus naturel. Les listes d’images dans Windows Vista et Windows 7 prennent en charge l’utilisation d’icônes et de bitmaps anticrénelées 32 bits. Les valeurs de couleur utilisent 24 bits et 8 bits sont utilisés comme canal alpha sur les icônes. Pour créer une liste d’images capable de gérer une image de 32 bits par pixel (bpp), appelez la fonction ImageList_Create en passant un indicateur de ILC_COLOR32.
Pour créer correctement des icônes 32 bits, vous devez créer plusieurs images pour chaque icône, comme illustré dans l’illustration suivante.
- Les trois premières images sont en mode 16 couleurs pour une utilisation en mode sans échec.
- Les trois icônes suivantes sont utilisées en mode 256 couleurs.
- Les trois dernières icônes ont le canal alpha et peuvent être utilisées uniquement dans les systèmes d’exploitation exécutant une couleur 24 bits ou supérieure.
- L’ordre des images au format d’icône est important. Si l’ordre est incorrect, les anciennes versions de Windows fonctionnent mal lors de l’extraction des icônes. L’extraction incorrecte des icônes peut entraîner une altération de la mémoire et un rendu incorrect.
- Les versions précédentes de Windows avaient une limite de ressources de 10 icônes.
Notes
Vous pouvez utiliser des outils tiers pour générer des fichiers d’icônes et des bitmaps contenant un canal alpha. Si vous utilisez LoadImage pour charger une bitmap de 32 bpp contenant de l’alpha, vous devez spécifier l’indicateur LR_CREATEDIBSECTION.