Delphi - Bmp képek elhelyezése a menüben

forráskód letöltése
Ha szeretnénk egészen egyedi kinézetű menüket készíteni, lehetőségünk van arra, hogy szöveg helyett képeket helyezzünk el az egyes menüpontokban. Ezekkel azután ugyanolyan műveleteket végezhetünk, mint a hagyományos szöveges menükkel, így kijelölhetjük, letilthatjuk, engedélyezhetjük azokat. A mai cikkben azt mutatjuk be, hogyan is kell az ilyen menüket létrehozni.
Létezik egy ModifyMenu nevű Windows függvény, ami lehetőséget biztosít számunkra, hogy a programunkban felhasznált menük tulajdonságait megváltoztathassuk. Felépítése a következő:
ModifyMenu
BOOL ModifyMenu(
HMENU hMnu,
UINT uPosition,
UINT uFlags,
PTR uIDNewItem,
LPCTSTR lpNewItem
);
Paraméterek
HMENU hMnu
Annak a menünek az azonosítója, amelynek a tulajdonságát meg szeretnénk változtatni.
UINT uPosition
Annak a menu item-nek a megnevezése, melyet az uFlags paraméterben meghatározott módon szeretnénk megváltoztatni.
UINT uFlags
Flag-eket specifikál, melyek az uPosition paraméterben megadott menu item tulajdonságaihoz engednek hozzáférést. Ennek értéke az első két flag közül az egyik, illetve a többi flag közül legalább egynek a kombinációja kell, hogy legyen:
MF_BYCOMMAND Azt jelzi, hogy a menu item az uPosition paraméterben név szerint lett azonosítva. Ez a flag az alapértelmezett, amennyiben sem ezt, sem az MF_BYPOSITION flag-et nem specifikáljuk.
MF_BYPOSITION Azt jelzi, hogy az uPosition paraméterben a menu item pozíciója lett megadva. Ez a pozíciószám a menü zéró-pontjától számított érték.
MF_BITMAP Bitkép használata almenüként. Az lpNewItem paraméter tartalmazza a bitkép handle-jét.
MF_CHECKED Egy kijelölés jelet (checkmark) helyez el a menüelem mellett.
MF_DISABLED Letiltja a menüelem használatát. Nem lehet azt kiválasztani, de nem szürkül be.
MF_ENABLED Engedélyezi a menüelem használatát és megszünteti annak szürke állapotát.
MF_GRAYED Letiltja a menüelemet és beszürkíti azt. Bitképek esetén nem működik.
MF_MENUBARBREAK Drop-down menü, sub menü, vagy shortcut menü esetén az újonnan létrejött menüoszlop egy függőleges vonallal el lesz választva a régi menüoszloptól.
MF_MENUBREAK Az új menüelemet egy új sorba vagy új oszlopba helyezi (drop-down menü, sub menü vagy shortcut menü esetén) elválasztó jel nélkül.
MF_OWNERDRAW Azt jelzi, hogy saját készítésű menüelemről van-e szó. Mielőtt a menü először megjelenítésre kerülne, az ablak, amelyen a menü van, kap egy WM_MEASUREITEM üzenetet, hogy a menü szélességét és hosszát határozza meg. Ezután egy WM_DRAWITEM üzenetben értesíti az ablakot kirajzoló eljárást a paraméterekről.
MF_POPUP Azt jelzi, hogy a menü elem egy drop-down vagy sub menüt nyit meg. Az uIDNewItem paraméter specifikálja a drop-down vagy sub menü handle-jét. Ez a flag arra használható, hogy megnevezést adjunk annak a menüelemnek, amely az előbb felsorolt almenük egyikét megnyitja.
MF_SEPARATOR Egy vízszintes elválasztó vonalat rajzol két menüelem közé. Az lpNewItem és uIDNewItem paramétereket ekkor figyelmen kívül hagyjuk.
MF_STRING Azt jelzi, hogy a specifikált menüelem szöveget tartalmaz. Az lpNewItem paraméter a string-re mutató pointer.
MF_UNCHECKED Megszünteti egy menüelem kijelölését.
PTR uIDNewItem
A módosított menüelem nevét specifikálja, vagy MF_POPUP flag esetén, a drop-down menü vagy a sub menü handle-jét.
LPCTSTR lpNewItem
A megváltoztatott menüelem tartalmára mutató pointer. Ennek értéke attól függ, hogy az uFlag paraméterben az MF_BITMAP, MF_OWNERDRAW és MF_STRING közül melyik szerepel.
Visszatérési érték
Amennyiben a függvény futása sikeres volt, egy nem nulla értéket kapunk eredményként, ellenkező esetben nullát.
Megjegyzés
Az uFlag paraméterben a következő kombinációkat nem lehet alkalmazni:
  • MF_BYCOMMAND és MF_BYPOSITION
  • MF_DISABLED, MF_ENABLED, és MF_GRAYED
  • MF_BITMAP, MF_STRING, MF_OWNERDRAW, és MF_SEPARATOR
  • MF_MENUBARBREAK és MF_MENUBREAK
  • MF_CHECKED és MF_UNCHECKED
Ezek után lássuk, hogyan alkalmazhatjuk mindezt a programunkban. Először is egy MainMenu komponenst helyezünk a Form-ra, amit átnevezünk BmpMainMenu-re. Ezután létrehozunk egy almenüt, hat menüelemmel. Ezeket sorra NumberOne, NumberTwo… NumberSix-nek nevezzük el. Az almenü második eleméhez készítünk egy újabb almenüt, melyben három elemet hozunk létre. Ezeket SubOne… SubThree-nek nevezzük el. Most lássuk a programkódunkat:
Létrehozunk egy bitmap objektumot, melybe betöltjük a képünket.
  bmp:=TBitmap.Create;
  bmp.LoadFromFile('animare1.bmp');
Meghívjuk a ModifyMenu függvényt. Első paraméterben a főmenü handle-jét adjuk meg, másodikként a módosítandó menüelem nevét, harmadikként azt jelezzük, hogy bitképet szeretnénk elhelyezni benne, a negyedik paraméterbe a módosított menüelem neve kerül, míg az ötödikbe a bitkép handle-jére mutató pointer.
  ModifyMenu(BmpMainMenu.Handle,NumberOne.Command,MF_BYCOMMAND or
    MF_BITMAP,NumberOne.Command,pointer(bmp.Handle));
Ezt a három lépést végezzük el minden egyes menüelem esetében. Az uFlag paraméterben megadható flag-ekkel más-más tulajdonságú menüelemet hozhatunk létre. Esetünkben például a negyedik menüelem elé egy kijelölő jelet helyeztünk, az MF_CHECKED flag segítségével.
  bmp:=TBitmap.Create;
  bmp.LoadFromFile('animare1.bmp');
  ModifyMenu(BmpMainMenu.Handle,NumberFour.Command,MF_CHECKED or
   MF_BITMAP,NumberFour.Command,pointer(bmp.Handle));
Hasonlóképpen az ötödik menüelemet letiltottuk az MF_DISABLED, míg a hatodikat beszürkítettük az MF_GRAYED flag segítségével. Ez utóbbi esetében, mivel bitkép van a menüben, csak a letiltás működik, a szürkítés nem.
További almenük esetében a fentiekhez hasonló módon járunk el.