HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Áttetsző menü megjelenítése


Példaprogram letöltése

4472 bájt

A Windows 2000 verziótól kezdődően van lehetőségünk arra, hogy az alkalmazások ablakait, vagy azok kontroljait áttetszően jelenítsük meg. Megtehetjük ezt az alkalmazásban létrehozott menükkel is, csupán a megfelelő metódushívásokra van szükségünk. Hogy melyek ezek a metódusok, és hogyan végezhető el velük a művelet, megtudható a cikkből.

A megoldás lényege, hogy mielőtt a menüt megjelenítjük, a megjelenítésre utasítást adó üzenet megérkezése előtt módosítjuk a menü áttetszőségét. Ennek megvalósítására a SetWindowsHookEx metódust használjuk fel, mellyel az alkalmazás indulásakor regisztrálunk egy HOOK eljárást az alkalmazásunkhoz. Az itt megadott hook függvény minden menümegjelenítés előtt meghívódik, és beállítja a megfelelő áttetszőséget, melyet a Form-on található TTrackBar komponenssel állíthatunk be.
A regisztráció előtt a GetWindowThreadProcessId metódussal lekérdezzük a process azonosítóját, mely az adott ablakot létrehozza. Ehhez a folyamathoz regisztráljuk a hook eljárást.
tpid := GetWindowThreadProcessId(Handle, nil);
hHookID := SetWindowsHookEx(WH_CALLWNDPROC, HookProc, 0, tpid);
A SetWindowHookEx függvény első paraméterében határozzuk meg WH_CALLWNDPROC konstanssal, hogy az ablaknak küldött üzenetek érkezése előtt fusson le a második paraméterben megadott függvény.
A program végén a regisztrációt töröljük.
if (hHookID <> 0) then UnhookWindowsHookEx(hHookID);
A HookProc metódusban mindig meghívásra kerül a MakeTransparent függvényünk, mely a paraméterként megadott ablak, jelen esetben a menü áttetszőségét állítja a második paraméterben magadott értékre. Az érték 0 és 100 közötti értékeket vehet fel.
A áttetszőséget a SetLayeredWindowAttributes metódussal állítjuk be, melynek deklarációja a következő:
function SetLayeredWindowAttributes(
hwnd: HWND; crKey: COLORREF; bAlpha: Byte; dwFlags: Longint
): Longint;
Beállítja a megadott ablakkezelővel rendelkező objektum áttetszőségét.
Paraméterek
hwnd: HWND
Az objektum ablakkezelője.
crKey: COLORREF
Megadható egy színobjektum-mutató, melynek funkciója meghatározni, hogy mely színnel rendelkező pixelek legyenek áttetszők. Ez most a példánkban nulla.
bAlpha: Byte
Az áttetszőséget meghatározó érték.
dwFlags: Longint
Megadható egy konstanssal, hogy a második vagy a harmadik paraméterben megadott érték legyen figyelembe véve a műveletnél. Ez most LWA_ALPHA, mely meghatározza, hogy az áttetszőséget adjuk meg egy számmal.
Visszatérési érték
Ha a művelet hiba nélkül zajlott le, akkor a visszatérési érték nem nulla.
A metódusban elsőként létrehozunk egy függvénytípust a SetLayeredWindowAttributes metódushoz.
type
  TSetLayeredWindowAttributes = function(hwnd: HWND; crKey: COLORREF; bAlpha: Byte; dwFlags: Longint): Longint; stdcall;
A következő lépés, hogy betöltjük a USER32.DLL-t, majd meghatározzuk a fenti metódus címét.
hUser32 := GetModuleHandle('USER32.DLL');
if hUser32 <> 0 then begin
  @SetLayeredWindowAttributes := GetProcAddress(hUser32,'SetLayeredWindowAttributes');
  ...
Nincs más hátra, mint beállítani a menü megjelenítésének stílusát, majd meghívni a SetLayeredWindowAttributes metódust.
SetWindowLong(Wnd, GWL_EXSTYLE, GetWindowLong(Wnd, GWL_EXSTYLE) or WS_EX_LAYERED);
SetLayeredWindowAttributes(Wnd, 0, Trunc((255 / 100) * (100 - nAlpha)), LWA_ALPHA);
Amikor valamely menüpontra kattintunk, akkor a megjelenő menü még nem transzparens. Az egeret a következő menüpontra mozgatva viszont a menü már transzparensen gördül le.

Könyv
Ez a cikk megtalálható ebben a könyvben: Delphi Software Offline 2003 évkönyv 753. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |