Készítette: Major Péter

Slides:



Advertisements
Hasonló előadás
Microsoft Excel 7. óra Előadó: Jánosik Tamás.
Advertisements

C++ programozási nyelv Gyakorlat hét
FRAME-k (keretek). FRAME-k A frame-ek (keretek) segítségével a képernyőt felosztva egyszerre jeleníthetünk meg több webes dokumentumot a képernyőn. Fejlec.html.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Grafika. 2 Mértékek és koordináta rendszer Használjuk a RGB és QBColor függvényeket a színekhez Grafika létrehozása Load/change picture futási időben.
© Kozsik Tamás Beágyazott osztályok A blokkstrukturáltság támogatása –Eddig: egymásba ágyazható blokk utasítások Osztálydefiníciók is egymásba.
Dinamikus tömbök.
Bevezetés a Java programozásba
Programozás II. 3. Gyakorlat C++ alapok.
Tömbök ismétlés Osztályok Java-ban Garbage collection
Prototípuskészítés Verilog nyelven Screen Saver Készítette: Mészáros Péter.
STÍLUSOK Tulajdonságok és értékek. Színek megadási módjai H1 {color: #CCF150} H1 {color: rgb(204,241,80)} H1 {color: rgb(80%,95%,30%)} H1 {color: red}
Grafika a programban Készítette: Pető László. Bevezetés Valójában nem a célobjektumra rajzolunk, hanem annak festővászon területére (canvas). Csak olyan.
Leírónyelvek: HTML és XHTML
A Windows grafikus felülete
Hernyák Zoltán XML és HTML.
A körlevél készítésének menete
C# tagfüggvények.
C# tagfüggvények.
Web-grafika II (SVG) 2. gyakorlat Kereszty Gábor.
HTML oldal felépítése Készítette: Pataki Arnold
Cellák és tartalmak formázása táblázatkezelő programokban Készítette: Péter Tünde Felkészítő tanár: András Izabella Iskola: Gábor Áron Iskolaközpont,
,,Én így tanítanám az informatikát”
Táblázatok beillesztése, formázása dokumentumokba
Webszerkesztés Stíluslapok (CSS).
Microsoft Access Űrlapok tervezése.
Számítógépes Grafika 2. gyakorlat Programtervező informatikus (esti) 2011/2012 őszi félév.
Számítógépes grafika 3. gyakorlat.
Web-grafika (VRML) 1. gyakorlat Nyitrai Erika Varga Balázs.
Turbo Pascal 11..
Grafikus tervezőrendszerek programozása 11. előadás.
A <DIV> tag és formázás CSS-sel
CSS A CSS bemutatása.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Delphi Készítette: Rummel Szabolcs Elérhetőség:
Hyper Text Markup Language
Hyper Text Markup Language
Visual Basic 2008 Express Edition
Visual Basic 2008 Express Edition
Képek feldolgozása 7. osztály.
Web-grafika II (SVG) 3. gyakorlat Kereszty Gábor.
Web-grafika II (SVG) 4. gyakorlat
Web-grafika II (SVG) 1. gyakorlat
Web-grafika II (SVG) 8. gyakorlat Kereszty Gábor.
Web-grafika II (SVG) 6. gyakorlat Kereszty Gábor.
Web-grafika II (SVG) 7. gyakorlat Kereszty Gábor.
Web-grafika II (SVG) 5. gyakorlat Kereszty Gábor.
Grafikai lehetőségek WPF-ben Egyszerű grafika (Shape-ek)
Grafika alapfogalmak.
Gazdasági informatikus - Szövegszerkesztés 1 Grafikai elemek.
Első lépések a szövegszerkesztő használatában
Táblázatok.
Bevezetés - Vonalak. Koordinátarendszer Windows form x y Az y lefelé nő Transzformáció a hagyományosra x Eltolás y Ellentett és eltolás.
Prezentációk készítése
SZÖVEGSZERKESZTÉS III. ~ KARAKTERFORMÁZÁS ~
Számítógépes grafika I. AUTOCAD alapok 3. előadás.
Dokumentum formázása.
Gazdasági informatikus - Szövegszerkesztés 1 Bekezdések formázása 3.
Web-grafika (VRML) 1. gyakorlat Nyitrai Erika Varga Balázs alapján Kereszty Gábor.
Grafikus programozás Készítette: Csernok László
TÁMOP /1-2F Informatikai gyakorlatok 11. évfolyam Windows Forms alkalmazás készítése Czigléczky Gábor 2009.
A Mozilla magyar nyelvű szerkesztőjének használata
V 1.0 Programozás III. Gyakorlás. V 1.0ÓE-NIK, 2014 Gyakorlás –Feladat: Tic Tac Toe játék –Szabályok: A játékosok felváltva teszik le a jelöléseiket.
Neumann János Informatikai Kar
Neumann János Informatikai Kar
Neumann János Informatikai Kar
MS Office Word 2010 Szövegszerkesztés.
A digitális kép bevezetés.
Neumann János Informatikai Kar
téma közlemény SmartArt-ábra piros hátterű képekkel (Haladó)
Előadás másolata:

Készítette: Major Péter Grafika .Net-ben Készítette: Major Péter

Előszó Ebben a diasorban a .Net által nyújtott grafikus lehetőségekről lesz szó. Többek között: Képek, animációk megjelenítése Rajzolás Nyomtatás Animáció

Képek tárolása és megjelenítése

A képek tárolása .Net-ben A képeket a System.Drawing.Image osztály és leszármazottaival tárolhatjuk. A két fő leszármazott: System.Drawing.Bitmap: raszteres (pixelekből felépített) képek tárolására. System.Drawing.Imaging.MetaFile: olyan képfájlok, melyek a kép felépítésére szolgáló műveletek sorozatát rögzítik.

Képek megjelenítése Ehhez alapesetben a vizuális elemek között található System.Windows.Forms.PictureBox elemet használjuk fel, különösen akkor, ha a képet csak ritkábban változtatjuk. Ezzel az elemmel egyszerre egy képet jeleníthetünk meg, beállíthatjuk annak nagyítását, az elem képpel való lefedésének módját.

A PictureBox osztály A PictureBox egy vizuális elem (a System.Windows.Forms.Control leszármazottja), tehát annak jellegzetes mezői, tagfüggvényei itt is alkalmazhatók (pl.: Top, Left, Width, Height stb.) Kép betöltése: void Load( string url ): betöltés megadott helyről string ImageLocation { get; set; }: kép helyének átállításával Image Image { get; set; }: az „Image” mező átállításával Az utóbbi két mező az ablakszerkesztővel is állítható. Az InitialImage és az ErrorImage mezőkkel beállítható a kép betöltésig ill. a betöltési hiba esetén megjelenítendő kép.

PictureBox: a kép elhelyezése A kép elhelyezését az alábbi mezőkkel befolyásolhatjuk: PictureBoxSizeMode SizeMode { get; set; }, lehetséges értékei a System.Windows.Forms. PictureBoxSizeMode enumerációból: Normal: a kép a bal-felső sarokba kerül, a kilógó területet levágjuk StretchImage: a képet nyújtjuk, a képarány megváltozik, a kép torz lesz AutoSize: a PictureBox a kép méretét veszi fel CenterImage: a képet a PictureBox közepén helyezzük el Zoom: a képet akkorára nagyítjuk, hogy elérje a keretet, de a képarány megtartásával

Kép beágyazása a futtatható fájlba Ha egy program vizuális felületét képek felhasználásával készítjük, hasznos lehet ezek beágyazása az adott exe vagy dll fájlba. A beágyazott képek pl. magában az exe-ben foglalnak helyet és onnan betölthetők. Ez sokkal átláthatóbb és szebb megoldás, mint ha az exe mellett heverne az összes ikon stb. mind külön fájlban. Ezt a Visual Studio-ban a resource edittorral végezhetjük.

Resource kezelés Lépések: Project / <Projectnév> properties… menüpontra kattintunk Kiválasztjuk a Resources fület A megjelenő Click here to create one feliratra kattintunk Az Add resource / Add existing file… gombra kattintva hozzáadjuk a kívánt elemet. Tipp: az X:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\VS2008ImageLibrary\1033 helyen található egy a képgyűjtemény, mellyel szépíthetjük programjaink kezelőfelületét.

Tartalom beágyazása A beszúrt elemek természetesen törölhetők, átnevezhetők.

Beágyazott tartalom felhasználása Pl.: PictureBox Image tulajdonságánál: Az ablakszerkesztőből: Vagy kódból: pictureBox1.Image = Properties.Resources.search;

Képnézegető program készítése Készítsen képnézegető programot, amellyel fájlmegnyitó ablak segítségével képet nyithatunk meg és azt egy az ablakra helyezett PictureBox-ban megjeleníthetjük.

Képnézegető program készítése Helyezzünk egy PictureBox-ot az ablakra és állítsuk kapcsoljuk be a „Dock in parent container” opciót, így a PuctureBox kitölti az ablak méretét. A PictureBox-nak adjuk meg a kiinduló képét, amelyet ágyazzunk be az futtatható fájlba. Továbbá helyezzünk el az ablakon egy fájlmegnyitó gombot és rendeljünk a rá való klikkeléshez egy eseménykezelőt, amellyel megnyithatunk képet! Helyezzünk el egy OpenFileDialog-ot is, melyet állítsunk be képmegnyitáshoz.

Képnézegető program készítése using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;   namespace Kepnezegeto { public partial class MainForm : Form public MainForm() InitializeComponent(); } private void BOpen_Click(object sender, EventArgs e) if (OFD.ShowDialog() == DialogResult.OK) PB.Load(OFD.FileName); //PB.ImageLocation = OFD.FileName; //PB.Image = new Bitmap(OFD.FileName); //PB.Image = Bitmap.FromFile(OFD.FileName);

A Bitmap osztály A PictureBox-nál már megemlített osztály fontosabb tagfüggvényei és mezői: Konstruktor: Bitmap( string filename ): létrehozás fájlból Bitmap( Stream stream ): létrehozás adatfolyamból Bitmap( Image original ): létrehozás másik képből Bitmap( int width, int height[, PixelFormat format] ): létrehozás megadott mérettel, a bitmélység megadható a „format” paraméterben a System.Drawing.Imaging.PixelFormat enumerációból

A Bitmap osztály Jellemzők: int Width { get; }: szélesség pixelben int Height { get; }: magasság pixelben Size Size { get; }: méret pixelben PixelFormat PixelFormat { get; }: bitmélység SizeF PhysicalDimension { get; }: fizikai méret (a felbontás figyelembevételébel) float VerticalResolution { get; }: függőleges felbontás pixel/inch float HorizontalResolution { get; }: vízszintes felbontás pixel/inch

A Bitmap osztály Color GetPixel( int x, int y ): adott pixel lekérdezése void SetPixel( int x, int y, Color color ): adott pixel színének beállítása void SetResolution( float xDpi, float yDpi ): a vízszintes és függőleges felbontás beállítása pixel/inch egységben

A Color struktúra A System.Drawing.Color struktúrával tárolhatunk színeket. A byte típusú R, G, B és A mezői ebben a sorrendben a vörös, a zöld, a kék és az átlátszóság értékeket tárolják. A Color struktúra számos színt is definiál:

Előre definiált színek

Kép mentése A képek elmentése persze majd a rajzolás után célszerű, de már itt ismertetésre kerül: void Save( string filename, ImageFormat format ): kép mentése fájlba adott helyre, adott formátumban void Save( Stream stream, ImageFormat format ): mint az előző, de adatfolyamba ment Érdekesség: A parancsok egy másik túltöltésével a képtömörítési paraméterek (pl.: JPEG) is megadhatók: void Save( string filename, ImageCodecInfo encoder, EncoderParameters encoderParams )

Kép mentési formátumok A System.Drawing.Imaging.ImageFormat osztály tartalmazza a lehetséges mentési formátumokat statikus jellemzőkként: static ImageFormat Bmp / Emf / Exif / Gif / Icon / Jpeg / Png / Tiff / Wmf { get; } Tehát így menthetünk: B.Save("kep.png", ImageFormat.Png); Ha a képet már nem használjuk többet, ne felejtsük el felszabadítani a lefoglalt memóriát a void Dispose() utasítással.

Mielőtt még rajzolnánk… Azelőtt meg kell ismerkednünk a System.Drawing.Pen (toll) és a System.Drawing.Brush (ecset) osztályokat. Ezek szerepe hasonló a CAD programok rajzoló moduljában a toll és kitöltés beállításaihoz.

Mértékegységek A System.Drawing osztály számos eleménél adunk meg méreteket, ehhez pedig a mértékegységet is meg kell adni. A mértékegységeket a System.Drawing.GraphicsUnit enumeráció tartalmazza, értékkészlete: World: a válág-koordinátarendszer egysége Display: a hardverhez köthető mértékegység (monitornál pixel, nyomtatónál 1/100 inch) Pixel: képpont Point: „a nyomtató pontja” - 1/72 inch Inch Document: „a dokumentum egység” – 1/300 inch Millimeter

Float számok megadása Ha a forráskódban egy szám szerepel, akkor attól függően, hogy szerepel-e benne tizedes pont int vagy double típusúként kezeli a fordító. A System.Drawing névtér elemei viszont általában float azaz egyszeres precizitású (32bites) lebegőpontos számokat használnak. Ezért ilyenkor a számokat az „f” útótaggal egészítjük, így a fordító tudja hogy floatról van szó. pl.: 0.1f, 5f

Grafikával kapcsolatos egyéb adattípusok I. System.Drawing.Point(F) adatstruktúra: egy pont tárolására szolgál Mezői: int X: x irányú koordináta int Y: y irányú koordináta Point Empty: a (0, 0) pontot adja vissza Konstruktora (van paraméter nélküli is): Point( int x, int y ): ahol x és y a koordináták (a PointF-nél x és y nyilván float) System.Drawing.Size(F) adatstruktúra: méret tárolására szolgál: int Width: szélesség int Height: magasság Size Empty: a 0 szélességű és magasságú méretet adja vissza Size ( int width, int height ): ahol a width és height a szélesség és a magasság (a SizeF-nél width és height nyilván float)

Grafikával kapcsolatos egyéb adattípusok II. System.Drawing.Rectangle(F) adatstruktúra: egy téglalap pozíciójának és méretének tárolására szolgál Mezői: int X: a bal-felső sarok x irányú koordinátája int Y: a bal-felső sarok y irányú koordinátája int Width: szélesség int Height: magasság Rectangle Empty: olyan téglalapot ad meg, melynek összes előbb említett paramétere nulla Konstruktora (van paraméter nélküli is): Rectangle ( int x, int y, int width, int height ) : ahol x és y a bal-felső sarok koordinátái, width és height pedig a szélesség és a magasság (a RectangleF-nél a paraméterek típusa nyilván float)

Vonalstílusok

A Pen osztály A System.Drawing.Pen osztály a rajzolásnál a vonalak tulajdonságait határozza meg. Konstruktor: Pen( Color color, float width ): toll létrehozása adott színnel és vonalvastagsággal A Pen is rendelkezik void Dispose() metódussal, ezért ezt hívjuk meg, ha már nincs többet rá szükség. Főbb tulajdonságai: Color Color { get; set; }: a vonal színe Brush Brush { get; set; }: ecset (lásd később) kitöltött vonal rajzolásához, ha ezt megadjuk, akkor a Color jellemzőt a rendszer nem veszi figyelembe float Width { get; set; }: a vonal vastagsága általában pixelben

A vonalak kezdése és lezárása LineCap StartCap { get; set; } és LineCap EndCap { get; set; } A System.Drawing.Drawing2D.LineCap enumeráció elemei: AnchorMask ArrowAnchor DiamondAnchor Flat NoAnchor Round RoundAnchor Square SquareAnchor Triangle Érdekesség: Custom saját vonalvég megadható CustomLineCap CustomStartCap { get; set; } és CustomLineCap CustomEndCap { get; set; } jellemzővel a System.Drawing.Drawing2D.CustomLineCap osztállyal.

A vonal stílusa DashStyle DashStyle { get; set; } A System.Drawing.Drawing2D.DashStyle enumeráció elemei: Solid: folytonos vonal Dash: szaggatott vonal Dot: pontsor vonal DashDot: pontvonal DashDotDot: kétpont-vonal Érdekesség: Custom: megadható tetszőleges szaggatás is float[] DashPattern { get; set; } jellemzővel megadhatjuk egy tömbben a szaggatások-kihagyások hosszát

A szaggatások vége Megadható a DashCap DashCap { get; set; } jellemzővel System.Drawing.Drawing2D.DashCap enumeráció lehetséges értékei: Flat: egyenes vég Round: lekerekített vég Triangle: háromszög alakú vég

Többszörös vonalak float[] CompoundArray { get; set; } A tömbben az értékek 0.0f-től 1.0f-ig szerepelhetnek, méghozzá növekvő sorrendben. Ezek tartalmazzák a vonal „keresztmetszetén” lévő sávok kezdetét (és végét) a vonal szélességéhez viszonyítva. Tehát ha egy olyan vonalcsoportot akarunk, amely szélesség eloszlása ilyen: 20% vonal 50% hely 30% vonal Akkor a tömbben az értékek: 0.0f, 0.2f, 0.7f, 1.0f

Töröttvonal szakaszainak kapcsolódása LineJoin LineJoin { get; set; } tulajdonsággal adható meg Lehetséges értékei a System.Drawing.Drawing2D.LineJoin enumerációból: Miter: éles vagy levágott sarok (lásd: miter limit) Bevel: letört sarok Round: lekerekített sarok MiterClipped: éles vagy letört sarok (lásd: miter limit)

Miter limit Ha kis szögben találkoznak vonalak, akkor a sarkot célszerű levágni: A levágás mértékét a float MiterLimit { get; set; } jellemzővel adhatjuk meg. A sárgán rajzolt rész az eredeti sarok, az erősen rajzolt rész: Bal: MiterLimit=3 Jobb: MiterLimit=4

Kitöltések

A Brush osztály A System.Drawing.Brush osztállyal megadható a kirajzolt alakzatok belsejének kitöltése. Ez egy absztrakt osztály, a belőle leszármaztatott osztályokat használjuk: SolidBrush: egyszínű kitöltés TextureBrush: textúra kitöltés HatchBrush: sraffozott kitöltés LinearGradientBrush, PathGradientBrush: színátmenetes kitöltés A Brush és leszármazottai mind IDisposable osztályok, tehát használatuk befejeztével a void Dispose() metódusukat illik meghívni.

Egyszínű kitöltés A System.Drawing.SolidBrush osztállyal. Konstruktor: SolidBrush( Color color ): egyszínű kitöltés a „color”-ban megadott színnel. Fő jellemző: Color Color { get; set; }: a kitöltés színe

Textúra kitöltés A System.Drawing.TextureBrush osztállyal. Fő jellemzők: Image Image { get; }: a kitöltés textúrája WrapMode WrapMode { get; set; }: a kép elhelyezésének módja, a System.Drawing.Drawing2D.WrapMode enumerációból: Tile: mozaik TileFlipX: mozaik X tengelyre tükrözve ismétlés TileFlipY: mozaik Y tengelyre tükrözve ismétlés TileFlipXY: mozaik középpontra tükrözve ismétlés Clamp: nem mozaik Matrix Transform { get; set; }: a textúra transzformációs mátrixa Konstruktor: TextureBrush( Image bitmap ): textúra kitöltés képből

Lineáris gradiens kitöltés A System.Drawing.Drawing2D.LinearGradientBrush osztállyal. Fő jellemzői: ColorBlend InterpolationColors { get; set; }: az interpolált színek és pozíciójuk (lásd később) Blend Blend { get; set; }: az összekeverés módja (ha nem lineáris, lásd később) Color[] LinearColors { get; set; }: két színt, a kezdő és a befejező színt tartalmazó tömb WrapMode WrapMode { get; set; }: a gradiens elhelyezésének módja, a System.Drawing.Drawing2D.WrapMode enumerációból (mint előbb) Konstruktor: LinearGradientBrush( Point point1, Point point2, Color color1, Color color2 ) Ahol a point1 és a point2 a kezdő és a végpont, a color1 és a color2 a kezdő és a végső szín.

A lineáris színátmenet megadása A System.Drawing.Drawing2D.ColorBlend osztállyal megadhatóak a színátmenetek: Fő jellemzői: Color[] Colors { get; set; }: a színek tömbje float[] Positions { get; set; }: a színek pozíciói, 0.0f-től 1.0f-ig (mindig 0.0f az első elem és 1.0f az utolsó) A konstruktorának nincs paramétere. A System.Drawing.Drawing2D.Blend osztállyal megadható a színek összekeverésének mikéntje: float[] Factors { get; set; }: megadja az adott helyen a kezdő és végszín közti átmenet értékét, 0.0f-től 1.0f-ig float[] Positions { get; set; }: megadja a faktorokhoz tartozó pozíciókat, 0.0f-től 1.0f-ig (mindig 0.0f az első elem és 1.0f az utolsó)

Gradiens sokszögkitöltés A System.Drawing.Drawing2D.PathGradientBrush osztállyal. Fő jellemzői: Color CenterColor { get; set; }: a középpont színe PointF CenterPoint { get; set; }: a középpont helye Color[] SurroundColors { get; set; }: a csúcsokhoz rendelt színek További testreszabhatóság: PointF FocusScales { get; set; }: a gradiens fókuszpontja ColorBlend InterpolationColors { get; set; }: a színátmenet megadása Blend Blend { get; set; }: a színátmenet menetének megadása WrapMode WrapMode { get; set; }: a gradiens elhelyezésének módja A konstruktornak meg kell adni a SurroundColors-hoz tartozó pozíciókat: PathGradientBrush( Point[] / PointF[] points )

Sraffozott kitöltés A System.Drawing.Drawing2D.HatchBrush osztály valósítja meg. Fő jellemzői: Color BackgroundColor { get; }: háttérszín Color ForegroundColor { get; }: sraff színe HatchStyle HatchStyle { get; }: sraff stílusa, a System.Drawing.Drawing2D.HatchStyle enumerációból Konstruktor: HatchBrush( HatchStyle hatchstyle, Color foreColor, Color backColor )

Sraffozási stílusok

Rajzolás

Rajzolás A .Net egyik nagy előnye, hogy a hozzátartozó függvénykönyvtárak széleskörű megoldást kínálnak számos programozási feladatra. Nem kivétel ebből a szempontból a rajzolás sem: hiszen egyszerűbb rajprogramokat megszégyenítő rajzkészlettel rendelkezünk. A grafikai parancsok száma igen nagy, de a mérnöki munkában játszott nagy szerepük miatt (pl.: mérési eredmények, folyamatok ábrázolása) érdemes áttekinteni őket.

A Graphics osztály A rajzolást .Net-ben a System.Drawing.Graphics osztály segítségével végezzük. A Graphics osztály konstruktora nem publikus, ezért egy statikus tagfüggvénnyel hozzuk létre példányait: System.Drawing.Bitmap B = new Bitmap(640, 480); System.Drawing.Graphics G = Graphics.FromImage(B); Itt egy Bitmap objektumhoz hozzuk létre a Graphics objektumot, azaz arra tudunk majd rajzolni. A rajzolás során a műveleteket végrehajtását (hasonlóan a fájlba íráshoz) egy void Flush() tagfüggvénnyel kérhetjük. A Graphics IDisposable, használata után a void Dispose() metódusa hívandó.

A Graphics osztály beállításai Region Clip { get; set; } és RectangleF ClipBounds { get; } levágási határok (ezen kívül nem lehet rajzolni) CompositingMode CompositingMode { get; set; }: SourceOver: háttérszínnel való keverés rajzoláskor átlátszó szín esetén (alpha blending) SourceCopy: háttér felülírása rajzoláskor CompositingQuality CompositingQuality { get; set; }: rajzolás minősége: Invalid HighSpeed: gyors, de rossz a minőség AssumeLinear: közel szokásos minőség, de gyorsabb Default: szokásos HighQuality: jó minőség, de lassú GammaCorrected: gamma korrekciót is használunk

A Graphics osztály beállításai InterpolationMode InterpolationMode { get; set; }: interpolációs mód (pl.: képek nagyításakor fontos) Invalid Default Low High Bilinear Bicubic NearestNeighbor (éles pixelhatárok) HighQualityBilinear HighQualityBicubic (legjobb minőség)

A Graphics osztály beállításai SmoothingMode SmoothingMode { get; set; } élsimítás (anti-alias) beállítása: Invalid None HighSpeed Default HighQuality* AntiAlias* *: van anti-alias

A Graphics osztály beállításai A szöveg élsimítása a TextRenderingHint TextRenderingHint { get; set; } tulajdonsággal oldható meg: SystemDefault: rendszerbeállítás SingleBitPerPixelGridFit: rácshoz igazítás SingleBitPerPixel: nincs képjavítás AntiAliasGridFit: anti-alias + rácshoz igazítás AntiAlias: anti-alias ClearTypeGridFit: cleartype, legjobb minőség

Rajzoljunk… A rajzolás során a már ismertetett Pen és Brush segítségével rajzolhatunk ki vonalakat, görbéket valamint ki is tölthetjük őket. Mivel ide igen sok számos túltöltéssel rendelkező parancs kapcsolódik, így mindnek ismertetésétől eltekintünk. A legtöbb függvény túltöltései mind int mind float alapú koordinátákkal (PointF, RectangleF) működnek, itt csak az egyik változatot fogom ismertetni.

Vonalas rajzolás

Vonal / töröttvonal – DrawLine(s) void DrawLine( Pen pen, PointF pt1, PointF pt2 ) void DrawLine( Pen pen, float x1, float y1, float x2, float y2 ) void DrawLines( Pen pen, PointF[] points ): töröttvonal Ahol: pen: a toll pt1, pt2: a kezdő és a végpont x1, y1, x2, y2: a kezdő és a végpont x és y koordinátái points: a pontok

Téglalap(ok) – DrawRectangle(s) void DrawRectangle( Pen pen, Rectangle rect ) void DrawRectangle( Pen pen, float x, float y, float width, float height ) void DrawRectangles( Pen pen, RectangleF[] rects ): több téglalap Ahol: pen: a toll rect: a téglalap rects: a téglalapok x, y: a téglalap jobb felső sarka width, height: a téglalap szélessége és magassága

Poligon - DrawPolygon void DrawPolygon( Pen pen, PointF[] points ) Ahol: pen: a toll points: a csúcsok pontjai Ha az első és utolsó csúcs nem esik egybe, akkor az azokat összekötő oldalt is kirajzolja.

Ellipszis – DrawEllipse void DrawEllipse( Pen pen, RectangleF rect) void DrawEllipse( Pen pen, float x, float y, float width, float height) Ahol: pen: a toll rect: a befoglaló téglalapx: a jobb felső sarok x koordinátája y: a jobb felső sarok y koordinátája width: szélesség height: magasság

Ellipszis ív / körcikk– DrawArc void DrawArc / DrawPie ( Pen pen, RectangleF rect, float startAngle, float sweepAngle ) void DrawArc / DrawPie ( Pen pen, float x, float y, float width, float height, float startAngle, float sweepAngle ) Ahol: pen: a toll rect: a befoglaló téglalap startAngle: a kezdő szög sweepAngle: a söprési szög x: a jobb felső sarok x koordinátája y: a jobb felső sarok y koordinátája width: szélesség height: magasság

Görbék rajzolása - Spline - DrawCurve void DrawCurve( Pen pen, Point[] points, float tension ) void DrawClosedCurve( Pen pen, PointF[] points, float tension, FillMode fillmode ): zárt görbéhez Spline-görbék rajzolása adott pontokon keresztül. Ahol: pen: a toll points: a kontrollpontok helye tension: feszültség fillmode: kitöltési mód, mely vonalak látszódjanak (lásd később)

Görbék rajzolása - Bezier - DrawBezier void DrawBezier( Pen pen, PointF pt1, PointF pt2, PointF pt3, PointF pt4 ) void DrawBeziers( Pen pen, PointF[] points ) Ahol: pen: a toll pt1: a kezdőpont pt2: az első kontrolpont pt3: a második kontrolpont pt4: a végpont points: a rajzoláshoz szükséges pontok, szerekezete: 0-K-K-0-K-K-0, ahol: 0: olyan pont ami a görbe átmegy K: kontrolpont

Kitöltés rajzolás

Ellipszis – FillEllipse void FillEllipse( Brush brush, RectangleF rect) void FillEllipse(Brush brush, float x, float y, float width, float height) Ahol: brush: az ecset rect: a befoglaló téglalapx: a jobb felső sarok x koordinátája y: a jobb felső sarok y koordinátája width: szélesség height: magasság

Szektor – FillPie void FillPie ( Brush brush, RectangleF rect, float startAngle, float sweepAngle ) void FillPie ( Brush brush, float x, float y, float width, float height, float startAngle, float sweepAngle ) Ahol: brush: az ecset rect: a befoglaló téglalap startAngle: a kezdő szög sweepAngle: a söprési szög x: a jobb felső sarok x koordinátája y: a jobb felső sarok y koordinátája width: szélesség height: magasság

Téglalap(ok) – DrawRectangle(s) void FillRectangle(Brush brush, Rectangle rect ) void FillRectangle(Brush brush, float x, float y, float width, float height ) void FillRectangles(Brush brush, RectangleF[] rects ): több téglalap Ahol: brush: az ecset rect: a téglalap rects: a téglalapok x, y: a téglalap jobb felső sarka width, height: a téglalap szélessége és magassága

Poligon - FillPolygon void FillPolygon( Brush brush, PointF[] points, FillMode fillMode ) Ahol: brush: az ecset points: a csúcsok pontjai fillMode: kitöltés módja a System.Drawing.Drawing2D.FillMode enumerációból: Alternate: Winding: Ha az első és utolsó csúcs nem esik egybe, akkor az azokat összekötő oldalt is kirajzolja.

Görbék rajzolása - Spline - DrawCurve void FillClosedCurve( Brush brush, PointF[] points, FillMode fillmode, float tension ) Ahol: brush: az ecset points: a kontrollpontok helye tension: feszültség fillmode: kitöltési mód

Képek rajzolása - DrawImage void DrawImage( Image image, Rectangle rect ) void DrawImage( Image image, int x, int y, int width, int height ) Ahol: image: a rajzolandó kép rect: a cél téglalap (nyújt! – képarány változhat) x, y: a kép bal felső sarkának helye width, height: a kirajzolt kép szélessége, magassága (nyújt!) A parancs 30+ darab túltöltése minden célra megfelel.

Vonal és kitöltési stílusok demonstrációs program BDraw BFont RBLines RBRectangles RBText BClear RBLineNormal TBText RBLineArrow RBLineDash RBLineDouble RBStars LBColor RBFillSolid RBFillGradient CBTransparency RBFillHatch BColor RBFillTexture PBImage Készítse el a képen látható ablakszerkezetet! Helyezzen el még egy ColorDialog (CD), egy SaveFileDialog (SFD) és egy FontDialog (FD) elemet, és adja a programhoz az asimov.png fájlt! BSave

A színválasztó ablak elemei A színek listáját adja meg a következőképpen:

Választógombok eseménykezelői Mivel a választógombok kezelése hasonló, ezért közös eseménykezelőt használunk hozzájuk és a Tag tulajdonságukkal azonosítjuk őket. A Click esemény cellájába írjuk be a függvény nevét, majd ezt később a többi hasonló célú elemhez is rendeljük hozzá a cella mellett megjelenő lefele nyilas menüből. Végezzük el a vonal- és kitöltési stílusok, valamint a rajzolási módok választógombjaira is.

Beállítandó eseménykezelők Forráskód a Picasso_source.pdf fájlban! BDraw_Click RBMode_Click BClear_Click BFont_Click RBLineStyle_Click RBFill_Click BColor_Click BSave_Click PBImage_MouseMove

Szöveg kirajzolása

Betűtípusok - Font A betűtípusokat a System.Drawing.Font osztály segítségével adhatjuk meg. A jellemzőket a konstruktorral adhatjuk meg, azok később nem változtathatók: Font( string familyName, float emSize, FontStyle style, GraphicsUnit unit ) Ahol: familyName: a betűtípus neve (pl.: Arial) emSize: a betűméret style: a betűk stílusa (pl.: dőlt) unit: a betűméret mértékegysége (pl.: pixel) A Font is rendelkezik void Dispose() metódussal, ezért ezt hívjuk meg, ha már nincs többet rá szükség.

Betűstílusok - FontStyle A System.Drawing.FontStyle enumeráció tartalmazza őket, elemei: Regular: normál Bold: vastag Italic: dőlt Underline: aláhúzott Strikeout: áthúzott Ez az enumeráció Flag típusú, ezért megadásnál alkalmazható a „|” (bináris vagy) operátor, pl.: vastag aláhúzott: FontStyle.Bold | FontStyle.Underline

Szöveg kirajzolása - DrawString void DrawString( string s, Font font, Brush brush, PointF point ) void DrawString( string s, Font font, Brush brush, RectangleF layoutRectangle, StringFormat format ) Ahol: s: a szöveg font: a betűtípus brush: az ecset PointF: a bal felső sarok layoutRectangle: a befoglaló téglalap format: a szöveg formátuma (pl.: jobbrazárt) Abc

Szövegformátum - StringFormat A szöveg formátuma a System.Drawing.StringFormat osztályban tárolható. Főbb mezői: StringAlignment Alignment { get; set; }: a szöveg horizontális elhelyezése: Center: középre Far: jobbra igazított (balról jobbra írásnál) Near: balra igazított (balról jobbra írásnál) StringAlignment LineAlignment { get; set; }: a szöveg vertikális elhelyezése: Far: alulra igazított Near: felülre igazított StringFormatFlags FormatFlags { get; set; }: egyéb formázási jellemzők (ezt itt most nem fejtjük ki)

Befoglaló téglalap - MeasureString A szöveg által elfoglalt terület kiszámítására szolgál. SizeF MeasureString( string text, Font font ) Ahol: text: a szöveg font: a betűtípus visszatérési érték: a befoglaló téglalap mérete

Transzformációk, összetett vektorgrafikus alakzatok, logikai műveletek

Mátrixok – Matrix osztály A geometriai transzformációk megadására szolgál a System.Drawing.Drawing2D.Matrix osztály. Főbb mezők: float[] Elements { get; }: a mátrix elemei m11, m12, m21, m22, dx, dy sorrendben void Invert (): mátrix invertálása void Multiply ( Matrix matrix ): mátrix szorzása jobbról void Reset (): visszaalakítás egységmátrixszá void Rotate ( float angle ): forgatás mátrix óramutató irányában void RotateAt ( float angle, PointF point ): forgatás adott pont körül void Scale ( float scaleX, float scaleY ): nagyítás void Translate ( float offsetX, float offsetY ): eltolás void TransformPoints ( PointF[] pts ): pontok transzformációja (szorzás) void TransformVectors ( PointF[] pts ): vektorok transzformációja (szorzás, de az eltolás figyelembe vétele nélkül) m12 dx m21 m22 dy 1

Transzformáció beállítása A Graphics osztállyal állítható be, a Matrix Transform { get; set; } tulajdonság segítségével. Az eredeti állapot a void ResetTransform() függvénnyel helyreállítható.

Mátrix bemutatóprogram Készítse el az alábbi ablakot: Minden gombhoz tartozik egy BGombNeve_Click eseménykezelő is! A forráskód a gyak_matrix_source.pdf fájlban! BUp BDown BRight BLeft BZoomIn BZoomOut BRotateRight BRotateLeft

Összetett vektorgrafikus elemek - GraphicsPath A System.Drawing.Drawing2D.GraphicsPath osztály egymáshoz kapcsolódó egyenesek és görbék tárolására szolgál, segítségével összetett formák írhatóak le. A GraphicsPath is rendelkezik void Dispose() metódussal, ezért ezt hívjuk meg, ha már nincs többet rá szükség. Az AddArc / AddBezier(s) / AddClosedCurve / AddCurve / AddEllipse / AddLine(s) / AddPath / AddPie / AddPolygon / AddRectangle(s) / AddString függvényekkel adhatunk elemeket az összetett objektumhoz. A void Reset() függvénnyel üríthető ki.

Összetett vektorgrafikus elemek - GraphicsPath A benne elhelyezett elemeket úgynevezett figurákba csoportosíthatók. Minden figura egymáshoz kapcsolódó vonalak sorozata vagy geometriai primitív (pl.: kör, téglalap). Ha az alakzatot kitöltve rendereljük, akkor minden nyitott elem zárásra kerül a kezdő és végpont összekötésével. Új figurát a következőképpen kezdhetünk: implicit: egy lezárt útvonal elkészültével explicit: void CloseFigure(): lezárja a jelenlegi figurát és újat kezd void StartFigure(): új figura kezdése a régi lezárása nélkül Az ábra mérete a RectangleF GetBounds( Matrix matrix, Pen pen ) metódussal kérdezhető le: matrix: transzformációs mátrix pen: a használt toll (a vonalvastagságtól függ a méret)

A GraphicsPath kirajzolása A rajzolás a Graphics osztály következő metódusaival végezhető el: void DrawPath( Pen pen, GraphicsPath path ): vonalas rajz void FillPath( Brush brush, GraphicsPath path ): kitöltött rajz Az alakzat transzformációja a void Transform( Matrix matrix ) parancsal végezhető el. A kitöltés módja a FillMode FillMode { get; set; } jellemzővel állítható.

A Region osztály A System.Drawing.Region osztály segítségével logikai műveletek végezhetőek területeken, ez hasznos lehet összetett alakzatok rajzolása esetén. A Region is rendelkezik void Dispose() metódussal, ezért ezt hívjuk meg, ha már nincs többet rá szükség. Az osztály konstruktorai: Region (): teljes régió Region ( RectangleF rect ): létrehozás téglalapból Region ( GraphicsPath path ): létrehozás GraphicsPath objektumból Region ( RegionData rgnData ): létrehozás másik régióból (az rgnData a RegionData GetRegionData () metódussal érhető el)

Logikai műveletek - Region void MakeEmpty (): üressé teszi a régiót void MakeInfinite (): végtelenné teszi a régiót Logikai műveletek (elvégezhetőek másik Region, RectangleF és GraphicsPath elemekre): Intersect: metszet Union: unió Xor: kizáró vagy (olyan régiót ad, amelynek pontjai vagy az első vagy a második régióhoz tartoznak, de nem mindkettőhöz) Complement: komplementer (olyan régiót ad, amely a második régió minden olyan pontját tartalmazza, amely nincs benne az első régióban)

Régió kirajzolása void FillRegion( Brush brush, Region region ) Ahol: brush: az ecset region: régió

Rajzolás Ablakokra

Rajzolás közvetlenül ablakokra Bár lehetőségünk van arra, hogy rajzainkat úgy jelenítsük meg, hogy a létrejött Bitmap-et megadjuk egy PictureBox-nak vagy egy Control BackgroundImage jellemzőjének, de rajzolhatunk közvetlenül a vizuális elemek felületére is.

Rajzolás közvetlenül ablakokra Három módja van: event PaintEventHandler Paint eseményhez adunk eseménykezelőt virtual void OnPaint( PaintEventArgs e ) metódus felülírása Graphics CreateGraphics() metódus hívása Ezen módszerek az összes vizuális elemre (System.Windows.Forms.Control ősosztály) alkalmazhatók. A művelet során egy System.Windows.Forms.PaintEventArgs típusú paramétert is kapunk, mely tartalmazza: Graphics Graphics { get; }: a rajzoláshoz használható Graphics objektumot Rectangle ClipRectangle { get; }: az vizuális elem határait jellemző téglalapot

Rajzolás közvetlenül ablakokra Az előbbi két metódus automatikusan meghívódik, ha újra kell rajzolni az adott területet, tipikusan: A terület fölé rajzolás: ha a 3D-s ablakkompozíció (Windows Aero) nincs bekapcsolva, akkor egyik ablak másikra rajzolása esetén, illetve az ablak képernyőről lelógó mozgatása esetén is Ablak átméretezésekor Az adott elem void Invalidate() metódusának hívására

A vizuális elemek újrarajzolásának felfüggesztése Számos esetben előfordulhat, hogy például egy listát tartalmazó vizuális elem feltöltésekor nem szeretnénk, ha minden egyes elem behelyezésére újrarajzolódna az adott objektum (ez hosszú listák esetén olyan nagy CPU használatot eredményez, ami több másodpercre is válaszképtelenné teszi a programunkat). Ez elkerülhető a Control osztály (és leszármazottai) void SuspendLayout() és void ResumeLayout() metódusainak hívásával. Ha ezekkel keretbe foglalunk egy sok lépésből álló a grafikus felületet többször változtató programrészt a programunk jelentősen gyorsulhat.

Nyomtatás

Nyomtatás .Net-ben A nyomtatás folyamata nagyban hasonlít a vizuális elemekre rajzoláskor használt Paint eseménykezelőjének megírásához. A System.Drawing.Printing.PrintDocument osztály segítségével végezhetjük el a nyomtatást. Általában szükségünk lesz egy vagy több a nyomtatással kapcsolatos beállítások megadására alkalmas elemre (nyomtató beállítások, oldalbeállítás, nyomtatási kép) is.

Nyomtatással kapcsolatos eseménykezelők Először létrehozzuk a nyomtatáshoz használt PrintDocument osztályt paraméter nélküli konstruktorával. Beállítjuk a következő események eseménykezelőit (csak a PrintPage kötelező): event PrintEventHandler BeginPrint: a nyomtatás kezdetekor hívódik meg, általában itt történik a nyomtatással kapcsolatos erőforrások lefoglalása event QueryPageSettingsEventHandler QueryPageSettings: minden egyes lap nyomtatása előtt meghívódik, lehetővé teszi a lappal kapcsolatos beállítások oldalankénti megadását event PrintPageEventHandler PrintPage: a lapok nyomtatásakor hívódik meg, itt szerepel a nyomtatandó képet megalkotó kód event PrintEventHandler EndPrint: a nyomtatás befejeztével hívódik meg, itt felszabadíthatók a nyomtatással kapcsolatos erőforrások (kivétel esetén vagy a nyomtatás megszakításakor is meghívódik) Megadjuk a nyomtatási beállításokat (lásd később) A nyomtatást a void Print() metódussal kezdeményezzük.

A PrintPage eseménykezelője Ebben adjuk meg nyomtatással kapcsolatos rajzoló kódot. Amelyet a paraméterként kapott System.Drawing.Printing.PrintPageEventArgs osztály segítségével végzünk el. Ennek fő jellemzői: Graphics Graphics { get; }: ezzel rajzolhatjuk meg az adott oldalt Rectangle PageBounds { get; }: a papír teljes területe Rectangle MarginBounds { get; }: a margókon belüli terület PageSettings PageSettings { get; }: az oldalbeállítások bool HasMorePages { get; set; }: ezzel jelezzük, hogy vannak-e még hátra oldalak bool Cancel { get; set; }: ha igazra állítjuk, megszakítjuk a nyomtatást

Nyomtatási beállítások A nyomtatási beállítások megadását a Windows által biztosított konfigurációs ablak segítségével szokás elvégezni. Ezt a System.Windows.Forms.PrintDialog osztály segítségével végezhetjük el.

A PrintDialog osztály Fontos beállításai: PrintDocument Document { get; set; }: a nyomtatandó dokumentum bool UseEXDialog { get; set; }: ez a beállítást 64bites rendszereken be kell kapcsolni, mert különben az ablak nem jelenik meg bool AllowCurrentPage { get; set; }: az aktuális oldal nyomtatása válaszható bool AllowPrintToFile { get; set; }: a fájlba nyomtatás válaszható bool AllowSelection { get; set; }: oldaltartomány választható bool AllowSomePages { get; set; }: néhány oldal nyomtatása választható

A PrintDialog osztály A DialogResult ShowDialog () metódus segítségével jelenítjük meg, és ha DialogResult.OK eredményt ad (felhasználó OK-ra kattintott), akkor kezdhetjük a nyomtatást.

Rövid összefoglaló példákkal Grafika: How Do I …?

Hogyan rajzolok ablakokra? Ha a kirajzolt képre amúgy nincs szükség máshol, azaz pl. nem kell elmenteni kinyomtatni: Paint eseménykezelőjének felülírásával: Graphics osztálypéldány: Panel Form Duplaklikk

Hogyan hívjam meg az előző dia Paint eseményét? A következőképpen: Rajzolhatok máshogy is az ablakokra? – Igen, az OnPaint függvény felülírásával:

Rajzolás ablakra B módszer Lehetőségünk van arra is, hogy egy bitmap felületére készítsük el a rajzunkat és ezt jelenítsük meg a képernyőn:

Hogyan mentsük el a képet? Ha Bitmap-re rajzoltunk:

Szín, vonalstílus, kitöltés megadása, szövegkiírás

Hogyan rajzoljak ki egy …-t?

Hogyan rajzoljak ki egy …-t?

Mátrixok használata 1. 2. 3. 4.

GraphicsPath & Region Ying-yang jel rajzolása GraphicsPath és Region segítségével:

Hogyan rajzoljak Bitmap-re?

Nyomtatás

Hogyan csináljak animációt? Kapcsold be a DoubleBuffered jellemzőt a rajzolás célobjektumán: Írd meg a Paint eseménykezelőjét, vagy az OnPaint-t írd felül, vagy esetleg… :) Az így elkészített Graphics objektumok bárhol használhatók a programban.

Animáció… Rakj le egy Timer-t az ablakra: Frissítés eseménykezelője (azaz az időzítő jelzéséé) Frissítés gyakorisága: [ms] 100ms -> 10FPS 33ms->~30FPS

Animáció… Az óra ütésére rajzoljunk: E két paranccsal hívásra kerülnek a rajzoló metódusok, az animációhoz számoljuk az időt egy globális (a függvényből nézve) változóba. Animáció elindítása a TDraw.Start(), megállítása a TDraw.Stop() paranccsal.