Delphi - Speciális TForm

2. rész

forráskód letöltése
Újságunk első évfolyamának 21. számában "Speciális TForm" címmel már bemutattunk egy olyan Form-ot, melynek nem volt se fejléce, se egyéb része, csupán egyetlen szövegből és egy háttérből állt és folyamatosan megjelenítette az aktuális időpontot. A lecsupaszított Form ennek ellenére mozgatható volt egér segítségével.

Most szintén egy órát készítünk, de azzal a különbséggel a fentihez képest, hogy most már csupán a kiírt szövegből áll az egész Form. Így a szöveg határvonalain kívül már látszik az alatta levő alkalmazás, sőt akár rá is kattinthatunk arra. Újságunk első évfolyamának 21. számában "Speciális TForm" címmel már bemutattunk egy olyan Form-ot, melynek nem volt se fejléce, se egyéb része, csupán egyetlen szövegből és egy háttérből állt és folyamatosan megjelenítette az aktuális időpontot. A lecsupaszított Form ennek ellenére mozgatható volt egér segítségével.

Most szintén egy órát készítünk, de azzal a különbséggel a fentihez képest, hogy most már csupán a kiírt szövegből áll az egész Form. Így a szöveg határvonalain kívül már látszik az alatta levő alkalmazás, sőt akár rá is kattinthatunk arra.


Ennek eléréséhez létre kell hoznunk másodpercenként egy olyan régiót, melynek határvonala egy adott szövegből, pontosabban az aktuális időpontból áll.

Mivel szövegből nem tudunk közvetlenül régiót készíteni, szükségünk lesz egy apró trükkre: első lépésként összefűzzük a szöveg egyes karaktereit egyetlen grafikai objektummá. Erről részletesebben a most megjelenő "Grafikai objektumok összefűzése" című cikksorozatban olvashat.

Miután rendelkezésre áll az objektum, létrehozunk egy olyan régiót, mely a Form teljes területét lefedi, majd kombináljuk ezt a CombineRgn függvény segítségével az előbb elkészített objektummal.

Mivel a szöveg objektum még nem régió, ezért a kombináláshoz szükségünk van a PathToRegion hívásához, amely konvertálja az objektumunkat régióvá. Ezek után már a CombineRgn képes egyesíteni a két régiót, melyhez RGN_AND műveletet használunk fel. Ennek eredménye az lesz, hogy a Form-ból már csak az általunk létrehozott szöveg marad meg.

Most már csak arra van szükségünk, hogy a SetWindowRgn függvény hívásával aktivizáljuk a Form-ra a fent létrehozott régiót.

Mivel a Form teljes területét egy BMP kép fedi le, így az adott régió által látható szöveg háttere ebből a BMP-ből kerül kivágásra, így egyedi formát ad minden egyes karakternek.


Ezzel tulajdonképpen készen is vagyunk, de még két apró problémát meg kellene oldanunk.

Az egyik, hogy mivel a Form-nak most nincs fejléce, így azt nem tudjuk mozgatni. Ennek feloldására hozzuk létre a WM_NCHITTEST esemény kezelőjét, ahol ha azt tapasztaljuk, hogy a felhasználó a Form területére kattintott, akkor átverve a Windows-t azt mondjuk neki, hogy "valójában" a felhasználó a fejlécre kattintott. Ezt a Windows el is hiszi és úgy viselkedik, mintha tényleg a fejlécre kattintottunk volna és ettől kezdve épp úgy mozgathatjuk a Form-ot, mintha csak a fejlécnél ragadtuk volna meg az ablakot.

Második apróság, hogy szeretnénk elérni azt, hogy alkalmazásunk minden más program fölött látható maradjon. Ehhez sajnos már kevés a Form FormStyle property-nél az fsStayOnTop értéket beállítani, mivel az csak alkalmazáson belül képes erre.

Megoldásként a Form létrehozásánál meghívjuk a SetWindowPos függvényt HWND_TOPMOST konstanssal és ettől kezdve Form-unk minden program fölött lesz látható bezárásig.

Speciális TForm cikksorozat

Speciális TForm - 2. rész