Sdílet prostřednictvím


O seznamech obrázků

Seznam obrázků je kolekce obrázků se stejnou velikostí, z nichž každý může být označován indexem. Seznamy obrázků slouží k efektivní správě velkých sad ikon nebo rastrových obrázků. Všechny obrázky v seznamu obrázků jsou obsaženy v jednom širokoúhlém rastrovém obrázku ve formátu zařízení obrazovky. Seznam obrázků může obsahovat také monochromatický rastrový obrázek, který obsahuje masky, které se používají k transparentnímu kreslení obrázků (styl ikony).

Rozhraní MICROSOFT Win32 API poskytuje funkce a makra seznamu obrázků, které umožňují vytvářet a odstraňovat seznamy obrázků, přidávat a odebírat obrázky, nahrazovat a slučovat obrázky, kreslit obrázky a přetahovat obrázky. Pokud chcete použít funkce seznamu obrázků, zahrňte do souborů zdrojového kódu společný soubor záhlaví ovládacího prvku a propojte knihovnu pro export běžných ovládacích prvků. Kromě toho před voláním jakékoli funkce seznamu obrázků použijte InitCommonControls nebo InitCommonControlsEx funkce k zajištění načtení knihovny DLL společného ovládacího prvku.

V této části jsou popsána následující témata:

Typy

Existují dva typy seznamů obrázků: nemaskované a maskované. Nemaskovaný seznam obrázků se skládá z barevného rastrového obrázku, který obsahuje jeden nebo více obrázků. Maskovaný seznam obrázků se skládá ze dvou rastrových obrázků se stejnou velikostí. První je barevný rastrový obrázek, který obsahuje obrázky, a druhý je monochromatický rastrový obrázek, který obsahuje řadu masek – jeden pro každý obrázek v prvním rastrovém obrázku.

Při kreslení nemaskovaného obrázku je jednoduše zkopírován do kontextu cílového zařízení; to znamená, že je nakreslen přes existující barvu pozadí kontextu zařízení. Při vykreslení maskovaného obrázku se bity obrázku zkombinují s bity masky, což obvykle vytváří průhledné oblasti v rastrovém obrázku, ve kterých se zobrazuje barva pozadí kontextu cílového zařízení. Při kreslení maskovaného obrázku můžete určit několik stylů výkresu. Můžete například určit, že se obrázek odpočítá a označí vybraný objekt.

Vytváření a likvidace seznamů obrázků

Seznam obrázků vytvoříte zavoláním funkce ImageList_Create. Parametry zahrnují typ seznamu obrázků, který chcete vytvořit, rozměry jednotlivých imagí a počet obrázků, které chcete do seznamu přidat. U nemaskovaného seznamu obrázků vytvoří funkce jeden rastrový obrázek dostatečně velký, aby držel zadaný počet obrázků daných dimenzí. Pak vytvoří kontext zařízení kompatibilní s obrazovkou a vybere do něj rastrový obrázek. U maskovaného seznamu obrázků vytvoří funkce dva rastrové obrázky a dva kontexty zařízení kompatibilní s obrazovkou. Vybere rastrový obrázek do jednoho kontextu zařízení a rastrový obrázek masky do druhého. Společná ovládací knihovna DLL obsahuje spustitelný kód pro funkce seznamu obrázků.

V ImageList_Createzadáte počáteční počet obrázků, které budou v seznamu obrázků, a také počet obrázků, podle kterých může seznam růst. Takže pokud se pokusíte přidat více obrázků, než jste původně zadali, seznam obrázků se automaticky rozroste tak, aby vyhovoval novým imagím.

Pokud ImageList_Create proběhne úspěšně, vrátí popisovač k typu HIMAGELIST. Tento popisovač použijete v jiných funkcích seznamu obrázků pro přístup k seznamu a správu obrázků. Můžete přidávat a odebírat obrázky, kopírovat obrázky z jednoho seznamu obrázků do druhého a sloučit obrázky ze dvou různých seznamů obrázků. Pokud již seznam obrázků nepotřebujete, můžete ho zrušit zadáním jeho popisovače při volání funkce ImageList_Destroy.

Přidávání a odebírání imagí

Do seznamu obrázků můžete přidat rastrové obrázky, ikony nebo kurzory. Rastrové obrázky přidáte zadáním úchytů dvou bitmap ve volání funkce ImageList_Add. První bitmapa obsahuje jeden nebo více obrázků, které se mají přidat do bitmapy obrázků, a druhá bitmapa obsahuje masky, které se mají přidat do bitmapy masek. U nemaskovaných seznamů obrázků je druhý rastrový úchyt ignorován; může být nastavena na null.

Funkce ImageList_AddMasked také přidá rastrové obrázky do seznamu maskovaných obrázků. Tato funkce je podobná ImageList_Adds tím rozdílem, že nezadáte rastrový obrázek masky. Místo toho zadáte barvu, kterou systém kombinuje s rastrovým obrázkem, aby se masky automaticky vygenerovaly. Každý pixel zadané barvy v rastrovém obrázku se změní na černou a odpovídající bit v masce je nastaven na 1. V důsledku toho je každý pixel na obrázku, který odpovídá zadané barvě, průhledný při vykreslení obrázku.

Makro ImageList_AddIcon přidá do seznamu obrázků ikonu nebo kurzor. Pokud je seznam obrázků maskovaný, ImageList_AddIcon přidá masku, která je k dispozici s ikonou nebo kurzorem na rastrový obrázek masky. Pokud je seznam obrázků nemaskovaný, maska ikony nebo kurzoru se při kreslení obrázku nepoužívá.

Ikonu můžete vytvořit na základě obrázku a masky v seznamu obrázků pomocí funkce ImageList_GetIcon. Funkce vrátí popisovač k nové ikoně.

ImageList_Add, ImageList_AddMaskeda ImageList_AddIcon přiřazují index k přidanému obrázku v seznamu obrázků. Indexy jsou založené na nule; to znamená, že první obrázek v seznamu má index nuly, další má index jednoho atd. Po přidání jednoho obrázku vrátí funkce index obrázku. Když se najednou přidá více obrázků, vrátí funkce index prvního obrázku.

Funkce ImageList_Remove odebere obrázek ze seznamu obrázků.

Nahrazení a slučování obrázků

Funkce ImageList_Replace a ImageList_ReplaceIcon nahradí obrázek v seznamu obrázků novou imagí. ImageList_Replace nahradí obrázek rastrovým obrázkem a maskou a ImageList_ReplaceIcon nahradí obrázek ikonou nebo kurzorem.

Funkce ImageList_Merge sloučí dva obrázky a uloží nový obrázek do nového seznamu obrázků. Nový obrázek se vytvoří nakreslením druhého obrázku transparentně nad první. Maska nového obrázku je výsledkem provedení logické operace OR na bitech masek pro oba existující obrázky.

Kreslení obrázků

Pokud chcete nakreslit obrázek, použijte funkci ImageList_Draw nebo ImageList_DrawEx. Určíte popisovač seznamu obrázků, index obrázku, který se má nakreslit, popisovač cílového kontextu zařízení, umístění v kontextu zařízení a jeden nebo více stylů kreslení.

Když zadáte styl ILD_TRANSPARENT, ImageList_Draw nebo ImageList_DrawEx použije k vykreslení maskovaného obrázku dvoustupňový proces. Nejprve provede logickou operaci typu AND na bitech obrázku a masky. Potom provede logickou operaci XOR s výsledky první operace a bity pozadí kontextu cílového zařízení. Tento proces vytvoří průhledné oblasti ve výsledném obrázku; to znamená, že každý bílý bit v masce způsobí, že odpovídající bit ve výsledném obrázku bude průhledný.

Před nakreslením maskovaného obrázku na pozadí plné barvy byste měli použít funkci ImageList_SetBkColor k nastavení barvy pozadí seznamu obrázků na stejnou barvu jako cíl. Nastavení barvy eliminuje potřebu vytvářet průhledné oblasti na obrázku a umožňuje ImageList_Draw nebo ImageList_DrawEx jednoduše zkopírovat obrázek do kontextu cílového zařízení, což vede k významnému zvýšení výkonu. Pokud chcete obrázek nakreslit, zadejte styl ILD_NORMAL ve volání ImageList_Draw nebo ImageList_DrawEx.

Barvu pozadí pro maskovaný seznam obrázků můžete kdykoli nastavit tak, aby se nakreslila správně na libovolném pevném pozadí. Nastavení barvy pozadí na CLR_NONE způsobí, že obrázky se ve výchozím nastavení nakreslují transparentně. Pokud chcete načíst barvu pozadí seznamu obrázků, použijte funkci ImageList_GetBkColor.

Styly ILD_BLEND25 a ILD_BLEND50 stínují obrázek barvou zvýraznění systému. Tyto styly jsou užitečné, pokud použijete maskovaný obrázek k reprezentaci objektu, který může uživatel vybrat. Styl ILD_BLEND50 můžete například použít k nakreslení obrázku, když ho uživatel vybere.

Nemaskovaná image se zkopíruje do kontextu cílového zařízení pomocí rastrové operace SRCCOPY. Barvy na obrázku se zobrazují stejně bez ohledu na barvu pozadí kontextu zařízení. Styly výkresu zadané v ImageList_Draw nebo ImageList_DrawEx také nemají žádný vliv na vzhled nemaskovaného obrázku.

Přetažení obrázků

Rozhraní API Win32 obsahuje funkce pro přetahování obrázku na obrazovce. Funkce přetažení přesunují obrázek hladce, v barvě a bez blikajícího kurzoru. Maskované i nepřemaskované obrázky lze přetáhnout.

Funkce ImageList_BeginDrag zahájí operaci přetažení. Mezi parametry patří popisovač pro seznam obrázků, index obrázku, který bude přetahován, a umístění horkého bodu v obrázku. Aktivní bod je jeden pixel, který funkce přetahování rozpoznají jako přesné umístění obrázku na obrazovce. Aplikace obvykle nastaví aktivní bod tak, aby se shodoval s horkým místem kurzoru myši. Funkce ImageList_DragMove přesune obrázek do nového umístění.

Funkce ImageList_DragEnter nastaví počáteční pozici přetahovaného obrázku v okně a vykreslí obrázek na dané pozici. Parametry zahrnují popisovač okna, ve kterém se má obrázek nakreslit, a souřadnice počáteční pozice v okně. Souřadnice jsou relativní vzhledem k levému hornímu rohu okna, nikoli k oblasti klienta. Totéž platí pro všechny funkce přetahování obrázků, které používají souřadnice jako parametry. To znamená, že při zadávání souřadnic musíte kompenzovat šířky prvků okna, jako jsou ohraničení, záhlaví a řádek nabídek. Pokud při volání ImageList_DragEnterzadáte popisovač okna NULL, funkce přetahování nakreslí obrázek v kontextu zařízení, který je přiřazen k oknu plochy, a souřadnice jsou vztaženy k levému hornímu rohu obrazovky.

Funkce ImageList_SetDragCursorImage vytvoří nový obrázek přetažení zkombinováním daného obrázku (obvykle obrázku kurzoru myši) s aktuálním obrázkem přetažení. Vzhledem k tomu, že funkce přetažení používají nový obrázek během operace přetažení, měli byste použít funkci ShowCursor skrýt skutečný kurzor myši po volání ImageList_SetDragCursorImage. Jinak se může zdát, že systém má po dobu trvání operace přetažení dva kurzory myši.

Když aplikace volá ImageList_BeginDrag, systém vytvoří dočasný interní seznam obrázků a potom zkopíruje zadaný obrázek přetažení do interního seznamu. Úchyt můžete načíst do dočasného seznamu obrázků přetažení pomocí funkce ImageList_GetDragImage. Funkce také získává aktuální pozici přetažení a posun přetahovaného obrázku vzhledem k pozici přetažení.

Informace o obrázku

Existuje několik funkcí, které načítají informace ze seznamu obrázků. Funkce ImageList_GetImageInfo vyplní strukturu IMAGEINFO informacemi o jednom obrázku, včetně úchytů obrázku a rastrových obrázků masky, počtu barevných rovin a bitů na pixel a ohraničujícího obdélníku obrázku v rastrovém obrázku. Tyto informace můžete použít k přímé manipulaci s rastrovými obrázky obrázku. Funkce ImageList_GetImageCount načte počet obrázků v seznamu obrázků.

Překryvné obrázky

Každý seznam obrázků obsahuje seznam indexů, které se mají použít jako překryvy. Překrytí je obrázek nakreslený transparentně přes jiný obrázek. Libovolný obrázek, který je aktuálně v seznamu obrázků, lze použít jako překryv. Pro každý seznam obrázků můžete zadat až čtyři překryvy. Tento limit byl rozšířen na 15 ve verzi 4.71.

Index obrázku přidáte do seznamu překryvů pomocí funkce ImageList_SetOverlayImage, zadáním úchytu seznamu obrázků, indexu existujícího obrázku a požadovaného indexu překryvu. To v důsledku toho seznam obrázků informuje, že "obrázek v indexu x lze použít jako překryv a chci na něj odkazovat jako překryvný index y." Překryvné indexy mají číslo začínající jedničkou místo nulou, protože překryvný index nuly znamená, že nebude použito žádné překrytí.

Při kreslení obrázku pomocí funkce ImageList_Draw nebo ImageList_DrawEx určíte překrytí. Překryv je určen provedením logické operace NEBO mezi požadovanými příznaky výkresu a výsledkem makra INDEXTOOVERLAYMASK. Makro INDEXTOOVERLAYMASK převezme překryvný index a formátuje ho pro zahrnutí s příznaky pro tyto funkce. Tím nakreslíte obrázek se zadaným překrytím. Následující příklad ukazuje, jak je překryv přidán a specifikován při kreslení obrázku.

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

Tím nakreslíte obrázek 1 a pak ho překryjte obrázkem 0. Protože 3 je překryvný index, který jste zadali ve volání ImageList_SetOverlayImage, je 3 umístěn v makru INDEXTOOVERLAYMASK.

32bitové antialiasované ikony

Antialiasing je technika pro změkčení nebo rozostření ostrých hran. Díky tomu budou obrázky přirozenější. Seznamy obrázků v systémech Windows Vista a Windows 7 podporují použití 32bitových antialiased ikon a rastrových obrázků. Hodnoty barev používají 24 bitů a 8 bitů se používají jako alfa kanál na ikonách. Pokud chcete vytvořit seznam obrázků, který dokáže zpracovat 32 bitů na pixel (bpp), zavolejte funkci ImageList_Create a předejte příznak ILC_COLOR32.

Pokud chcete správně vytvořit 32bitové ikony, musíte pro každou ikonu vytvořit více obrázků, jak je znázorněno na následujícím obrázku.

obrázek znázorňující tři velikosti ikon pro každou ze tří barevných hloubk

  • První tři obrázky jsou v 16barevném režimu pro použití v nouzovém režimu.
  • Další tři ikony se používají v barevném režimu 256.
  • Poslední tři ikony mají alfa kanál a lze je použít pouze v operačních systémech s 24bitovou barvou nebo vyšší.
  • Záleží na pořadí obrázků ve formátu ikony. Pokud je pořadí nesprávné, starší verze Windows fungují špatně při extrahování ikon. Nesprávné extrahování ikon může způsobit poškození paměti a nesprávné vykreslování.
  • Předchozí verze Windows měly limit 10 ikon.

Poznámka

Pomocí nástrojů třetích stran můžete generovat soubory ikon a rastrové obrázky, které obsahují alfa kanál. Pokud použijete LoadImage k načtení rastrového obrázku 32 bpp, který obsahuje alfa, musíte zadat příznak LR_CREATEDIBSECTION.