Kreslíme různé tvary
Jestliže chceme kreslit jednotlivé tvary, musíme nejdříve vytvořit objekt typu Graphics, dále pak objekt typu Pen a nakonec pouze voláme příslušné metody např. DrawLine pro nakreslení úsečky. Ukážeme si to na jednoduché aplikaci. Vytvoříme si novou Windows Form aplikaci a obsloužíme událost Paint ( událost nastává vždy při překreslování formuláře)
private void FormOnPaint(object sender, PaintEventArgs e)
{
// vytvorim objekt typu Graphics
Graphics g = this.CreateGraphics();
// vytvorim si pero, kterym budu kreslit jednotlive tvary
// bude mit cernou barvu a sirku 7
Pen pero = new Pen(Color.Black, 7);
// nakreslim usecku od bodu 0,0 do 100,100
// a jako prvni parametr predam moje pero
g.DrawLine(pero, new Point(10, 10), new Point(100, 10));
}
|
Kromě zmiňované metody DrawLine existují i další metody pro vykreslení jiných tvarů:
- DrawLines
- DrawEllipse
- DrawPath
- DrawPie
- DrawPolygon
- DrawRectangle
- DrawRectangles
- DrawString
Pokud se nám nelíbí klasícká "plná" čára, můžeme jí trošku upravit vzhled. Např.:
- DashStyle.Dot - tečky
- DashStyle.Dash - čáry
- DashStyle.DashDot - tečky-čárky
- DashStyle.Solid - klasická plná
Ukážeme si to na příkladě:
private void FormOnPaint(object sender, PaintEventArgs e)
{
// vytvorim objekt typu Graphics
Graphics g = this.CreateGraphics();
// vytvorim si pero, kterym budu kreslit jednotlive tvary
// bude mit cernou barvu a sirku 7
Pen pero = new Pen(Color.Black, 7);
// nakreslim usecku od bodu 0,0 do 100,100
// a jako prvni parametr predam moje pero
// carkovana usecka
pero.DashStyle = DashStyle.Dash;
g.DrawLine(pero, new Point(10, 10), new Point(this.Width - 20, 10));
// carka-tecka usecka
pero.DashStyle = DashStyle.DashDot;
g.DrawLine(pero, new Point(10, 30), new Point(this.Width - 20, 30));
// carka-tecka-tecka usecka
pero.DashStyle = DashStyle.DashDotDot;
g.DrawLine(pero, new Point(10, 50), new Point(this.Width - 20, 50));
// teckovana usecka
pero.DashStyle = DashStyle.Dot;
g.DrawLine(pero, new Point(10, 70), new Point(this.Width - 20, 70));
}
|
Další užitečnou vlastností je StartCap a EndCap, pomocí kterých nastavujeme jak bude daná úsečka vypadat na začátku či konci. Zda-li bude zakulacená, hranatá, či se bude jednat o šipku. Vytvoříme tedy šipku ukazující doprava. Kód by jsme poupravili takto:
private void FormOnPaint(object sender, PaintEventArgs e)
{
// vytvorim objekt typu Graphics
Graphics g = this.CreateGraphics();
// vytvorim si pero, kterym budu kreslit jednotlive tvary
// bude mit cernou barvu a sirku 7
Pen pero = new Pen(Color.Black, 7);
// nakreslim usecku od bodu 0,0 do 100,100
// a jako prvni parametr predam moje pero
// carkovana usecka
pero.DashStyle = DashStyle.Dash;
// na startu usecku nechci zadny tvar
pero.StartCap = LineCap.NoAnchor;
// na konci usecky bude sipka
pero.EndCap = LineCap.ArrowAnchor;
g.DrawLine(pero, new Point(10, 10), new Point(this.Width - 20, 10));
}
|
Kreslit tedy umíme, ale co kdyby jsme si chtěli nakreslený tvar vybarvit, jak tedy na to? Není nic jednoduššího než pouze vytvořit objekt typu Brush a zavolat metodu Fillx ( kde x je např. Rectangle, Region, atd)
private void FormOnPaint(object sender, PaintEventArgs e)
{
// vytvorim objekt typu Graphics
Graphics g = this.CreateGraphics();
// vytvorim si pero, kterym budu kreslit jednotlive tvary
// bude mit cernou barvu a sirku 7
Pen pero = new Pen(Color.Black, 7);
// vytvorim si stetec s modrou barvou
Brush stetec = Brushes.Blue;
// nakreslim obdelnik od bodu 10,10
// o delce 100 a sirce 50
g.DrawRectangle(pero, 10, 10, 100, 50);
// plochu obdelniku 'natru' mym stetcem
g.FillRectangle(stetec, 10, 10, 100, 50);
}
|
Kreslení a vybarvování jednoduchých tvarů jsme zvládli, takže se budeme moci podívat na prác s obrázky, ale ještě předtím si ukážeme jak změnit tvar celého formuláře. Postup je následující:
- vytvoříme objekt typu GraphicsPath
GraphicsPath path = new GraphicsPath();
|
- pomocí jednotlivých bodů si nadefinujeme tvar formuláře
Point[] pointsA = new Point[]
{
new Point(100,100),
new Point(0,100),
new Point(0,300),
new Point(100,300),
new Point(100,400),
new Point(300,400),
new Point(300,300),
new Point(400,300),
new Point(400,100),
new Point(300,100),
new Point(300,0),
new Point(100,0),
new Point(100,100),
};
|
- body přidáme do kolekce "křivek"
path.AddCurve(pointsA);
// dve "diry" ve formulari
path.AddEllipse(130, 50, 50, 50);
path.AddEllipse(220, 50, 50, 50);
|
- vytvoříme instanci objektu typu Region a jako parametr předáme náš objekt path ( GraphicsPath)
this.Region = new Region(path);
|
Výsledkem těchto kroků bude formulář s ne příliš častým tvarem, ale kdo ho chce vidět, bude si muset kód vložit do VS a spustit :-P