HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Tetszőleges komponens elhelyezése a Tálcán


Példaprogram letöltése

8636 bájt

A Windows TaskBar (Tálca) az Explorer verzióival együtt fejlődve egyre több szolgáltatást nyújt. A TaskBar több részből áll, amelyek különböző funkciókat látnak el. Ebben a példában azt oldjuk meg, hogy egy általunk létrehozott komponenst, legyen az gomb, ListBox, vagy bármi más, elhelyezzük a TaskBar adott pozíciójába. A cikkből az is kiderül, hogy hogyan tudjuk a komponenst a Start gomb mellé, vagy a tálca más helyeire, például az órát és a Tray ikonokat tartalmazó részbe helyezni.

Az, hogy egy komponens hol jelenik meg attól függ, hogy milyen ablak van megadva „szülőként”. A szülő nem feltétlenül azonos a komponens létrehozójával (Owner). Egy komponens szülőjét megadhatjuk a Parent property-ben, de mivel ez egy TWinControl objektumot vár, ezért ez nem mindig lehetséges. Használhatjuk viszont a SetParent API függvényt a szülő ablak megadására, mivel itt csak az ablak leírójára van szükség (HWND).
A feladat tehát az, hogy megkeressük a TaskBar ablakának leíróját. Ezt egyszerűen megkaphatjuk a FindWindow függvény használatával.
FindWindow
function FindWindow(
lpClassName,
lpWindowName: PChar
): HWND; stdcall;
Ha egy létező ablak leírójára van szükségünk, akkor használhatjuk ezt a függvényt annak lekérdezésére.
Paraméterek
lpClassName
Ebben a paraméterben kell megadnunk az ablak osztályának nevét.
lpWindowName: PChar
Ha nem tudjuk az ablak osztályának nevét, akkor az ablak nevét is megadhatjuk ebben a paraméterben.
A két paraméter közül elég csak az egyiket megadnunk, ekkor a másik paraméterben adjunk meg nil-t. Ha nem ismerjük az osztály és az ablak nevét, akkor használjuk a Delphi-hez tartozó WinSight32 segédprogramot, amivel ezt a két tulajdonságot megkereshetjük.
Visszatérési érték
A függvény visszatérési értéke az ablak leírója, vagy 0, ha a megadott paraméterek alapján a leírót nem találta meg.
A TaskBar ablak osztályának neve „Shell_TrayWnd”, tehát a lekérdezés az alábbi módon lehetséges:
var
  TrayWnd: HWND;
  ...
  TrayWnd:=FindWindow('Shell_TrayWnd', nil);
Most már könnyű dolgunk van, mert a SetParent függvénnyel beállíthatjuk a komponens (adott esetben ez egy Button komponens) szülőjeként a TaskBar ablakot. Mi viszont a gombot a Start gomb alatt akarjuk elhelyezni, méghozzá úgy, hogy a gomb mérete megegyezzen a Start gomb méretével.
Mivel a Start gomb is egy ablak, így meg kell keresni annak is a leíróját, mivel ennek ismeretében a többi adat is megtudható. Egy ablak gyermek ablakait az EnumChildWindows függvénnyel kereshetjük meg.
EnumChildWindows
function EnumChildWindows(
hWndParent: HWND;
lpEnumFunc: TFNWndEnumProc;
lParam: LPARAM
): BOOL; stdcall;
Ezt a függvényt használhatjuk akkor, amikor egy ablak gyermek ablakait szeretnénk megkeresni.
Paraméterek
hWndParent: HWND
Ebben a paraméterben kell megadni annak az ablaknak a leíróját, amelynek a gyermek elemeit keressük.
lpEnumFunc: TFNWndEnumProc
Ebben a paraméterben egy callback függvényt adhatunk meg, amely minden egyes megtalált ablaknál meghívásra kerül. A függvénynek a következőképpen kell kinéznie:
function EnumChildProc(Handle: HWND; lParam: LPARAM): boolean; stdcall;
A Handle paraméterben kapjuk meg a megtalált ablak leíróját, az lParam paraméterben pedig az EnumChildWindows függvény lParam paraméterének értékét.
lParam: LPARAM
Ebben a paraméterben egy tetszőleges értéket megadhatunk, amelyet a callback függvényben használhatunk fel.
Visszatérési érték
A függvény visszatérési értéke igaz, ha a művelet sikerült, és hamis, ha nem.
Mivel mi a Start gombot keressük, ezért az EnumChildProc függvényben megkapott ablak leíróhoz tartozó osztály nevet lekérdezzük a GetClassName függvénnyel. A Start gomb osztályának neve „Button”. Ha ezt megtaláltuk, akkor a leírót eltároljuk az FHandle globális változóban. Ezután már e GetWindowRect függvénnyel lekérdezhetjük a Start gomb koordinátáit, amiből a méretek is kiszámíthatók.
Ugyanezt a módszert felhasználhatjuk akkor is, amikor mondjuk az órát is tartalmazó gyermek ablakba szeretnénk elhelyezni egy komponenst. Ekkor ezt az ablakot kell megkeresnünk (az osztály neve „TrayNotifyWnd”) és eltárolnunk az FHandle változóban, majd ezt a leírót adhatjuk meg a komponens szülőjeként a SetParent függvénynél.

Könyv
Ez a cikk megtalálható ebben a könyvben: Delphi Software Offline 2002 évkönyv 282. 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 |