Skip Navigation Links.
Skip Navigation Links.

.net student

microsoft

Vyhledávání v obsahu portálu


Přihlášení uživatele

Přihlášení uživatele

Členové:
  • Poslední nový uživatel Poslední: felhell
  • Nový dnes Dnes nových 2
  • Nový včera Včera nových: 5
  • Počet uživatelů: Celkem: 4412
Lidé online:
  • Návštěvníci: Návštěvníků: 30
  • Registrovaných Členů: 0
  • Celkem Celkem: 30
Mapa Stranek

MCTS 5. díl - Grafika

Tentokráte po delší době způsobené prázdninami Vás opět vítám u dalšího dílu MCTS seriálu. V dnešním díle se zaměříme na možnosti grafiky v .NET Frameworku. Ukážeme si jak nakreslit jednotlivé tvary, vytvořit vlastní tvar formuláře či přidat "copyright" ke svým fotografiím.

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

Lukáš Kubis :: 4. září 2008 :: 524 shlédnutí :: 0 komentářů
kategorie: Obecná .Net témata, Vývoj Windows aplikací

Comments

Nyní zde nejsou žádné kometáře. Buďte první!
Musíte být přihlášen pro posílání komentářů. Přihlásit se můžete zde
Přehled posledních diskuzí

Přehled posledních diskuzí

  1. Nekultura výlepu plakátů [11.21.2008 8:00 dop.]
    Proč proboha je na FEL ČVUT na Karláku budova polepena plakáty na zdech, přímo na omítce? Vrcholnou ukázkou je zeď před ...
  2. RE: SQL server 2008 MSDN AA [11.11.2008 7:26 odp.]
    Diky, ale tim to bohuzel neni.
  3. Dotaz na organizátory MS Festu [11.10.2008 4:31 odp.]
    Ahoj MSP,rád bych se zeptal jednoho z organizátorů MS Festu na jeden nestandardní dotaz, který se mi nechce psát na veře...
  4. RE: SQL server 2008 MSDN AA [11.08.2008 1:51 odp.]
    Dobrý den,pro spuštění instalace SQL Serveru 2008 je třeba mít nainstalován .NET Framework 3.5 Service Pack 1 - je to uv...
Novinky z klubů

Novinky z klubů

  1. Programátorské večery: Tipy a triky pro Visual Studio 13. listopadu 2008
    S Visual Studiem pracujeme každý den, ale málokdo zná šechny užitečné klávesov...
  2. Programátorské večery: PowerShell 12. listopadu 2008
    Platformu PowerShell již netřeba představovat. Co ovšem přináší pro .NET programátory...
  3. Programátorské večery: Entity Framework 30. října 2008
    Na této akci bude představena technologie Entity Framework. Podíváme se na tato témata: ...
  4. Programátorské večery: LINQ 26. října 2008
    LINQ je nový revoluční přístup pro práci s daty, který přichází s .NET ...
Co se píše jinde

Co se píše jinde

Řešení problémů s identitou webu u Personal Information Cards

Téměř přesně před rokem jsem si v článku Jak se zjišťuje identita webu u Personal Information Cards? stěžoval na to, ...

TechEd Developers 2008: Den druhý až čtvrtý

Konečně jsem získal dostatek času, abych sepsal zážitky z druhého až čtvrtého dne TechEdu.

TechEd Developers 2008: Den první

První den TechEdu je vždycky takový nanečisto, ostatně jsou v něm jenom dva přednáškové sloty. A keynote. Na co že se...

Výběr serveru

Výběr vhodného serveru představuje volbu při níž musíme přihlédnout k mnoha kritériím, které lze shrnout do následují...

Podívejte se své cache na zoubek

Robustní cacheovací mechanismus je jedna z nejužitečnějších technologií, jaké ASP.NET nabízí. Při vhodném použití můž...