Delphi - Smooth Shading színátmenet

GDI újdonságai 1. rész

forráskód letöltése
Win98-tól kezdve, illetve NT esetén Win2000-től kezdve találhatunk néhány új GDI funkciót, mely igen egyszerűen és jól használható saját alkalmazásainkban.

Ilyen például a mostani cikkünkben bemutatott GradientFill nevű függvény. Ennek segítségével két tetszőleges szín közötti valódi színátmenetet tudunk kirajzolni vízszintes vagy függőleges irányban. A színátmenet ún. Smooth Shading technikát alkalmaz. Ennek révén a színátmenet kirajzolása tökéletesen egyenletes árnyékoltságú lesz. A mellékelt példaprogram megnyitása előtt a TRectangleGradient.pas-ban lévő komponenst telepítenie kell a Delphi alá.

A színátmenet Color1 property-ben megadott színtől kezdve a Color2-ben megadott színig tart.

Hogy a színátmenet kirajzolása vízszintes illetve függőleges irányban történjen-e, azt az Orientation property-n keresztül választhatjuk ki.

A színátmenetet rajzoló GradientFill függvény az msimg32.dll-ben van definiálva. Ennek segítségével egy téglalapot (két szín esetén), vagy egy háromszöget (három szín esetén) tudunk viszonylag egyszerűen megrajzolni. A háromszöges kirajzolásról a jövő heti cikkünkben lesz szó bővebben. Mivel a függvény nem deklarált a Delphi jelenlegi verzióiban, így ezt nekünk kell megtennünk a használatához.
function GradientFill(Handle: HDC; pVertex: pointer; 
    dwNumVertex: DWORD; pMesh: pointer; dwNumMesh:
    DWORD; dwMode: DWORD): DWORD; stdcall;
    external 'msimg32.dll';


A paraméterek jelentése a következő:
Handle: annak a grafikai objektumnak a leírója (Handle), amire rajzolni szeretnénk
pVertex: egy pointer a csúcspontokat és annak színeit tartalmazó tömbre. A tömb elemei TRIVERTEX típusúak. A TRIVERTEX típus definícióját is szintén nekünk kell megadnunk.
TRIVERTEX = packed record
  X: DWORD; - a csúcspont X koordinátája
  Y: DWORD; - a csúcspont Y koordinátája
  Red: WORD; - piros színösszetevő
  Green: WORD; - zöld színösszetevő
  Blue: WORD; - kék színösszetevő
  Alpha: WORD; - alpha (átlátszóság)
end;
Az egyes színösszetevők értékeit a GetRValue, GetGValue és GetBValue függvényekkel kérdezhetjük le. Mindegyik függvény egy TColor típusú paramétert kér, és a megfelelő színösszetevővel tér vissza. A TRIVERTEX struktúrában a színösszetevőket úgy kell megadni, hogy 8 bittel balra kell tolni az eredeti értéket, aminek az egyik legegyszerűbb módja a 256-al történő szorzás.

dwNumVertex: a csúcspontok számát adja meg

pMesh: TGradientRect vagy TGradientTriangle struktúrára mutató pointer, attól függően, hogy téglalapot vagy háromszöget szeretnénk-e rajzolni.
A TGradientRect struktúrának két eleme van: az egyik az UpperLeft, míg a másik a LowerRight. Mindkét változó egy sorszámot tartalmaz, méghozzá a pVertex tömbben tárolt csúcspontok megfelelő sorszámát. Az UpperLeft a négyszög bal felső sarkát, míg a LowerRight a négyszög jobb alsó sarkát meghatározó tömb elem sorszáma.
A TGradientTriangle struktúrának viszont már három eleme van. Ezek a Vertex1, Vertex2, és Vertex3 változók. Ezek segítségével a háromszög három csúcspontjának koordinátáit tartalmazó tömb elemek sorszámait kell megadni.

dwNumMesh: a pMesh-ben megadott elemek számát határozza meg.

dwMode: a színátmenet rajzolásának irányát, ill. módját adja meg. A megfelelő értékeket konstansokkal kell megadni:
  • GRADIENT_FILL_RECT_H - vízszintes színátmenet (négyszög esetén)
  • GRADIENT_FILL_RECT_V - függőleges színátmenet (négyszög esetén)
  • GRADIENT_FILL_TRIANGLE - háromszög esetén ezt kell használni

A függvény visszatérési értéke hamis, ha nem sikerült végrehajtani a funkciót.

A téglalap kirajzolásához egy két elemű tömböt kell feltöltenünk adatokkal. A tömb egyes elemei TRIVERTEX típusúak. Az első eleme ennek a tömbnek a téglalap bal felső sarkát adja meg, a második a jobb alsóét.


GDI újdonságai cikksorozat