Tudnivalók a képlistákról
A képlista ugyanolyan méretű képek gyűjteménye, amelyekre az index hivatkozhat. A rendszerképlisták nagy méretű ikonok vagy bitképek hatékony kezelésére szolgálnak. A képlistában szereplő összes kép egyetlen, széles bitképben, képernyőeszköz-formátumban található. A képlisták tartalmazhatnak egy monokróm bitképet is, amely a képek transzparens rajzolásához használt maszkokat (ikonstílust) tartalmaz.
A Microsoft Win32 API képlistafüggvényeket és makrókat biztosít, amelyek lehetővé teszik képlisták létrehozását és megsemmisítését, képek hozzáadását és eltávolítását, képek cseréjét és egyesítése, képek rajzolása és húzása. A képlistafüggvények használatához adja meg a közös vezérlő fejlécfájlt a forráskódfájlokban, és csatolja a közös vezérlő exportáló könyvtárát. Ezenkívül a képlistafüggvények meghívása előtt használja az InitCommonControls vagy InitCommonControlsEx függvényt a közös vezérlő DLL betöltésének biztosításához.
Ebben a szakaszban a következő témaköröket tárgyaljuk:
- típusok
- Képlisták létrehozása és megsemmisítése
- Képek hozzáadása és eltávolítása
- Képek cseréje és egyesítése
- Rajzképek
- Képek húzása
- Képinformáció
- képátfedések
- 32 bites antialiased ikonok
Típusok
Kétféle képlistát különböztetünk meg: maszkolt és nem maszkolt. A nem maszkolt képlista egy színes bitképből áll, amely egy vagy több képet tartalmaz. A maszkolt képlista két azonos méretű bitképből áll. Az első egy színes bitkép, amely tartalmazza a képeket, a második pedig egy monokróm bitkép, amely maszkok sorozatát tartalmazza – az egyik az első bitkép minden képéhez.
Nem maszkolt kép rajzolásakor a rendszer egyszerűen átmásolja a céleszköz környezetébe; vagyis az eszközkörnyezet meglévő háttérszíne fölé lesz rajzolva. Maszkolt kép rajzolásakor a rendszer a kép bitjait a maszk bitjeivel kombinálja, általában áttetsző területeket hoz létre a bittérképen, ahol a céleszköz-környezet háttérszíne látható. A maszkolt képek rajzolásakor számos rajzstílus adható meg. Megadhatja például, hogy a rendszerkép el legyen osztva egy kijelölt objektum jelzéséhez.
Képlisták létrehozása és megsemmisítése
A ImageList_Create függvény meghívásával képlistát hozhat létre. A paraméterek közé tartozik a létrehozandó képlista típusa, az egyes képek méretei és a listához hozzáadni kívánt képek száma. Nem maszkolt képlista esetén a függvény egyetlen bitképet hoz létre, amely elég nagy ahhoz, hogy az adott dimenziók megadott számú képét tartsa. Ezután létrehoz egy képernyőkompatibilis eszközkörnyezetet, és kiválasztja a benne lévő bitképet. Maszkolt képlista esetén a függvény két bitképet és két képernyőkompatibilis eszközkörnyezetet hoz létre. Kiválasztja a kép bitképét az egyik eszközkörnyezetbe, a maszk bitképét pedig a másikba. A közös vezérlő DLL tartalmazza a képlistafüggvények végrehajtható kódját.
A ImageList_Createmegadhatja a képlistában szereplő képek kezdeti számát, valamint azt, hogy hány képpel nőhet a lista. Így ha az eredetileg megadottnál több képet próbál hozzáadni, a képlista automatikusan nő az új képek elhelyezéséhez.
Ha ImageList_Create sikeres, visszaad egy fogantyút a HIMAGELIST típushoz. A fogantyút más kép lista függvényekben használhatja a képlista eléréséhez és a képek kezeléséhez. Képeket vehet fel és távolíthat el, képeket másolhat az egyik képlistáról a másikba, és egyesítheti a képeket két különböző képlistából. Ha már nincs szüksége képlistára, megsemmisítheti, ha megadja a leíróját a ImageList_Destroy függvény hívásában.
Képek hozzáadása és eltávolítása
Bitképeket, ikonokat vagy kurzorokat is hozzáadhat egy képlistához. A ImageList_Add függvény hívásában a két bitkép fogópontjainak megadásával adhat hozzá bitképeket. Az első bitkép egy vagy több képet tartalmaz a kép bitképéhez, a második bitkép pedig a maszk bitképéhez hozzáadni kívánt maszkokat. Nem maszkolt képlisták esetén a második bitképfogópont figyelmen kívül van hagyva; be lehet állítani NULL -ra.
A ImageList_AddMasked függvény bitképeket is hozzáad egy maszkolt képlistához. Ez a függvény hasonló a ImageList_Addfüggvényhez, azzal a kivételrel, hogy nem ad meg maszkbitképet. Ehelyett meg kell adnia egy színt, amelyet a rendszer a kép bitképével kombinálva automatikusan létrehozza a maszkokat. A kép bitképében megadott szín minden egyes képpontja fekete színűre változik, a maszk megfelelő bitje pedig 1. Ennek eredményeképpen a kép minden olyan képpontja, amely megfelel a megadott színnek, átlátszó lesz a kép rajzolásakor.
A ImageList_AddIcon makró ikont vagy kurzort ad hozzá egy képlistához. Ha a képlista maszkolt, ImageList_AddIcon hozzáadja az ikonnal vagy kurzorral ellátott maszkot a maszk bitképéhez. Ha a képlista nem maszkolt, az ikon vagy a kurzor maszkja nem használható a kép rajzolásakor.
A ImageList_GetIcon függvénnyel kép és maszk alapján hozhat létre ikont a képlistában. A függvény visszaadja a fogópontot az új ikonnak.
ImageList_Add, ImageList_AddMaskedés ImageList_AddIcon indexet rendelnek az egyes képekhez, amikor azokat hozzáadják egy képlistához. Az indexek nulla alapúak; vagyis a lista első képe nulla, a következő pedig egy indexet tartalmaz, és így tovább. Egyetlen kép hozzáadása után a függvények visszaadják a kép indexét. Ha egyszerre több képet ad hozzá, a függvények az első kép indexét adnak vissza.
A ImageList_Remove függvény eltávolít egy képet egy képlistáról.
Képek cseréje és egyesítése
A ImageList_Replace és ImageList_ReplaceIcon függvények lecserélik a képlistában lévő képeket egy új képre. ImageList_Replace lecserél egy képet egy bitképre és maszkra, míg ImageList_ReplaceIcon egy képet ikonra vagy kurzorra cserél le.
A ImageList_Merge függvény két képet egyesít, és az új képet egy új képlistában tárolja. Az új kép úgy jön létre, hogy a második képet transzparensen az elsőre rajzolja. Az új kép maszkja egy logikai VAGY művelet végrehajtásának eredménye a két meglévő lemezkép maszkjainak bitjén.
Rajzképek
Kép rajzolásához használja a ImageList_Draw vagy ImageList_DrawEx függvényt. Megadhatja a fogópontot egy képlistához, a rajzolni kívánt kép indexét, a céleszköz környezetéhez tartozó fogópontot, az eszközkörnyezeten belüli helyet és egy vagy több rajzstílust.
A ILD_TRANSPARENT stílus megadásakor ImageList_Draw vagy ImageList_DrawEx kétlépéses eljárással rajzol egy maszkolt képet. Először egy logikai ÉS műveletet hajt végre a kép és a maszk bitjein. Ezután végrehajt egy logikai XOR műveletet az első művelet eredményein és a céleszköz-környezet háttérbitjén. Ez a folyamat transzparens területeket hoz létre az eredményként kapott képen; ez azt jelenti, hogy a maszkban lévő minden fehér bit transzparens lesz az eredményként kapott kép megfelelő bitje.
Mielőtt maszkolt képet rajzolna egy egyszínű háttérre, a ImageList_SetBkColor függvénnyel állítsa a képlista háttérszínét a cél hátterének színére. A szín beállítása szükségtelenné teszi a kép áttetsző területeinek létrehozását, és lehetővé teszi, hogy ImageList_Draw vagy ImageList_DrawEx egyszerűen másolja a képet a céleszköz környezetére, ami jelentős teljesítménynövekedést eredményez. A kép rajzolásához adja meg a ILD_NORMAL stílust a ImageList_Draw vagy ImageList_DrawExhívásában.
A maszkolt képlisták háttérszínét bármikor beállíthatja, hogy az megfelelően rajzoljon bármilyen szilárd háttérre. Ha a háttérszínt CLR_NONE állítja be, a képek alapértelmezés szerint transzparensen lesznek rajzolva. A képlista háttérszínének lekéréséhez használja a ImageList_GetBkColor függvényt.
A ILD_BLEND25 és a ILD_BLEND50 stílusok a rendszerkiemelés színével árnyalják a képet. Ezek a stílusok akkor hasznosak, ha maszkolt képet használ egy olyan objektum ábrázolásához, amelyet a felhasználó kiválaszthat. Például a ILD_BLEND50 stílus használatával rajzolhatja meg a képet, amikor a felhasználó kiválasztja.
A rendszer az SRCCOPY raszterművelettel átmásol egy nem maszkolt képet a céleszköz környezetére. A kép színei az eszközkörnyezet háttérszínétől függetlenül ugyanúgy jelennek meg. A ImageList_Draw vagy ImageList_DrawEx megadott rajzstílusok szintén nem befolyásolják a nem maszkolt képek megjelenését.
Képek húzása
A Win32 API függvényeket tartalmaz egy kép képernyőre húzására. A húzási függvények zökkenőmentesen, színben és a kurzor villogása nélkül mozgatják a képet. A maszkolt és a maszkolatlan képek is húzhatók.
A ImageList_BeginDrag függvény húzási műveletet kezd. A paraméterek közé tartozik a képlistához tartozó fogópont, a húzandó kép indexe, valamint a forró pont helyzetét a képen. A forró pont egyetlen képpont, amelyet a húzófüggvények a kép pontos képernyőhelyeként ismernek fel. Az alkalmazás általában úgy állítja be a gyakori elérésű helyet, hogy az egybeessen az egérmutató gyakori elérésű pontjával. A ImageList_DragMove függvény áthelyezi a képet egy új helyre.
A ImageList_DragEnter függvény beállítja a húzási kép kezdeti pozícióját egy ablakban, és a képet a pozícióba rajzolja. A paraméterek közé tartozik az ablakhoz tartozó fogópont, amelyben megrajzolhatja a képet, valamint az ablak kezdeti pozíciójának koordinátáit. A koordináták az ablak bal felső sarkához vannak viszonyítva, nem az ügyfélterülethez. Ugyanez igaz az összes olyan képhúzási függvényre, amely paraméterekként veszi fel a koordinátákat. Ez azt jelenti, hogy a koordináták megadásakor kompenzálnia kell az ablakelemek szélességét, például a szegélyt, a címsort és a menüsávot. Ha NULL ablakfogantyút ad meg ImageList_DragEnterhívásakor, a húzási függvények az asztali ablakhoz társított eszközkörnyezetben rajzolják meg a képet, a koordináták pedig a képernyő bal felső sarkához viszonyítva.
A ImageList_SetDragCursorImage függvény új húzási képet hoz létre az adott kép (általában egérmutató képe) és az aktuális húzási kép kombinálásával. Mivel a húzási függvények egy húzási művelet során az új képet használják, a ShowCursor függvénnyel elrejtheti a tényleges egérmutatót a ImageList_SetDragCursorImagehívása után. Ellenkező esetben előfordulhat, hogy a rendszer két egérmutatóval rendelkezik az húzási művelet időtartamára.
Amikor egy alkalmazás meghívja ImageList_BeginDrag, a rendszer létrehoz egy ideiglenes belső rendszerképlistát, majd átmásolja a megadott húzási képet a belső listára. A ImageList_GetDragImage függvénnyel lekérheti a fogópontot az ideiglenes húzási képlistára. A függvény az aktuális húzási pozíciót és a húzási kép eltolását is lekéri a húzási pozícióhoz képest.
Képadatok
Több függvény is lekéri az adatokat egy képlistáról. A ImageList_GetImageInfo függvény egy IMAGEINFO struktúrát tölt ki egyetlen képre vonatkozó információkkal, beleértve a kép fogópontjait és a maszk bitképeit, a képpontonkénti színsíkok és bitek számát, valamint a kép határoló téglalapját a kép bitképén belül. Ezekkel az információkkal közvetlenül módosíthatja a kép bitképeit. A ImageList_GetImageCount függvény lekéri a képlistában lévő képek számát.
Képátfedések
Minden képlista tartalmazza az átfedésként használandó indexek listáját. Az átfedés egy olyan kép, amely transzparensen rajzolódik egy másik kép fölé. A képlistában jelenleg szereplő képek átfedésként használhatók. Képlistánként legfeljebb négy átfedés adható meg. Ez a korlát a 4.71-es verzióban 15-ösre bővült.
A kép indexét a ImageList_SetOverlayImage függvénnyel adhatja hozzá az átfedések listájához, megadva a fogantyút a képlistához, a meglévő kép indexét és a kívánt átfedési indexet. Ez tulajdonképpen azt jelzi a képlistának, hogy "az indexben lévő kép x használható átfedésként, és átfedő indexként szeretném hivatkozni az átfedési indexre y." Az átfedési indexek nem nullán, hanem egy-alapúak, mivel a nullát átfedő index azt jelenti, hogy a rendszer nem használ átfedést.
Ha egy képet a ImageList_Draw vagy ImageList_DrawEx függvénnyel rajzol, átfedést kell megadnia. Az átfedés egy logikai VAGY művelet végrehajtásával van megadva a kívánt rajzjelölők és a INDEXTOOVERLAYMASK makró eredménye között. Az INDEXTOOVERLAYMASK makró az átfedési indexet használja, és formázza a függvények zászlóival való felhasználásra. Ezzel megrajzolja a képet a megadott átfedéssel. Az alábbi példa bemutatja, hogyan lesz hozzáadva és meghatározva egy átfedés a kép rajzolásakor.
ImageList_SetOverlayImage(himl, 0, 3);
ImageList_Draw(himl, 1, hdc, 0, 0, ILD_MASK | INDEXTOOVERLAYMASK(3));
Ez az 1. képet rajzolja meg, majd a 0. képpel fedi át a képet. Mivel a 3 az ImageList_SetOverlayImage hívásban megadott átfedési index, a 3 a INDEXTOOVERLAYMASK makróba kerül.
32 bites simított ikonok
Az antialiasing az éles élek lágyítására vagy elmosására szolgáló technika. Ez természetesebb megjelenést kölcsönöz a képeknek. A Windows Vista és a Windows 7 rendszerképlistái támogatják a 32 bites antialiased ikonok és bitképek használatát. A színértékek 24 bitet használnak, és 8 bitet használnak alfa csatornaként az ikonokon. Ha olyan képlistát szeretne létrehozni, amely képes kezelni a képpontonként 32 bites (bpp) képet, hívja meg a ImageList_Create függvényt, és adja át a ILC_COLOR32 jelölőt.
A 32 bites ikonok helyes létrehozásához minden ikonhoz több képet kell létrehoznia, ahogyan az alábbi ábrán is látható.
- Az első három kép 16 színben használható csökkentett módban.
- A következő három ikont 256 szín módban használja a rendszer.
- Az utolsó három ikon az alfa csatornával rendelkezik, és csak 24 bites vagy magasabb színnel rendelkező operációs rendszerekben használható.
- Az ikonformátumban lévő képek sorrendje nem számít. Ha a sorrend helytelen, a Windows régebbi verziói rosszul működnek az ikonok kinyerésekor. Az ikonok helytelen kinyerése memóriasérülést és nem megfelelő renderelést okozhat.
- A Windows korábbi verzióinak 10 ikonos erőforráskorlátja volt.
Jegyzet
Külső eszközökkel hozhat létre alfacsatornát tartalmazó ikonfájlokat és bitképeket. Ha a LoadImage segítségével egy olyan 32 bpp bitképet tölt be, amely alfát tartalmaz, meg kell adnia az LR_CREATEDIBSECTION jelzőt.