arckép

Neuwirth István

programtervező informatikus MSc – ELTE

Computational and Software Techniques MSc – Cranfield, UK

Elérhetőség
pitta2@gmail.com
+36 30 329 3039

Valid XHTML 1.0 Transitional

Valid CSS!

GDI+

A Windows grafikus alrendszerének használata .NET alatt

A GDI+ a Windows XP alrendszere grafikus megjelenítésre, kibővítve és könnyebbé téve a használatát a korábbi GDI-nek (Graphics Device Interface). A GDI gyakorlatilag konstansok és alacsonyabbszintű függvények halmaza, nehezen kezelhető eszközleírókkal és az objektumorientált szemlélet teljes hiányával. A GDI+ teljesen elrejti a programozó elől a tényleges hardver kezelését, és egy jól strukturált osztályrendszert ad a kezébe. A .Net keretrendszere a System.Drawing névtérben fedi le a GDI+ szolgáltatásait.

Azért, hogy a programok kellemesebb kezelőfelülettel rendelkezhessenek, lehessenek finomabb színátmenetek, éles sarkok helyett lekerekítettek, az új grafikus alrendszer több fontos újítást vezetett be. Az egyszínű kitöltés mellett lehetőség van különböző színátmenetes, vagy kép alapján történő kitöltésre; képek átméretezésénél interpoláció használatára a pixelesedés elkerüléséhez, élsimítás a szemnek kellemesebb szövegek, görbék rajzolásához. A grafikus útvonalak mátrixok segítségével transzformálhatóak, az alakzatok kitöltése és a körvonal megrajzolása különválik. Fontos újítás még az átlátszóság és különböző típusú képfájlok kezelése. A rajzoláshoz szükséges műveleteket a Graphics osztály fogja össze.

without gdi and with gdi

Azért, hogy a programok kellemesebb kezelőfelülettel rendelkezhessenek, lehessenek finomabb színátmenetek, éles sarkok helyett lekerekítettek, az új grafikus alrendszer több fontos újítást vezetett be. Az egyszínű kitöltés mellett lehetőség van különböző színátmenetes, vagy kép alapján történő kitöltésre; képek átméretezésénél interpoláció használatára a pixelesedés elkerüléséhez, élsimítás a szemnek kellemesebb szövegek, görbék rajzolásához. A grafikus útvonalak mátrixok segítségével transzformálhatóak, az alakzatok kitöltése és a körvonal megrajzolása különválik. Fontos újítás még az átlátszóság és különböző típusú képfájlok kezelése. A rajzoláshoz szükséges műveleteket a Graphics osztály fogja össze.

Amennyiben saját felhasználói felületet készítünk, vagy valamely adatszerkezetet szeretnénk reprezentálni (például egy bináris fa kirajzolása), használjuk nyugodtan a GDI+ újításait a látványosabb kinézet kedvéért! Az aktuális Graphics típusú objektumunk InterpolationMode tulajdonságát állítsuk Bilinear-ra vagy Bicubic-ra a képek átméretezésénél (vagy amennyiben egy képet negyedénél jobban kicsinyítünk, HighQualityBicubic-ra), a SmoothingMode tulajdonságát AntiAlias-ra vagy HighQuality-re (ezzel megszűnik a vonalak és görbék szélén a recézettség). A szöveg élsimítását a TextRenderingHint tulajdonsággal módosíthatjuk. A kitöltésekhez használjunk SolidBrush helyett TextureBrush-t vagy LinearGradientBrush-t. Alakzatok rajzolásánál a kitöltés mellett valamilyen más stílusban rajzoljuk meg a körvonalat is. Két pont összekötéséhez egyenes vonal helyett használhatunk finoman ívelő Bezier-görbéket. Természetesen a látványosabb megjelenítésért teljesítménybeli hátránnyal kell áldozni, ez azonban csökkenthető ügyes programozással: csak azt rajzoljuk újra, ami változik, illetve ne rajzoljunk olyan alakzatot, amely nem lesz látható.

Valamilyen grafika kirajzolásához vagy képek szerkesztéséhez leggyakrabban egy PictureBox típusú objektum Paint eseményének PaintEventArgs típusú paramétere Graphics tulajdonságát használják. Ezen módszer legnagyobb hátránya az, hogy minden takarás, vagy ablakmozgatás következtében lefut a Paint eseményhez tartozó kód, azaz akkor is, amikor nincs rá szükség, mert nem változott az adatszerkezet. Ennek elkerülésére (és a villogásmentes kirajzoláshoz) valamilyen változás esetén egy Bitmap objektumra rajzoljunk, és a Paint esemény meghívásakor ez a Bitmap kerül kirajzolásra. (Gyakorlatilag csak egy e.Graphics.DrawImage(bitmap, 0, 0); kerül az eljárásba.)