6. Erőforrások használata (Using resources)
2014.06.04. 22:15
Bevezetés: Olvassunk függeléket az erőforrásokról :)
Ez megint inkább elméleti dolog lesz, nem kell hozzá fordítgatni.
Az erőforrások a futtatható állományban (.exe) tárolt bináris adatok. Létrehozhatunk ún. erőforrás-scriptet. Ezt az elterjedt vizuál stílusú fordítók el is készítik nekünk anélkül hogy hozzá kellene nyúlnunk. Ha az általunk használt fordító mégsem képes erre, akkor nincs más, kézzel kell szerkesztenünk. Sajnos az egyes fordítók eltérően kezelik az erőforrásokat. Megpróbálunk a közös vonások alapján haladni.
Az erőforrás szerkesztők (ide értve a MSVC++ is) nagyon nehézzé teszik az erőforrás fájl kézi szerkesztését, mert kikényszerítik egy saján formátum használatát. Pedig olykor nagyon hasznos lehet, ha magunk is bele tudunk nyúlni. Másik kellemetlenség, hogy az MSVC++ mindeképpen resource.h névvel illeti, még akkor is, ha másképpen akarnánk. Az egyszerűség kedvéért ezt fogjuk használni, de a függelékben láthatjuk majd, hogy mi kell változtatni.
Előszőr is egy egyszerű belépő: Ikon.
#include "resource.h" IDI_MYICON ICON "my_icon.ico"
Ennyi az egész fájl. Az IDI_MYICON egy azonosító, az ICON a fájl típusa, az idézőjeles pedig maga az ikon elérési útja. Ennek minden fordítóval működnie kell.
Most akkor mi van ezzel az #include-dal? Programunknak szüksége van arra, hogy azonosítsa az ikont, ennek legegyszerűbb módja egy egyedi azonosító (IDI_MYICON) bevezetése. Ezt megtehetjük ha létrehozzuk a resource.h fájlt, és beinclude-oljuk az erőforrás scriptbe, és a forrásfájlba is.
#define IDI_MYICON 101
Mint látható, az IDI_MYICON-hoz hozzárendeltük a 101 értéket. Ahol tehát hivatkozunk az IDI_MYICON-ra, az ugyanaz, mintha beírnánk a 101-et. Mégis, sokkal könnyebb megjegyezni egy beszédes nevet mint a számot. Ha pedig valamiért később módosítani kell az értékét, akkor elég egyetlen helyen megtenni, nem kell a programban keresgélni.
Most mondjuk hogy adjunk hozzá egy MENU erőforrást!
#include "resource.h" IDI_MYICON ICON "my_icon.ico" IDR_MYMENU MENU BEGIN POPUP "&File" BEGIN MENUITEM "E&xit", ID_FILE_EXIT END END
Az IDI_MYMENU a menü neve, a MENU pedig a típusa. Vegyük észre, hogy szerepel két BEGIN - END páros. Néhány fordító '{' jelet használ a BEGIN, és '}' jelet az END helyett. Olyan is van, hogy mindkettővel működik. Ezt ki kell tapasztalni, és aszerint használni. Természetesen ha mindkettőt tudja, akkor szabadon választható, hogy melyik legyen.
Használtunk egy új konstanst, ID_FILE_EXIT néven. Ilyen még nincs, ezért létre kell hozni.
#define IDI_MYICON 101 #define ID_FILE_EXIT 4001
Nagyobb projekteknél már jó macerás ezt mind kézzel csinálni, ezért legtöbben rábízzák ezt a szerkesztőjükre. Mégis, ennek ellenére előfordul hogy valami összeugrik, és akkor lehet kézzel kotorászni a bugyraiban. De legalább lehet.
Most nézzünk egy példát arra, hogy hogyan használjuk az erőforrásunkat.
HICON hMyIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYICON));
A LoadIcon() első paramétere a példány-handler (hInstance), ami a WinMain()-tól érkezik, és a GetModuleHandler() segítségével használható amint azt már néztük. A második paraméter az erőforrás azonosítója. De mi a retek az a MAKEINTRESOURCE?!? Egyik módja az azonosításnak az "ID" használata, ahogyan azt most tettük, ekkor a MAKEINTRESOURCE csinál LPCTSTR-t az UINT-ből. Többnyire ehelyett az alábbi formát szokás használni, itt közvetlenül a sztring azonosít.
HICON hMyIcon = LoadIcon(hInstance, "MYICON");
A LoadIcon(), és más erőforrás töltő API-k meg tudják különböztetni az INT típust a sztringre mutató pointertől. Megnézi az érték felső szavát (HI WORD), és ha ez nulla, akkor ID-ről van szó (ez azt is jelenti, hogy 65536 ID-t lehet használni). Ha nem nulla, akkor egy sztringet címző mutató.
Hát ezen is túl vagyunk :)
A bejegyzés trackback címe:
Kommentek:
A hozzászólások a vonatkozó jogszabályok értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a Felhasználási feltételekben és az adatvédelmi tájékoztatóban.