Delphi - Húzzunk új „bőrt” a Form-ra!

forráskód letöltése

Nagyon divatosak manapság az ún. Skin-eket használó programok, melyek felülete teljesen egyedi, és tetszőlegesen variálható. Ebben a példában egy olyan komponenst készítünk, melynek segítségével könnyedén készíthetünk ilyen programokat, csupán a Skin-nek használni kívánt képet kell megadnunk, és a komponens minden mást elvégez helyettünk. A mellékelt példaprogram megnyitása előtt a Skinner.pas-ban lévő komponenst telepítenie kell a Delphi alá.

Bár a komponens használata nagyon egyszerű, ennek ellenére az ilyen programok felületének megtervezése általában jóval több időt vesz igénybe, mint az egyszerű Widows-os felületet használó programoké. A komponens a megadott bitkép segítségével meghatározza a Form alakját, és a képet megjeleníti a Form-on (csak futtatási időben!). A képet a Skin property-ben kell megadni.
A TransparentColor property-ben kell megadni azt a színt, ami „átlátszó” lesz, tehát ott a Form mögötti terület fog látszani. Ennek segítségével akár lyukas Form-okat is készíthetünk, ahogyan az a mellékelt példában is látható. Mindez csak akkor történik meg, ha a Transparent property értéke igaz, különben a megadott szín sem lesz átlátszó.
A SetAllowMove property-t igazra állítva azt érjük el, hogy az ablak az egérrel eltolható lesz, amikor a skin-re kattintunk.

Ahhoz, hogy a komponens megfelelően működjön, szükségünk lesz a Form üzeneteinek kezelésére. Ehhez hoztuk létre a NewWndProc eljárást, amiben elvégezzük az üzeneteknek megfelelő műveleteket. A WM_PAINT üzenetnél meghívjuk a Paint eljárást, amiben kirajzoljuk a képet a Form-ra. A WM_NCHITTEST üzenetnél, ha az AllowMove property értéke igaz, akkor a Messages paraméter Result mezőjének a HTCAPTION konstanst adjuk értékül, amivel azt a hatást érjük el, mintha az egér a fejléc felett lenne. Ekkor, ha a felhasználó kattint a Form-on, és elmozgatja az egeret miközben lenyomva tartja a gombot, az ablakot elmozgathatja, ugyanúgy, mint a normál Form-oknál amikor a fejlécen teszi ugyanezt.

Ahhoz, hogy a Form a megadott kép alakját vegye fel, a képből egy régiót kell készíteni. Ezt végzi el a CreateRgn eljárás. Ebben egy téglalap alakú régióból indulunk ki, és a képet soronként, és pixelenként feldolgozva fokozatosan kivonjuk ebből az átlátszó részeket.

A Form eseményeit kihasználva más-más képet rendelhetünk pl. az aktív, vagy inaktív Form-hoz. Ehhez csak be kell tölteni a megfelelő helyen a Skin property-be a képet, majd a Refresh eljárást meghívni. Egy másik megoldás lehet a Skin property Canvas objektumának használata a kép módosításához.