Obsah přednášky GDI+ Tvorba vlastních komponent Vlastní kreslení 1/36
Graphics Device Interface Služba Windows Framework poskytuje obalující třídy Umožňuje programování 2D grafiky bez znalosti konkrétního HW Umožňuje jednotný přístup k různému HW (obrazovka, tiskárna,...) 2/36
Základní možnosti 2D vektorová grafika Čáry, křivky, plnění,... Bitmapová grafika Práce s bitmapou Bitmapové formáty Typografie Vykreslování textu Fonty 3/36
Grafický kontext Virtuální plátno Zapouzdřen do instance Graphics Možnost získání Z PaintEventArgs (obsluha události Paint) Příklad: private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) { e.graphics.drawline(new Pen(Color.Red,3),1,1,50,50); } 4/36
Grafický kontext Možnost získání Z metody Control.CreateGraphics Příklad: Graphics g = this.creategraphics(); g.drawline(new Pen(Color.Blue,3),5,1,50,55); Z objektu dědícího od Image Graphics Graphics.FromImage(Image) Příklad: Graphics g = Graphics.FromImage(pictureBox1.Image); g.drawline(new Pen(Color.Pink,3),1,1,40,40); picturebox1.invalidate(); 5/36
Třída Graphics Funguje jako stavový automat Něco nastavím, nastavení zůstává platné, dokud jej nezměním Uložení stavu GraphicsState Graphics.Save() Obnovení stavu Graphics.Restore(GraphicsState) Nastavení kvality SmoothingMode Default, HighSpeed, HighQuality, AntiAlias 6/36
Nastavení aktivní oblasti Region Clip Nastavení transformační matice Matrix Transform Matice 3x3 7/36
Transformační matice Proč 3x3 pro 2D? Posunutí bodu o vektor v Bx = Ax + vx By = Ay + vy A B Rotace o úhel fi Bx = cos (fi) Ax - sin (fi) Ay By = sin (fi) Ax + cos (fi) Ay (pomůcka: když fi=0, nesmí se nic stát) y B fi A 0 x Změna měřítka Bx = Ax. Sx By = Ay. Sy A B 0 x 8/36
Transformační matice Pomocí vektorů Posunutí [ Bx By] = [ Ax Ay] [ Vx Vy] Rotace o úhel fi [ Bx By] = [ cos fi sin fi sin fi Ay] cos fi ] [ Ax Změna měřítka [ Bx By] = [ Sx 0 0 Sy] [ Ax Ay] Rotace a změna násobení matic 9/36
Transformační matice Zavedení homogenních souřadnic 2D -> 3D (třetí rozměr budeme ignorovat) Posunutí [Bx]=[1 0 Vx] [Ax ] By 0 1 Vy Ay 1 0 0 1 1 Rotace o úhel fi [Bx]=[cos fi sin fi 0 By sin fi cos fi 0 Ay 1 0 0 1] [Ax ] 1 Změna měřítka [Bx]=[Sx 0 0 By 0 Sy 0 Ay 1 0 0 1] [Ax ] 1 10/36
Transformační matice Výhody Možnost složit složitější operaci přede a pak přenásobit všechny body M = R1. T1. R2 A Snazší implementace Možnost rozšířit do 3D Použití v 3D kartách 11/36
Třída Matrix Definuje transformaci souřadnic pomocí homogenní souřadnic Matice 3x3 Možno použít předdefinované metody Multiply (násobení matic skládání operací) Rotate, Translate (rotace, posun) Možno transformovat body ručně TransformPoints 12/36
Třída PrintDocument Obsahuje nastavení tisku Událost PrintPage Vrací i kontext tiskárny Metoda Print Zahajuje vlastní tisk Možno předat dialogům pro nastavení tiskárny, preview, 13/36
Třída PrintDocument příklad private void button1_click(object sender, System.EventArgs e) { PrintDocument doc = new PrintDocument(); doc.printpage += new PrintPageEventHandler(this.doc_PrintPage); doc.print(); } private void doc_printpage(object sender, PrintPageEventArgs ev) { ev.graphics.drawline(new Pen(Color.Black,1),0,0,10,10); ev.hasmorepages = false; } 14/36
Třída Brush Štětce jakým způsobem se budou vyplňovat oblasti Abstraktní třída Možnosti vytvoření Třída Brushes jednoduché štětce White,Black,... Odděděné třídy SolidBrush(Color) HatchBrush(HatchStyle, Color, Color) BitmapBrush(Bitmap) LinearGradientBrush(Point,Point,Color,Color) 15/36
Třída Brush příklady HatchBrush brush = new HatchBrush(HatchStyle.DarkUpwardDiagonal, Color.Yellow,Color.Black); graphics.fillrectangle(brush,1,1,100,100); Bitmap bitmap = new Bitmap("C:\\windows\\winnt.bmp"); TextureBrush brush = new TextureBrush(bitmap); graphics.fillellipse(brush,1,1,200,200); LinearGradientBrush brush = new LinearGradientBrush(new Point(5,5), new Point(100,10), Color.Red, Color.White); graphics.fillpolygon(brush,new Point[] { new Point(50,5), new Point(5,100), new Point(100,30)}); 16/36
Třída Pen Pero jak se budou kreslit čáry Možnosti vytvoření Třída Pens jednoduché štětce Konstruktory Pen(Color) Pen(Color,float) Pen(Brush) Pen(Brush,float) 17/36
Začátek a konec čáry StartCap, EndCap enum LineCap Flat, Round, Square, Triangle,... Styl čárkování DashStyle enum DashStyle Dash, DashDot, DashDotDot, Dot, Solid,... 18/36
Třída Pen příklady Pen pen = new Pen(Color.Red,20); graphics.drawrectangle(pen,25,25,75,75); Bitmap bitmap = new Bitmap("C:\\windows\\winnt.bmp"); TextureBrush brush = new TextureBrush(bitmap); Pen pen = new Pen(brush,50); graphics.drawrectangle(pen,30,30,100,100); Pen pen = new Pen(Color.Red,10); pen.endcap = LineCap.ArrowAnchor; pen.startcap = LineCap.Round; pen.dashstyle = DashStyle.Dot; pen.dashcap = DashCap.Round; graphics.drawline(pen,10,80,80,10); 19/36
Možné tvary Graphics.Draw... - obrysy Graphics.Fill... - vylněné objekty (uzavřené) Obvykle je třeba štětec či pero a řídící body Otevřené Arc, Bezier, Curve, Line Uzavřené ClosedCurve, Ellipse, Pie, Polygon, Rectangle 20/36
Třídy GraphicsPath Umožňuje vytvoření složitějšího tvaru, který se vykreslí jedním perem či štětcem Bezparametrický konstruktor Jednotlivé segmenty se přidávají pomocí Add... (Line, Bezier,...) Uzavření CloseFigure Vykreslení DrawPath, FillPath 21/36
Třída Metafile Umožňuje zaznamenat/načíst posloupnost grafických primitiv Uložení do souboru.emf Načtení z EMF či WMF Konstruktory Metafile (string) načte ze souboru Metafile (string, IntPtr ) - prázdný soubor 22/36
Třída Metafile Graphics graphics = this.creategraphics(); IntPtr hdc = graphics.gethdc(); Metafile metafile = new Metafile("prvni.emf",hdc); Graphics gf = Graphics.FromImage(metafile); gf.drawrectangle(new Pen(Color.Red),5,5,20,20); graphics.releasehdc(hdc); metafile.dispose();... metafile = new Metafile("prvni.emf"); graphics.drawimage(metafile, new Point(20,10)); 23/36
Třída Bitmap Potomek Image Konstruktory Bitmap(string) Bitmapa ze souboru Formát se zvolí automaticky (JPG, BMP, PNG,...) Bitmap(int,int) Nová bitmapa Šířka, výška 24/36
Kreslení do bitmapy graphics = Graphics.FromImage(image) graphics.draw... Vykreslení bitmapy graphics.drawimage(bitmap,point) graphics.drawimage(bitmap,rectangle) Uložení bitmapy Bitmap.Save(string, ImageFormat) ImageFormat properties Bmp, Jpeg, Tiff, 25/36
Třída Font Typografie Zapouzdřuje jeden řez písma Rodina (Arial) Velikost (12) Styl (kurzíva) Konstruktor Font (FontFamily, float) Font (string, float) 26/36
Dostupné rodiny písem FontFamily[] FontFamily.Families Generické rodiny FontFamily.GenericMonospace Neproporcionální písmo (Courier) FontFamily.GenericSansSerif Bezpatkové písmo (Arial) FontFamily.GenericSerif Patkové písmo (Times) 27/36
Velikosti písma Možnost specifikovat jednotky Konstruktor Font(FontFamily, float, GraphicsUnit) Pixel, Point, Milimeter,... Některé jednotky jsou závislé na zařízení Pixely Některé ne Milimetry 28/36
Styl písma Font.Style enum FontStyle Bold, Italic, Regular, Underline, Strikeout Některé lze kombinovat Příklad Font font = new Font( Arial, 12, FontStyle.Bold FontStyle.Italic FontStyle.UnderLine) 29/36
Vypsání Textu Graphics.DrawString(string, Font, Brush, float, float) Nastavení AntiAliasingu Graphics.TextRenderingHint SystemDefault, SingleBitPerPixel, AntiAlias,... Zjištění velikosti textu SizeF Graphics.MeasureString(string, Font) 30/36
Vlastní kontrolky Vytvoření nových kontrolek Oddědí se od Control Mnoho práce než začne něco dělat Pro vykreslení lze použít třída ControlPaint Metody pro kreslení standardních win kontrolek Modifikace existujících kontrolek Oddědí se od požadované kotrolky Upraví se některé metody, aby odpovídaly požadavkům 31/36
Vlastní kontrolky Kompozice existujících kontrolek Oddědí se od UserControl nebo Project -> Add User Control Uživatelské kontrolky mají automaticky podporu pro design Veřejné property lze editovat přímo v MSVS Další informace o chování pomocí atributů BrowsableAttribute Má se zobrazit v okně property CategoryAttribute V jaké kategorii se má zobrazit DescriptionAttribute Popisek property 32/36
Vlastní kontrolky [Description("Popisek k TextCheckBoxu "),Browsable(true), Category("Appearance")] public string MujText { get { // Insert code here. return textbox1.text; } set { // Insert code here. textbox1.text = value; } } 33/36
Vlastní kreslení Někdy nevyhovuje standardní vzhled Možnost upravit si způsob vykreslování např. menu... Událost Paint V případě menu Vlastnost OwnerDraw nastavit na true Události MeasureItem DrawItem 34/36
Vlastní kreslení private void menuitem_drawitem(object sender, System.Windows.Forms.DrawItemEventArgs e) { Font font = new Font("Verdana",10); Rectangle hranice = e.bounds; if(e.state == DrawItemState.NoAccelerator) { e.graphics.fillrectangle(new SolidBrush(Color.FloralWhite), hranice.x, hranice.y, hranice.width, hranice.height+1); e.graphics.fillrectangle(new SolidBrush(Color.Tan), hranice.x, hranice.y, 20, hranice.height+1); e.graphics.drawstring(((menuitem)sender).text, font, Brushes.Tan, hranice.x+20, hranice.y); } else { e.graphics.fillrectangle(new SolidBrush(Color.Wheat), hranice.x, hranice.y, hranice.width-1, hranice.height-1); e.graphics.fillrectangle(new SolidBrush(Color.Tan), hranice.x, hranice.y, 20, hranice.height+1); e.graphics.drawrectangle(new Pen(Color.Tan,1), hranice.x, hranice.y, hranice.width-1, hranice.height-1); e.graphics.drawstring(((menuitem)sender).text, font, Brushes.Tan, hranice.x+20, hranice.y); } } private void menuitem_measureitem(object sender, System.Windows.Forms.MeasureItemEventArgs e) { e.itemheight = 20; e.itemwidth = 100; } 35/36
Konec 36/36