Класа за рад са графиком

Класа Graphics представља основни интерфејс за цртање графике у GDI+ (енгл. Graphics Device Interface Plus) систему програмског језика C# и налази се у именском простору System.Drawing. Омогућава цртање различитих графичких елемената као што су линије, облици, слике, текст и друге визуелне компоненте, на различитим површинама (нпр. у прозору, контроли или слици). Неке од често коришћених метода ове класе су:

  • DrawLine,

  • DrawRectangle и FillRectangle,

  • DrawEllipse и FillEllipse,

  • DrawPolygon и FillPolygon и

  • DrawString.

Постоји више начина за добијање објекта класе Graphics. Први и најпоузданији начин је добијање графичког контекста из објекта PaintEventArgs унутар метода OnPaint. Ово је најбољи приступ за цртање у Windows Forms апликацијама, јер осигурава да се графика исправно освежава. На пример, ако је потребно да нацрташ црну линију од координате \((0,0)\) до координате \((100,100)\), OnPaint метода може да изгледа овако:

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    Graphics g = e.Graphics;
    g.DrawLine(Pens.Black, 0, 0, 100, 100);
}

PaintEventArgs

Мање поуздан начин за креирање графичких објеката је помоћу CreateGraphics() методе која се користи када је потребно динамичко цртање. Тај начин се не препоручује јер није гарантовано да ће се графика задржати након освежавања прозора, тј. цртеж се неће задржати ако дође до освежавања прозора, минимизовања, прекривања или промене величине прозора:

Graphics g = this.CreateGraphics();
g.DrawLine(Pens.Black, 0, 0, 100, 100);
g.Dispose();

Трећи начин се користи када треба да црташ на слици тј. битмапи. Тада можеш да користиш класу Bitmap и креираш графички објекат из ње. На пример, ако желиш да креираш слику димензија 320х240, на којој је нацртана црна линија од координате \((0,0)\) до координате \((100,100)\), кôд твог програма може да изгледа овако:

Bitmap bmp = new Bitmap(320, 240);
using(Graphics g = Graphics.FromImage(bmp))
{
    g.DrawLine(Pens.Black, 0, 0, 100, 100);
}
bmp.Save("line.png");

GraphicsFromImage

Неке од основних метода класе Graphics обухватају цртање линија, правоугаоника, елипса, текста, слика и др. На пример, нека је задатак да на форми нацрташ једноставну сцену на којој се види пун месец и кућица, на пример овако…

GraphicsFromImage

…одговарајући програм може да изгледа овако:

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    Graphics g = e.Graphics;
    g.FillEllipse(Brushes.Yellow, 30, 30, 70, 70);
    g.DrawEllipse(Pens.Black, 30, 30, 70, 70);
    g.FillRectangle(Brushes.DarkKhaki, 100, 150, 200, 150);
    g.DrawRectangle(Pens.Black, 100, 150, 200, 150);
    Point[] krov = { new Point(100, 150), new Point(200, 50), new Point(300, 150) };
    g.FillPolygon(Brushes.DarkRed, krov);
    g.DrawPolygon(Pens.Black, krov);
    g.FillRectangle(Brushes.Blue, 170, 220, 50, 80);
    g.DrawRectangle(Pens.Black, 170, 220, 50, 80);
    g.FillRectangle(Brushes.Green, 120, 170, 40, 40);
    g.DrawRectangle(Pens.Black, 120, 170, 40, 40);
    g.FillRectangle(Brushes.Green, 240, 170, 40, 40);
    g.DrawRectangle(Pens.Black, 240, 170, 40, 40);
}

e.Graphics је објекат који представља графички контекст прозора или контроле, који се добија из аргумента PaintEventArgs e, који Windows Forms прослеђује када је потребно да се прозор освежи. Метода FillEllipse црта пун месец жуте боје на задатим координатама, задате величине. Метода DrawEllipse црта контуру тог истог круга црном бојом. Слично, метода FillRectangle попуњава тело кућице зелено-смеђом бојом, а метода DrawRectangle црта ивицу тела кућице црном бојом. Дефинисани низ Point[] садржи три тачке крова, који се попуњава тамно-црвеном бојом са црном ивицом. Потом се цртају врата као правоугаоник плаве боје са црном ивицом. Два прозора су зелени правоугаоници са црним ивицама. Све је нацртано унутар OnPaint метода, што значи да ће се поново исцртати сваки пут када се прозор освежи.

У свим примерима до сада користили су се објекти Pens или Brushes. Pens је класа која садржи унапред дефинисане Pen објекте за најчешће боје. Brushes је слична класа која садржи унапред дефинисане Brush објекте за стандардне боје. Ови објекти представљају такозване дељене (енгл. shared) ресурсе и не требаш их ослобађати методом Dispose() или их постављати у using блокове. Њима управља .NET Framework и води рачуна о ослобађању.

Насупрот њима, када будеш користио објекте класа Pen за цртање ивица (линија, контура правоугаоника, елипси, полигона…) или Brush за попуњавање унутрашњости облика (правоугаоника, елипси, полигона…) онда мораш ручно ослободити ресурсе методом Dispose() или их поставити у using блоку.

Много више о методама и својствима класе Graphics учићеш у наредним лекцијама.