HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

A GDI+ használata Delphi-ből


Példaprogram letöltése

7922 bájt

A GDI legújabb verziója a GDI+, mely számos újítást tartalmaz a régi GDI lehetőségeihez képest. A GDI+-ban jóval nagyobb támogatást kapunk a kétdimenziós grafika készítésekor, képek feldolgozásakor, szövegek kirajzolásánál. Használhatunk speciális színátmeneteket, tetszőleges görbéket rajzolhatunk, mátrix műveleteket végezhetünk a grafikáinkon, így például a forgatás, nyújtás, stb. művelet nagymértékben leegyszerűsödik. Támogatás kapunk áttetszőség (Alpha blending) készítéséhez is. A GDI+ a következő képformátumokkal képes dolgozni: BMP, GIF, JPEG, PNG, TIFF, ICO, WMF, EMF.

A GDI+ használatához Windows XP, illetve a .NET Server operációs rendszerekre van szükség. Azonban lehetőségünk van régebbi verziójú operációs rendszereken való használatra is. Ehhez csupán egyetlen, GDIPlus.dll nevű állományt kell az alkalmazásunk számára elérhetővé tennünk. Ez a DLL a Microsoft web oldaláról ingyenesen letölthető. (http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdkredist.htm) A DLL nem igényel semmilyen regisztrációt, egyszerűen csak tegyük egy olyan könyvtárba, ahonnan alkalmazásunk számára elérhető. A GDIPlus.dll Windows 98-tól, illetve NT 4 SP6-tól felfelé használható. Ettől régebbi operációs rendszer esetén a GDI+ használatáról le kell mondanunk.
Saját alkalmazásunk készítésekor nyilván a GDIPlus.dll-ben lévő függvényeket kell felhasználnunk grafikáink elkészítéséhez. Ez a DLL összesen 609 db függvényt tartalmaz, melyet meghívhatunk alkalmazásunkból. Ehhez azonban nekünk kell elkészíteni a hivatkozást, mivel a Delphi unit-jai ezt nem tartalmazzák. A mellékelt példához szükséges függvény deklarációja megtalálható a mellékelt GDIPlus.pas állományban.
A GDI+ használata előtt inicializálnunk kell azt a GdiplusStartup függvény hívásával. Ennek első paraméterében kapunk vissza egy azonosító számot, melyre a későbbiek folyamán lesz szükségünk. Második és harmadik paraméterében egy-egy struktúrát kell megadnunk.
procedure TForm1.FormCreate(Sender: TObject);
begin
  gsi.GdiplusVersion:=1;
  ...
  GdiplusStartup(FToken, gsi, gso);
end; 
Amikor már nincs szüksége alkalmazásunknak a GDIPlus.dll-re, akkor kell meghívnunk a GdiplusShutdown nevű függvényt. Ennek egyetlen paraméterében azt a számot kell megadnunk, mely a GdiplusStartup első paraméterében megadott változóba került.
procedure TForm1.FormDestroy(Sender: TObject);
begin
  GdiplusShutdown(FToken);
end;
Az előkészületek után már nekiállhatunk a rajzolásnak.
procedure TForm1.FormPaint(Sender: TObject);
var
  r: TRectangle;
  graphics: DWORD;
  brush: integer;
begin
Minden rajzoláshoz szükséges létrehoznunk egy Graphics objektumot, melyet most a Form Canvas azonosítóját felhasználva hozunk létre a GdipCreateFromHDC függvény segítségével. Itt első paraméterként a Canvas Handle property-nek értékét adjuk meg, míg a második paraméterbe kapjuk vissza azt az azonosítót, melyet felhasználhatunk a rajzoláshoz.
  graphics:=0;
  GdipCreateFromHDC(Canvas.Handle, graphics);
Egy megadott színnel törölhetjük a hátteret a GdipGraphicsClear függvény hívásával. Első paraméterként a kapott graphics azonosítót használjuk, míg másodikként egy ARGB színt kell megadnunk, melyet most feketére választunk. A szín megadásánál egy DWORD értéket használunk, mely négy bájtra bontható. Ebből az első lesz az Alpha csatorna, mely az áttetszőség mértékét adja, majd ezt követik a szokásos RGB színösszetevők bájtjai.
  GdipGraphicsClear(graphics, $FF000000);
Következő lépésként létrehozunk egy olyan speciális ecsetet, melyet felhasználva színátmenetes kitöltést adhatunk objektumainknak. Ehhez a GdipCreateLineBrushFromRectI függvényt kell használnunk. Ennek első paraméterében egy olyan struktúrát kell megadnunk, mely hasonlít a Delphi-ben lévő TRect-re, ez is négy integert tartalmaz, mely leír egy téglalapot, csupán az értelmezése más. A Left és Top egyezik a TRect azonos nevű elemével, míg a másik két változó a Width és a Height nevű lesz, mely a téglalap szélességét és magasságát írja le. Az itt megadott téglalap területén képződik a színátmenet.
A következő két paraméterben egy-egy ARGB szín értéket kell megadnunk. E két szín között jön létre a színátmenet.
A negyedik paraméterben adhatjuk meg a színátmenet irányát:
Értéke Leírás
0 Vízszintes
1 Függőleges
2 45 fok lefelé
3 45 fok felfelé
Az ötödik paraméter a színátmenet felhasználási módját szabályozza. Erre főleg akkor van szükség, ha az ecset létrehozásánál megadott téglalap mérete nem egyezik a kirajzolt grafika befoglaló téglalapjának méretével.
Értéke Leírás
0 Tile - egymás mellett ismétlés
1 TileFlipX - x tengely mentén tükrözés
2 TileFlipY - y tengely mentén tükrözés
3 TileFlipXY - x és y tengely mentén tükrözés
A függvény utolsó paraméterében kell megadnunk egy változót, melyben visszakapjuk a létrehozott ecsetet azonosító számot.
  GdipCreateLineBrushFromRectI(@r, $FFFF0000, $FFFFFF00, 0, 0, brush);
Az ecset létrehozása után már tényleg csak a rajzolás marad hátra. Egy ellipszis rajzolásához a GdipFillEllipseI függvényt használhatjuk. Itt első paraméterként a már tárolt graphics azonosítót, másodikként az imént létrehozott ecset azonosítóját kell megadnunk. Ezt követően négy szám jön, mely a rajzolandó ellipszis befoglaló téglalapját írja le a következő sorrendben: a téglalap bal széle, teteje, szélessége, magassága.
  GdipFillEllipseI(graphics, brush, 100, 20, 100, 100);
Ha már nincs szükségünk az ecsetre, akkor a GdipDeleteBrush függvény hívásával meg kell szüntetnünk a lefoglalt erőforrásokat.
  GdipDeleteBrush(brush);

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