Hoofdstuk 3 Methoden om te tekenen
Methode-aanroep void TekenScherm(object o, PaintEventArgs pea) { Graphics gr; gr = pea.Graphics; gr . DrawString ("Hallo!", new Font("Tahoma", 30) , Brushes.Blue, 10, 20 ); gr . FillRectangle (Brushes.Red, 10,20, 50,60 ); gr . DrawLine (Pens.Black, 70,30, 20,20 ); } methode uit de klasse Graphics andere methoden uit Graphics
Methoden uit Graphics DrawString DrawLine DrawRectangle DrawEllipse x y DrawString hallo DrawLine DrawRectangle DrawEllipse FillRectangle FillEllipse DrawImage
Methoden uit Graphics DrawString DrawLine DrawRectangle DrawEllipse Pen parameter voor de kleur x y DrawString hallo DrawLine DrawRectangle Brush parameter voor de kleur Brush parameter voor de kleur DrawEllipse FillRectangle FillEllipse DrawImage
Klassen en objecten Klasse beschrijft mogelijkheden van object methode uit de klasse Graphics van object gr Klasse beschrijft mogelijkheden van object methoden properties Graphics gr; gr = pea.Graphics; gr . DrawLine ( Pens.Red , 10,10, 20,20); string s; s = Console.ReadLine(); ... s . Length ... Objecten kunnen dingen doen hebben geheugen property uit de klasse string van object s
compositie met blauw en rood (vrij naar Piet Mondriaan) Tekenen compositie met blauw en rood (vrij naar Piet Mondriaan) gr.DrawRectangle( Pens.Black, 0, 0, 200, 100 ); gr.FillRectangle( Brushes.Black, 10, 0, 10, 100 ); gr.FillRectangle( Brushes.Black, 50, 0, 10, 100 ); gr.FillRectangle( Brushes.Black, 90, 0, 10, 100 ); gr.FillRectangle( Brushes.Black, 0, 40, 200, 10 ); gr.FillRectangle( Brushes.Black, 0, 70, 200, 10 ); gr.FillRectangle( Brushes.Blue, 0, 50, 10, 20 ); gr.FillRectangle( Brushes.Red, 100, 0, 100, 40 );
Tekening aanpassen Aanpassen van de dikte van de balken Aanpassen van de hoogte van het plaatje Aanpassen van de breedte van het plaatje gr.DrawRectangle( Pens.Black, 0, 0, 200, 100 ); erg veel werk... gr.FillRectangle( Brushes.Black, 10, 0, 10, 100 ); gr.FillRectangle( Brushes.Black, 50, 0, 10, 100 ); gr.FillRectangle( Brushes.Black, 90, 0, 10, 100 ); gr.FillRectangle( Brushes.Black, 0, 40, 200, 10 ); gr.FillRectangle( Brushes.Black, 0, 70, 200, 10 ); gr.FillRectangle( Brushes.Blue, 0, 50, 10, 20 ); gr.FillRectangle( Brushes.Red, 100, 0, 100, 40 );
Variabelen declaratie: aankondigen van variabelen en hun type type int: geheel getal int balk, breedte, hoogte; toekennings- opdrachten: variabelen krijgen een waarde balk = 10; breedte = 200; hoogte = 100; gr.FillRectangle( Brushes.Black, 10, 0, balk, hoogte ); gr.FillRectangle( Brushes.Black, 50, 0, balk, hoogte ); gr.FillRectangle( Brushes.Black, 90, 0, balk, hoogte ); gr.FillRectangle( Brushes.Black, 0, 40, breedte, balk ); gr.FillRectangle( Brushes.Black, 0, 70, breedte, balk ); gebruik van variabelen
Variabelen declaratie: aankondigen van variabelen en hun type type string: tekst string naam, groet; toekennings- opdrachten: variabelen krijgen een waarde naam = Console.ReadLine(); groet = "Hallo " + naam + "!"; Console.WriteLine(groet); gebruik van variabelen
Variabelen declaratie: aankondigen van variabelen en hun type type Label: opschrift Label groet; toekennings- opdrachten: variabelen krijgen een waarde groet = new Label (); groet . Text = "Hallo"; this.Controls . Add (groet); gebruik van variabelen
Syntax van opdracht opdracht naam naam ( expressie ) ; . , expressie klasse naam methode naam ( expressie ) ; . , object expressie property naam += variabele = expressie ;
Syntax van declaratie declaratie const = expressie var type naam ; , klasse naam int string
Plaats van een declaratie blok declaratie { } opdracht
Variabelen int balk, breed, hoog; balk=10; breed=200; hoog=100; gr.FillRectangle( Brushes.Black, 10, 0, 10, 100 ); gr.FillRectangle( Brushes.Black, 50, 0, 10, 100 ); gr.FillRectangle( Brushes.Black, 90, 0, 10, 100 ); gr.FillRectangle( Brushes.Black, 0, 40, 200, 10 ); gr.FillRectangle( Brushes.Black, 0, 70, 200, 10 ); gr.FillRectangle( Brushes.Blue, 0, 50, 10, 20 ); gr.FillRectangle( Brushes.Red, 100, 0, 100, 40 );
Variabelen x1 x2 x3 y1 y2 int balk, breed, hoog; int x1, x2, x3, y1, y2; x1=10; x2=50; x3=90; y1=40; y2=70; balk=10; breed=200; hoog=100; gr.FillRectangle( Brushes.Black, 10, 0, balk, hoog ); gr.FillRectangle( Brushes.Black, 50, 0, balk, hoog ); gr.FillRectangle( Brushes.Black, 90, 0, balk, hoog ); gr.FillRectangle( Brushes.Black, 0, 40, breed, balk ); gr.FillRectangle( Brushes.Black, 0, 70, breed, balk ); gr.FillRectangle( Brushes.Blue, 0, 50, 10, 20 ); gr.FillRectangle( Brushes.Red, 100, 0, 100, 40 );
Variabelen x1 x2 x3 y1 y2 int balk, breed, hoog; int x1, x2, x3, y1, y2; x1=10; x2=50; x3=90; y1=40; y2=70; balk=10; breed=200; hoog=100; gr.FillRectangle( Brushes.Black, x1, 0, balk, hoog ); gr.FillRectangle( Brushes.Black, x2, 0, balk, hoog ); gr.FillRectangle( Brushes.Black, x3, 0, balk, hoog ); gr.FillRectangle( Brushes.Black, 0, y1, breed, balk ); gr.FillRectangle( Brushes.Black, 0, y2, breed, balk ); gr.FillRectangle( Brushes.Blue, 0, 50, 10, 20 ); gr.FillRectangle( Brushes.Red, 100, 0, 100, 40 );
Variabelen x1 x2 x3 y1 y2 int balk, breed, hoog; int x1, x2, x3, y1, y2; x1=10; x2=50; x3=90; y1=40; y2=70; balk=10; breed=200; hoog=100; gr.FillRectangle( Brushes.Black, x1, 0, balk, hoog ); gr.FillRectangle( Brushes.Black, x2, 0, balk, hoog ); gr.FillRectangle( Brushes.Black, x3, 0, balk, hoog ); gr.FillRectangle( Brushes.Black, 0, y1, breed, balk ); gr.FillRectangle( Brushes.Black, 0, y2, breed, balk ); gr.FillRectangle( Brushes.Blue, 0, y1+balk, x1, y2-y1-balk ); gr.FillRectangle( Brushes.Red, x3+balk, 0, br-(x3+balk), y1 );
Expressies Expressie: stukje programma met een waarde Gebruik van expressies: Rechterkant van een toekennings-opdracht Parameter van een methode x3 = x2+40 ; gr.FillRectangle(Brushes.Blue , 0, y1+balk, x1, y2-(y1+balk) ) ;
Opbouw van expressies constante variabele ... operator ... ( ... ) 5 hoogte ... operator ... x + y + 1 ( ... ) (y + 1) x - expressie expressie expressie
bij deling van int-waarden: cijfers achter de komma worden afgekapt! Operatoren + optellen - aftrekken * vermenigvuldigen / delen bij deling van int-waarden: cijfers achter de komma worden afgekapt! % rest bij deling 14 / 3 geeft 4 want 14 is 4*3 + 2 14 % 3 geeft 2
Prioriteit van operatoren Vermenigvuldigen gaat voor optellen en delen en aftrekken 1 + 2 * 3 geeft 7 Bij gelijke prioriteit: van links naar rechts 10 - 5 - 2 geeft 3 Wil je ’t anders: zet haakjes (1+2) * 3 geeft 9
Syntax van expressies expressie getal ” ” symbool variabele expressie operator expressie ( expressie )
Gebruik van expressies in opdrachten klasse naam methode naam ( expressie ) ; . , object expressie property naam += variabele = expressie ;
Gebruik van expressies in opdrachten klasse naam methode naam ( expressie ) ; . , object expressie property naam += variabele = expressie ;
Gebruik van expressies in opdrachten en expressies klasse naam methode naam ( expressie ) ; . , object expressie property naam += variabele = expressie ; expressie constante operator ( ) variabele
Het type van een expressie 98765 "Hallo" breedte 67890+1 "Hallo " + naam naam.Length "Hallo " + naam.Length Brushes.Black int type klasse naam int string string int int string int string Brush
Het type van een expressie Brushes.Black Brush Pens.Blue Pen new Form() Form new Font("Arial",10) Font new Pen(Brushes.Red, 5) Pen new HatchBrush(HatchStyle.ZigZag , Color.Blue, Color.Red) Brush new Color(255, 128, 0) Color
Kleuren Color(...) (0,255,0) (255,0,0) (0,0,255) (0,0,0) (255,255,0) (255,255,255) (0,255,255) (255,0,255) (0,0,255) (0,0,0)
Mengkleuren new Color(255, 0, 0) new Color(255, 64, 0)
-syntax expressie getal ” ” symbool variabele expressie operator ( expressie ) ( ) , expressie new klasse naam klasse naam methode object expressie . property naam this
Programma asd Graphics gr = pea.Graphics; using System.Windows.Forms; using System.Drawing; class Mondriaan : Form { Mondriaan() this.Text = "Mondriaan"; this.BackColor = Color.White; this.ClientSize = new Size(200, 100); this.Paint += this.tekenScherm; } void tekenScherm(object obj, PaintEventArgs pea) int breedte, hoogte, balk, x1, x2, x3, y1, y2; breedte = pea.ClipRectangle.Width; hoogte = pea.ClipRectangle.Height; x1 = 10; x2 = 50; x3 = 90; y1 = 40; y2 = 70; balk = 10; Graphics gr = pea.Graphics; gr.FillRectangle(Brushes.Black, x1, 0, balk, hoogte); gr.FillRectangle(Brushes.Black, x2, 0, balk, hoogte); gr.FillRectangle(Brushes.Black, x3, 0, balk, hoogte); gr.FillRectangle(Brushes.Black, 0, y1, breedte,balk); gr.FillRectangle(Brushes.Black, 0, y2, breedte,balk); gr.FillRectangle(Brushes.Blue, 0, y1 + balk, x1, y2 - (y1 + balk)); gr.FillRectangle(Brushes.Red, x3+balk, 0, breedte-(x3+balk), y1); static void Main() Application.Run( new Mondriaan()); asd
Programma met commentaar asd /* Dit programma tekent een Mondriaan-like "compositie met rood en blauw” */ using System.Windows.Forms; using System.Drawing; class Mondriaan : Form { Mondriaan() this.Text = "Mondriaan"; this.BackColor = Color.White; this.ClientSize = new Size(200, 100); this.Paint += this.tekenScherm; } void tekenScherm(object obj, PaintEventArgs pea) int breedte, hoogte, balk, x1, x2, x3, y1, y2; breedte = pea.ClipRectangle.Width; hoogte = pea.ClipRectangle.Height; x1 = 10; x2 = 50; x3 = 90; y1 = 40; y2 = 70; balk = 10; Graphics gr = pea.Graphics; gr.FillRectangle(Brushes.Black, x1, 0, balk, hoogte); gr.FillRectangle(Brushes.Black, x2, 0, balk, hoogte); gr.FillRectangle(Brushes.Black, x3, 0, balk, hoogte); gr.FillRectangle(Brushes.Black, 0, y1, breedte,balk); gr.FillRectangle(Brushes.Black, 0, y2, breedte,balk); gr.FillRectangle(Brushes.Blue, 0, y1 + balk, x1, y2 - (y1 + balk)); gr.FillRectangle(Brushes.Red, x3+balk, 0, breedte-(x3+balk), y1); static void Main() Application.Run( new Mondriaan()); asd // zwarte balken // gekleurde vakken // posities van de lijnen
Commentaar Tekst voor de menselijke lezer, genegeerd door de compiler Twee vormen: van /* tot */ van // tot einde regel
Hoofdstuk 3.6 Methode-declaraties
grote bende coördinaten! Tekenen public void TekenScherm(object o, PaintEventArgs pea) { Graphics gr = pea.Graphics; Pen p = Pens.Black; gr.DrawRectangle(p,20,60,40,40); gr.DrawLine(p,20,60,40,40); gr.DrawLine(p,40,40,60,60); grote bende coördinaten! gr.DrawRectangle(p,70,60,40,40); gr.DrawLine(p,70,60,90,40); gr.DrawLine(p,90,40,110,60); gr.DrawRectangle(p,120,40,60,60); gr.DrawLine(p,120,40,150,10); gr.DrawLine(p,150,10,180,40); }
Aanroep van een methode voert opdrachten uit in de body daarvan Nieuwe methoden Methode: groepje opdrachten met een naam private void tekenHuis(…) { … . DrawRectangle (…); … . DrawLine (…); … . DrawLine (…); } public void TekenScherm (object o, PaintEventArgs pea) { … . tekenHuis (…); … . tekenHuis (…); … . tekenHuis (…); } Aanroep van een methode voert opdrachten uit in de body daarvan
Parameters welk Graphics-object nemen deze methoden onder handen? private void tekenHuis (…) { (Graphics gr, … ) gr … . DrawRectangle (…); … . DrawLine (…); … . DrawLine (…); parameter declareren } public void TekenScherm (object o, PaintEventArgs pea) { en bij aanroep meegeven … . tekenHuis (…); … . tekenHuis (…); … . tekenHuis (…); (pea.Graphics, …); }
Het object this class Huizen : Form { } private void tekenHuis (Graphics gr, …) { gr . DrawRectangle (…); gr . DrawLine (…); gr . DrawLine (…); welk ……… - object nemen deze methoden onder handen? Huizen } public void TekenScherm (object o, PaintEventArgs pea) { this: het object dat TekenScherm ook al onder handen heeft … . tekenHuis (pea.Graphics, …); … . tekenHuis (pea.Graphics, …); … . tekenHuis (pea.Graphics, …); this this this }
teken driemaal een net iets ander huis Meer parameters teken driemaal een net iets ander huis nog meer parameters! public void TekenScherm (object o, PaintEventArgs pea) { this . tekenHuis (pea.Graphics, …); this . tekenHuis (pea.Graphics, …); this . tekenHuis (pea.Graphics, …); 20, 100, 40); 70, 100, 40); 120, 100, 60); }
Meer parameters private void tekenHuis (Graphics gr, … ) { int x, int y, int br) int tx, ty; tx = x + br/2; ty = y – br – br/2; (tx,ty) gr.DrawRect (pen, … ); gr.DrawLine (pen, … ); gr.DrawLine (pen, … ); x, y-br, br, br x, y-br, tx, ty tx, ty, x+br, y-br } (x,y) br public void TekenScherm (object o, PaintEventArgs pea) { this . tekenHuis (pea.Graphics, …); this . tekenHuis (pea.Graphics, …); this . tekenHuis (pea.Graphics, …); 20, 100, 40); 70, 100, 40); 120, 100, 60); }
Huizen... int afdak = breedte / 6; Pen pen = new Pen(Color.DarkRed, 3); Brush br = new HatchBrush(HatchStyle.HorizontalBrick , Color.Silver, Color.Red );
150 Publieksvraag 100 50 Schrijf een methode tekenCirkel die je zo kunt aanroepen: public void TekenScherm (object o, PEA pea) { } this.tekenCirkel(pea.Graphics , Brushes.Black, 150, 100, 50); midden midden straal private void tekenCirkel { } (Graphics gr, Brush br , int cx, int cy, int r) gr . FillEllipse(br, cx–r, cy–r, 2*r, 2*r );
en des te lastiger aan te roepen... Flexibiliteit Hoe meer parameters, des te flexibeler de methode private void tekenHuis (Graphics gr, int x, int y, int br, int h, int dakh, Brush kl, Brush dakKl, … ) { dakh en des te lastiger aan te roepen... h (x,y) br
Flexibiliteit Veel parameters: Nu lastig om te programmeren In de toekomst misschien gemakkelijk uit te breiden Weinig parameters: Nu gemakkelijk om te programmeren In de toekomst misschien lastig te onderhouden