Informationen zu Bildlisten

Eine Bildliste ist eine Sammlung von Bildern der gleichen Größe, auf die durch den Index verwiesen werden kann. Bildlisten werden verwendet, um große Mengen von Symbolen oder Bitmaps effizient zu verwalten. Alle Bilder in einer Bildliste sind in einer einzelnen, breiten Bitmap im Bildschirmgeräteformat enthalten. Eine Bildliste kann auch eine monochrome Bitmap enthalten, die Masken enthält, die zum transparenten Zeichnen von Bildern verwendet werden (Symbolformat).

Die Microsoft Win32-API bietet Bildlistenfunktionen und Makros, mit denen Sie Bildlisten erstellen und zerstören, Bilder hinzufügen und entfernen, Bilder ersetzen und zusammenführen, Bilder zeichnen und ziehen können. Um die Bildlistenfunktionen zu verwenden, schließen Sie die allgemeine Steuerelementheaderdatei in Ihre Quellcodedateien ein, und verknüpfen Sie sie mit der gemeinsamen Steuerelementexportbibliothek. Verwenden Sie außerdem vor dem Aufrufen einer Bildlistenfunktion die Funktion InitCommonControls oder InitCommonControlsEx , um sicherzustellen, dass die allgemeine Steuerelement-DLL geladen wird.

In diesem Abschnitt werden folgende Themen erörtert:

Typen

Es gibt zwei Arten von Bildlisten: nicht maskierte und maskierte Bildlisten. Eine nicht maskierte Bildliste besteht aus einer Farbbittebit, die mindestens ein Bild enthält. Eine maskierte Bildliste besteht aus zwei Bitmaps gleicher Größe. Die erste ist eine Farbbittebit, die die Bilder enthält, und die zweite ist eine monochrome Bitmap, die eine Reihe von Masken enthält – eine für jedes Bild in der ersten Bitmap.

Wenn ein nicht maskiertes Bild gezeichnet wird, wird es einfach in den Kontext des Zielgeräts kopiert. Das heißt, es wird über die vorhandene Hintergrundfarbe des Gerätekontexts gezeichnet. Wenn ein maskiertes Bild gezeichnet wird, werden die Bildausschnitte mit den Bits der Maske kombiniert, sodass in der Regel transparente Bereiche in der Bitmap entstehen, in denen die Hintergrundfarbe des Zielgerätekontexts angezeigt wird. Es gibt mehrere Zeichnungsstile, die Sie beim Zeichnen eines maskierten Bilds angeben können. Sie können z. B. angeben, dass das Bild dithered wird, um ein ausgewähltes Objekt anzugeben.

Erstellen und Zerstören von Bildlisten

Sie erstellen eine Bildliste, indem Sie die funktion ImageList_Create aufrufen. Die Parameter umfassen den Typ der zu erstellenden Bildliste, die Dimensionen jedes Bilds und die Anzahl der Bilder, die Sie der Liste hinzufügen möchten. Für eine nicht maskierte Bildliste erstellt die Funktion eine einzelne Bitmap, die groß genug ist, um die angegebene Anzahl von Bildern der angegebenen Dimensionen aufzunehmen. Anschließend wird ein bildschirmkompatibler Gerätekontext erstellt und die Bitmap darin ausgewählt. Für eine maskierte Bildliste erstellt die Funktion zwei Bitmaps und zwei bildschirmkompatible Gerätekontexte. Es wählt die Bildbittebit in einem Gerätekontext und die Maskenbitbitbit in den anderen aus. Die allgemeine Steuerelement-DLL enthält den ausführbaren Code für die Bildlistenfunktionen.

In ImageList_Create geben Sie die anfängliche Anzahl von Bildern in einer Bildliste sowie die Anzahl der Bilder an, um die die Liste vergrößert werden kann. Wenn Sie also versuchen, mehr Bilder hinzuzufügen, als Sie ursprünglich angegeben haben, wird die Bildliste automatisch vergrößert, um die neuen Bilder aufzunehmen.

Wenn ImageList_Create erfolgreich ist, wird ein Handle an den HIMAGELIST-Typ zurückgegeben. Sie verwenden dieses Handle in anderen Bildlistenfunktionen, um auf die Bildliste zuzugreifen und die Bilder zu verwalten. Sie können Bilder hinzufügen und entfernen, Bilder aus einer Bildliste in eine andere kopieren und Bilder aus zwei verschiedenen Bildlisten zusammenführen. Wenn Sie eine Bildliste nicht mehr benötigen, können Sie sie zerstören, indem Sie den zugehörigen Handle in einem Aufruf der ImageList_Destroy-Funktion angeben.

Hinzufügen und Entfernen von Images

Sie können Bitmapbilder, Symbole oder Cursor zu einer Bildliste hinzufügen. Sie fügen Bitmapbilder hinzu, indem Sie die Handles für zwei Bitmaps in einem Aufruf der funktion ImageList_Add angeben. Die erste Bitmap enthält ein oder mehrere Bilder, die der Bildbittebit hinzugefügt werden sollen, und die zweite Bitmap enthält die Masken, die der Maskenbitbitbit hinzugefügt werden sollen. Bei nicht maskierten Bildlisten wird das zweite Bitmaphandle ignoriert. sie kann auf NULL festgelegt werden.

Die funktion ImageList_AddMasked fügt auch Bitmapbilder zu einer maskierten Bildliste hinzu. Diese Funktion ähnelt ImageList_Add, mit der Ausnahme, dass Sie keine Maskenbitbitbit angeben. Stattdessen geben Sie eine Farbe an, die das System mit der Bildbitbitbit kombiniert, um die Masken automatisch zu generieren. Jedes Pixel der angegebenen Farbe in der Bildbitbitte wird in Schwarz geändert, und das entsprechende Bit in der Maske wird auf 1 festgelegt. Daher ist jedes Pixel im Bild, das der angegebenen Farbe entspricht, transparent, wenn das Bild gezeichnet wird.

Das ImageList_AddIcon Makro fügt einer Bildliste ein Symbol oder einen Cursor hinzu. Wenn die Bildliste maskiert ist, fügt ImageList_AddIcon die Maske, die mit dem Symbol oder Cursor bereitgestellt wird, der Maskenbitbitbit hinzu. Wenn die Bildliste nicht maskiert ist, wird die Maske für das Symbol oder den Cursor beim Zeichnen des Bilds nicht verwendet.

Sie können ein Symbol basierend auf einem Bild und einer Maske in einer Bildliste erstellen, indem Sie die funktion ImageList_GetIcon verwenden. Die Funktion gibt das Handle an das neue Symbol zurück.

ImageList_Add, ImageList_AddMasked und ImageList_AddIcon jedem Bild einen Index zuweisen, wenn es einer Bildliste hinzugefügt wird. Die Indizes sind nullbasiert; Das heißt, das erste Bild in der Liste weist einen Index von 0 (null) auf, das nächste hat einen Index von 1 usw. Nach dem Hinzufügen eines einzelnen Bilds geben die Funktionen den Index des Bilds zurück. Wenn mehrere Bilder gleichzeitig hinzugefügt werden, geben die Funktionen den Index des ersten Bilds zurück.

Die funktion ImageList_Remove entfernt ein Bild aus einer Bildliste.

Ersetzen und Zusammenführen von Bildern

Die Funktionen ImageList_Replace und ImageList_ReplaceIcon ersetzen ein Bild in einer Bildliste durch ein neues Bild. ImageList_Replace ersetzt ein Bild durch ein Bitmapbild und eine Maske, und ImageList_ReplaceIcon ersetzt ein Bild durch ein Symbol oder einen Cursor.

Die ImageList_Merge-Funktion führt zwei Bilder zusammen und speichert das neue Bild in einer neuen Bildliste. Das neue Bild wird erstellt, indem das zweite Bild transparent über dem ersten bild gezeichnet wird. Die Maske für das neue Bild ist das Ergebnis eines logischen OR-Vorgangs für die Bits der Masken für die beiden vorhandenen Bilder.

Zeichnen von Bildern

Um ein Bild zu zeichnen, verwenden Sie die funktion ImageList_Draw oder ImageList_DrawEx . Sie geben das Handle für eine Bildliste, den Index des zu zeichnenden Bilds, das Handle zum Kontext des Zielgeräts, eine Position im Gerätekontext und mindestens eine Zeichnungsart an.

Wenn Sie die ILD_TRANSPARENT Formatvorlage angeben, verwendet ImageList_Draw oder ImageList_DrawEx einen zweistufigen Prozess, um ein maskiertes Bild zu zeichnen. Zunächst führt er einen logischen AND-Vorgang für die Bild-Bits und die Bits der Maske aus. Anschließend wird ein logischer XOR-Vorgang für die Ergebnisse des ersten Vorgangs und die Hintergrundbits des Zielgerätekontexts ausgeführt. Dieser Prozess schafft transparente Bereiche im resultierenden Bild; Das heißt, jedes weiße Bit in der Maske bewirkt, dass das entsprechende Bit im resultierenden Bild transparent ist.

Bevor Sie ein maskiertes Bild auf einem Volltonhintergrund zeichnen, sollten Sie die ImageList_SetBkColor-Funktion verwenden, um die Hintergrundfarbe der Bildliste auf die gleiche Farbe wie das Ziel festzulegen. Durch das Festlegen der Farbe müssen keine transparenten Bereiche im Bild erstellt werden, und ImageList_Draw oder ImageList_DrawEx können das Bild einfach in den Kontext des Zielgeräts kopieren, was zu einer erheblichen Leistungssteigerung führt. Um das Bild zu zeichnen, geben Sie die ILD_NORMAL Formatvorlage in einem Aufruf von ImageList_Draw oder ImageList_DrawEx an.

Sie können die Hintergrundfarbe für eine maskierte Bildliste jederzeit so festlegen, dass sie auf jedem vollfarbigen Hintergrund richtig zeichnet. Wenn Sie die Hintergrundfarbe auf CLR_NONE festlegen, werden Bilder standardmäßig transparent gezeichnet. Verwenden Sie die Funktion ImageList_GetBkColor , um die Hintergrundfarbe einer Bildliste abzurufen.

Die ILD_BLEND25 - und ILD_BLEND50 formatieren das Bild mit der Hervorhebungsfarbe des Systems. Diese Stile sind nützlich, wenn Sie ein maskiertes Bild verwenden, um ein Objekt darzustellen, das der Benutzer auswählen kann. Sie können z. B. die ILD_BLEND50 Formatvorlage verwenden, um das Bild zu zeichnen, wenn der Benutzer es auswählt.

Ein nicht maskiertes Bild wird mithilfe des SRCCOPY-Rastervorgangs in den Kontext des Zielgeräts kopiert. Die Farben im Bild werden unabhängig von der Hintergrundfarbe des Gerätekontexts gleich angezeigt. Die in ImageList_Draw oder ImageList_DrawEx angegebenen Zeichnungsstile haben ebenfalls keine Auswirkungen auf die Darstellung eines nicht maskierten Bilds.

Ziehen von Bildern

Die Win32-API enthält Funktionen zum Ziehen eines Bilds auf den Bildschirm. Die Ziehfunktionen verschieben ein Bild reibungslos, in Farbe und ohne Blinken des Cursors. Sowohl maskierte als auch unmaskierte Bilder können gezogen werden.

Die funktion ImageList_BeginDrag startet einen Ziehvorgang. Die Parameter enthalten das Handle für die Bildliste, den Index des zu ziehenden Bilds und die Position des Hotspots innerhalb des Bilds. Der Hotspot ist ein einzelnes Pixel, das die Ziehfunktionen als die genaue Bildschirmposition des Bilds erkennen. In der Regel legt eine Anwendung den Hotspot so fest, dass er mit dem Hotspot des Mauscursors übereinstimmt. Die ImageList_DragMove-Funktion verschiebt das Bild an eine neue Position.

Die ImageList_DragEnter-Funktion legt die Anfangsposition des Bilds in einem Fenster fest und zeichnet das Bild an der Position. Die Parameter enthalten das Handle für das Fenster, in dem das Bild gezeichnet werden soll, und die Koordinaten der Anfangsposition innerhalb des Fensters. Die Koordinaten sind relativ zur oberen linken Ecke des Fensters, nicht zum Clientbereich. Dasselbe gilt für alle Bildziehfunktionen, die Koordinaten als Parameter verwenden. Dies bedeutet, dass Sie beim Angeben der Koordinaten die Breite von Fensterelementen wie Rahmen, Titelleiste und Menüleiste ausgleichen müssen. Wenn Sie beim Aufrufen von ImageList_DragEnter ein NULL-Fensterhandle angeben, zeichnen die Ziehfunktionen das Bild im Gerätekontext, der dem Desktopfenster zugeordnet ist, und die Koordinaten sind relativ zur oberen linken Ecke des Bildschirms.

Die ImageList_SetDragCursorImage-Funktion erstellt ein neues Ziehbild, indem das angegebene Bild (in der Regel ein Mauscursorbild) mit dem aktuellen Ziehbild kombiniert wird. Da die Ziehfunktionen das neue Bild während eines Ziehvorgangs verwenden, sollten Sie die ShowCursor-Funktion verwenden, um den eigentlichen Mauscursor nach dem Aufrufen von ImageList_SetDragCursorImage auszublenden. Andernfalls scheint das System für die Dauer des Ziehvorgangs zwei Mauscursor zu haben.

Wenn eine Anwendung ImageList_BeginDrag aufruft, erstellt das System eine temporäre, interne Imageliste und kopiert dann das angegebene Ziehbild in die interne Liste. Sie können das Handle in die Liste des temporären Ziehens von Bildern abrufen, indem Sie die funktion ImageList_GetDragImage verwenden. Die Funktion ruft auch die aktuelle Ziehposition und den Offset des Ziehbilds relativ zur Ziehposition ab.

Bildinformationen

Es gibt eine Reihe von Funktionen, die Informationen aus einer Bildliste abrufen. Die funktion ImageList_GetImageInfo füllt eine IMAGEINFO-Struktur mit Informationen zu einem einzelnen Bild, einschließlich der Ziehpunkte der Bild- und Maskenbitbits, der Anzahl der Farbebenen und Bits pro Pixel und dem umgebenden Rechteck des Bilds innerhalb der Bildbit. Sie können diese Informationen verwenden, um die Bitmaps für das Bild direkt zu bearbeiten. Die funktion ImageList_GetImageCount ruft die Anzahl der Bilder in einer Bildliste ab.

Bildüberlagerungen

Jede Bildliste enthält eine Liste von Indizes, die als Überlagerungen verwendet werden sollen. Eine Überlagerung ist ein Bild, das transparent über ein anderes Bild gezeichnet wird. Jedes Bild, das sich derzeit in der Bildliste befindet, kann als Überlagerung verwendet werden. Sie können bis zu vier Überlagerungen pro Bildliste angeben. Dieser Grenzwert wurde in Version 4.71 auf 15 erweitert.

Sie fügen den Index eines Bilds der Liste der Überlagerungen hinzu, indem Sie die funktion ImageList_SetOverlayImage verwenden und dabei das Handle für die Bildliste, den Index des vorhandenen Bilds und den gewünschten Überlagerungsindex angeben. Dies teilt der Bildliste tatsächlich mit, dass "das Bild am Index x als Überlagerung verwendet werden kann, und ich möchte auf die Überlagerung als Überlagerungsindex y verweisen.". Die Überlagerungsindizes sind einsbasiert und nicht nullbasiert, da ein Überlagerungsindex von 0 bedeutet, dass keine Überlagerung verwendet wird.

Beim Zeichnen eines Bilds mit der funktion ImageList_Draw oder ImageList_DrawEx geben Sie eine Überlagerung an. Die Überlagerung wird durch Ausführen eines logischen OR-Vorgangs zwischen den gewünschten Zeichnungsflags und dem Ergebnis des INDEXTOOVERLAYMASK-Makros angegeben. Das INDEXTOOVERLAYMASK-Makro verwendet den Überlagerungsindex und formatiert ihn zur Aufnahme mit den Flags für diese Funktionen. Dadurch wird das Bild mit der angegebenen Überlagerung gezeichnet. Im folgenden Beispiel wird veranschaulicht, wie beim Zeichnen des Bilds eine Überlagerung hinzugefügt und angegeben wird.

ImageList_SetOverlayImage(himl, 0, 3);
ImageList_Draw(himl, 1, hdc, 0, 0, ILD_MASK | INDEXTOOVERLAYMASK(3));

Dadurch wird Bild 1 gezeichnet und dieses Bild dann mit Bild 0 überlagert. Da 3 der Überlagerungsindex ist, den Sie im ImageList_SetOverlayImage-Aufruf angegeben haben, wird 3 im INDEXTOOVERLAYMASK-Makro platziert.

32-Bit-Symbole für Antialiased

Antialiasing ist eine Technik zum Weichmachen oder Verschwommen scharfer Kanten. Dadurch erhalten Bilder ein natürlicheres Aussehen. Bildlisten in Windows Vista und Windows 7 unterstützen die Verwendung von 32-Bit-Antialiased-Symbolen und Bitmaps. Farbwerte verwenden 24 Bit, und 8 Bits werden als Alphakanal auf den Symbolen verwendet. Um eine Bildliste zu erstellen, die ein bpp-Bild (32 Bits-per-Pixel) verarbeiten kann, rufen Sie die ImageList_Create-Funktion auf, und übergeben Sie ein ILC_COLOR32 Flag.

Um 32-Bit-Symbole ordnungsgemäß zu erstellen, müssen Sie mehrere Bilder für jedes Symbol erstellen, wie in der folgenden Abbildung dargestellt.

Abbildung mit drei Größen von Symbolen für jede von drei Farbtiefen

  • Die ersten drei Bilder befinden sich im 16-Farbmodus für die Verwendung im abgesicherten Modus.
  • Die nächsten drei Symbole werden im 256-Farbmodus verwendet.
  • Die letzten drei Symbole verfügen über den Alphakanal und können nur in Betriebssystemen mit einer 24-Bit-Farbe oder höher verwendet werden.
  • Die Reihenfolge der Bilder im Symbolformat spielt eine Rolle. Wenn die Reihenfolge falsch ist, funktionieren ältere Versionen von Windows beim Extrahieren der Symbole schlecht. Das falsche Extrahieren der Symbole kann zu Speicherbeschädigungen und falschem Rendering führen.
  • In früheren Versionen von Windows galt ein Ressourcenlimit von 10 Symbolen.

Hinweis

Sie können Tools von Drittanbietern verwenden, um Symboldateien und Bitmaps zu generieren, die einen Alphakanal enthalten. Wenn Sie LoadImage verwenden, um eine 32 bpp-Bitmap zu laden, die Alpha enthält, müssen Sie das flag LR_CREATEDIBSECTION angeben.