HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

3D-s keret készítése tetszőleges képből


Példaprogram letöltése

138968 bájt

Ebben a példában egy olyan komponenst készítünk, amely egy tetszőleges képet tud megjeleníteni úgy, hogy a kép köré egy 3 dimenziós keretet rajzol, illetve nem is a kép köré, hanem magára a képre. A 3 dimenziós keret tulajdonságai állíthatók, és megadhatjuk azt is, hogy a komponens kereten belüli része átlátszó legyen. A keretet magából a képből állítja elő a megfelelő részek megadható intenzitással történő világosításával, illetve sötétítésével.

A mellékelt példaprogram megnyitása előtt a GfxWindow.pas-ban lévő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component - Install Component menüpontot.
Az új komponenst a TCustomControl osztályból fogjuk származtatni. A komponens property-jei a következők:
Picture
Osztály: TGfxWindow
property Picture: TPicture;
Ebben a property-ben adhatjuk meg azt a bitképet, amit a komponensnek meg kell jelenítenie. Ha nem adunk meg képet, akkor egy egyszerű 3D-s keret jelenik meg, és az AutoSize illetve Intensity property-k értékét nem veszi figyelembe a megjelenítésnél.
BorderSize
Osztály: TGfxWindow
property BorderSize: integer;
A keret vastagságát adhatjuk meg. A keret tényleges vastagságához még hozzájön a Depth property értéke kétszeresen. Ha például egy 10 pixel széles keretet akarunk létrehozni, akkor a Depth*2+BorderSize = 10 eredményt kell hogy kapjuk. Ha 0-t adunk meg, akkor a keret háromszög, ellenkező esetben trapéz profilú lesz.
Depth
Osztály: TGfxWindow
property Depth: integer;
A 3D-s keret „mélységét”, vagy más néven az él letörés méretét adja meg ez a property. A világosabb illetve sötétebb részek szélessége illetve magassága ezzel a property-vel lesz egyenlő. Ha 0-t adunk meg, akkor az él letörés nem fog látszani, így egy egyszerű 2D-s keretet kapunk.
Style
Osztály: TGfxWindow
property Style: TGfxWindowStyle;
Ezzel a property-vel állíthatjuk be, hogy a keret domború, vagy süllyesztett megjelenésű legyen-e. A property értékei a következők lehetnek:
  • wsRaised: domború keret;
  • wsRecessed: süllyesztett keret.
AutoSize
Osztály: TGfxWindow
property AutoSize: boolean;
Ha a property értéke igaz, akkor a komponens méretét a Picture property-ben megadott kép méretéhez igazítja. Ez csak abban az esetben történhet meg, ha a property-ben van kép megadva.
Ha a property értéke hamis, akkor a komponenst tetszőlegesen átméretezhetjük, a képet nyújtással a komponens méretéhez igazítja.
Intensity
Osztály: TGfxWindow
property Intensity: integer;
Ebben a property-ben megadhatjuk a világosítás, illetve sötétítés mértékét százalékban. Ha 0-t adunk meg, akkor nem lesz változás az eredeti színhez képest, tehát a 3D-s keret nem is fog látszani. A maximális érték a 100, aminél viszont már nagyon kontrasztos hatást kapunk.
Transparent
Osztály: TGfxWindow
property Transparent: boolean;
Ha ennek a property-nek az értéke igaz, akkor a kép kereten belüli része teljesen átlátszó lesz, olyannyira, hogy a mögötte lévő komponensek is látszódni fognak, sőt használni is tudjuk azokat a „lyukon” keresztül.
Ahhoz, hogy a komponens megrajzolását el tudjuk végezni, felül kell írnunk a Paint eljárást. Ha nincs kép megadva, akkor egy egyszerű dupla keretet rajzolunk a Frame3D eljárással, de a Depth és BorderSize property-k felhasználásával.
Az nyilvánvaló, hogy a Picture property-ben tárolt képet nem módosíthatjuk, hiszen akkor a megjelenítést befolyásoló property-k értékének megváltoztatásakor mindig újra be kellene tölteni az eredeti képet, és újra módosítani az új értékeknek megfelelően. Szükség van tehát egy olyan bitképre, ami a komponenssel megegyező méretű, és ezt módosítjuk a keret tulajdonságainak megfelelően. Megtehetnénk azt is, hogy az eredeti képet rámásoljuk a komponens Canvas-ára, majd a Canvas-on végezzük el a szükséges módosításokat, de mivel itt pixelenként kell a módosításokat elvégezni, így ez már egy kisebb kép esetén is nagyon lassú lenne, ráadásul minden frissítésnél újra végre kellene hajtani.
A megoldás tehát az, hogy készítünk egy a komponens méretével megegyező méretű bitképet, majd erre ráfeszítjük az eredeti képet. Ezután egy ciklusban végigmegyünk a kép pixelein, és ahol szükséges, ott a pixelt elsötétítjük, vagy világosítjuk. A pixelenként történő feldolgozást jelentősen meggyorsítja a Scanline függvény használata.
Ha elkészült a keret, akkor ellenőrizzük a Transparent property értékét, és ha igaz, akkor a komponens kereten belüli részét átlátszóvá tesszük. Ezt az ún. régiók használatával tudjuk elérni. Készítünk két téglalap alakú régiót. Az egyik a komponens méretével megegyezik, míg a másik a belső rész méretével és pozíciójával azonos. A nagyobb régióból a CombineRgn függvénnyel kivonjuk a kisebb régiót, majd az eredményt a SetWindowRgn függvénnyel beállítjuk a Form-ra.


Ahhoz, hogy a komponens méretének változásait is figyelemmel tudjuk kísérni, felül kell írnunk a Resize eljárást. Ebben ellenőrizzük az AutoSize property értékét, és ha igaz, akkor a komponens méretét visszaállítjuk a kép méretére. Az eljárás végén meghívjuk a CreateFrame eljárást, ami létrehozza a keretet.



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