Delphi - GDI, avagy mi maradt ki a TCanvas objektumból

GDI 1. rész

forráskód letöltése
A Windows grafika programozásáról szóló cikksorozat előző részében a TCanvas osztályt ismertettük. Mostantól áttérünk a Windows GDI (Graphic Device Interface) függvényeinek ismertetésére, ami egy jóval nagyobb terület, de ezzel együtt természetesen több lehetőséget is tartogat. Az első GDI-vel foglalkozó cikkben a BitBlt, StretchBlt és a TransparentBlt függvényeket ismertetjük részletesen. Mindhárom függvény bitkép-részletek másolását teszi lehetővé, különböző formában.

A három függvény közül a legegyszerűbb talán a BitBlt. Ezzel egy adott bitmap-ről egy másikra tudunk tetszőleges méretű képrészletet másolni. Paraméterei a következők:
DestDC: a cél bitmap azonosítója (pl. Canvas.Handle).
X, Y: a képrészlet bal felső sarkának koordinátái a célképen.
Width, Height: a képrészlet szélessége és magassága.
SrcDC: a forrás kép azonosítója.
Xsrc, Ysrc: a képrészlet koordinátái a forrás képen. A szélességet és magasságot a Width és Height paraméterek határozzák meg.
Rop: ez a paraméter azt határozza meg, hogy a cél, és a forrás kép pixelei között milyen logikai művelettel történjen a másolás.
A logikai műveletek a következők lehetnek:
BLACKNESS: a célterületet fekete színnel tölti fel.
CAPTUREBLT: Windows 98/Me és Windows 2000 operációs rendszerek esetén használható. A másolásnál beleszámítanak a képbe azok az ablakok is, amelyek a célterület felett vannak.
DSTINVERT: invertálja a célterületet.
MERGECOPY: a forrásterület színeit összekeveri a célterület Brush property-jében beállított színnel, logikai ÉS műveletet használva.
MERGEPAINT: összekeveri a forrásterület invertált színeit, a célterület színeivel, logikai VAGY műveletet használva.
NOMIRRORBITMAP: Windows 98/Me és Windows 2000 esetén használható. Letiltja a bitmap tükrözését.
NOTSRCCOPY: az invertált forrásterületet másolja a célterületre.
NOTSRCERASE: kombinálja a forrás- és a célterület színeit logikai VAGY művelettel, és az eredményt invertálja.
PATCOPY: a célterülethez tartozó Brush mintázatát másolja a célterületre.
PATINVERT: a célterülethez tartozó Brush színét kombinálja a célterület pixeleinek színével.
PATPAINT: kombinálja a célterülethez tartozó Brush színét az invertált forrásterület színeivel, logikai VAGY művelettel. Az eredményt a célterület színeivel kombinálja, logikai VAGY műveletet használva.
SRCAND: logikai ÉS művelettel kombinálja a forrás- és a célterület színeit.
SRCCOPY: a forrásterületet egy az egyben másolja a célterületre. Ez a leggyakrabban használt mód.
SRCERASE: a célterület invertált színeit kombinálja a forrásterülettel, logikai ÉS műveletet használva.
SRCINVERT: XOR logikai művelettel kombinálja a forrás- és a célterület pixeleit.
SRCPAINT: logikai VAGY művelettel kombinálja a forrás- és a célterület pixeleit.
WHITENESS: a célterület fehér színnel lesz feltöltve.
A példaprogramban ezt a függvényt használjuk az eredeti képrészlet visszamásolására (jobb egérgomb).
  BitBlt(Canvas.Handle, x-30, y-30, 60, 60, FBitmap.Canvas.Handle, x-30, y-30, SRCCOPY);

A következő függvény a StretchBlt. Ez annyiban különbözik az előzőtől, hogy itt a célterület mérete nem feltétlenül egyezik meg a forrásterület méretével. Így ezzel a függvénnyel tetszőleges mértékben kicsinyíthetünk, illetve nagyíthatunk. A példaprogramban ezzel a függvénnyel van megoldva a nagyított részlet az ablak bal-felső sarkában.
  StretchBlt(Canvas.Handle, 10, 10, 70, 70, FBitmap.Canvas.Handle, x-3, y-3, 7, 7, SRCCOPY);
Paraméterei a következők:
DestDC: a cél bitmap azonosítója (pl. Canvas.Handle).
X, Y: a képrészlet bal felső sarkának koordinátái a célképen.
Width, Height: a képrészlet szélessége és magassága.
SrcDC: a forrás kép azonosítója.
Xsrc, Ysrc: a képrészlet koordinátái a forrás képen.
SrcWidth, SrcHeight: a forrásterület szélessége és magassága.
Rop: ugyanaz, mint a BitBlt-nél.

Az utolsó függvény, amit most ismertetünk a TransparentBlt. Ez nagyszerűen használható akkor, ha egy olyan bitképet szeretnénk megjeleníteni, amelynek egy jól meghatározott színe átlátszó, vagyis a szín helyett a kép mögötti terület látható.
  TransparentBlt(Canvas.Handle, x-40, y-40, 79, 78, FStamps.Canvas.Handle, FStamp*79, 0, 79, 78,
      $FF00FF);
Paraméterei annyiban különböznek a StretchBlt függvényétől, hogy itt az utolsó paraméter nem a másoláshoz használt logikai művelet kódja, hanem az a szín, amit „átlátszóvá” szeretnénk tenni.


GDI cikksorozat