Получение объекта Graphics и его уничтожение



Графические возможности Visual Studio

 

Вывод графических изображений средствами . NET Framework

 

Как и другие системы программирования, Visual Studio позволяет разрабатывать приложения, которые могут работать с графикой.

Вывод графики осуществляется на поверхность рисования GDI + (Graphics Device Interface). GDI – это интерфейс Windows для представления графических объектов и передачи их на устройства отображения, такие как мониторы и принтеры. GDI отвечает за отрисовку линий и кривых, отображение шрифтов и обработку палитры, но не отвечает за отрисовку окон, меню и т.п. В GDI + добавлены такие возможности, как сглаживание линий, использование координат с плавающей точкой, градиентная заливка, внутренняя поддержка современных графических форматов (таких как JPEG и PNG) и т.п.

Существуют три основных типа поверхностей рисования: 1) экранные формы и управляющие элементы на экране (оконные элементы управления), 2) растровые изображения в памяти, 3) страницы, посылаемые на принтер. В данной работе обращение к принтеру рассматриваться не будет.

На платформе . NET поверхности рисования GDI + инкапсулированы в классе Graphics из пространства имён System.Drawing.

Методы класса Graphics

 

Все методы рисования являются методами класса Graphics (табл. 1) и начинаются с префикса Draw или Fill. Методы Draw рисуют прямые и кривые; методы Fill служат для заливки областей. Каждый из методов имеет по несколько перегрузок, выполняющих те же действия, но принимающих параметры другого типа, чтобы избежать лишних преобразований типов данных. Все методы, рисующие линии или контуры, используют перо (Pen ). При вызове методов, производящих закраску области или вывода закрашенной фигуры, передаётся параметр «кисть» (Brush).

Таблица 1. Основные методы класса Graphics

Метод Описание
Clear() Очищает всю поверхность рисования и выполняет её заливку указанным цветом
CopyFromScreen() Выполняет копирование screenshot’а заданного фрагмента экрана на поверхность рисования объекта Graphics
DrawArc() Рисует дугу, представляющую собой часть эллипса
DrawBezier() Рисует кривую Безье, определяемую четырьмя структурами Point
DrawBeziers() Рисует последовательность кривых Безье из массива структур Point
DrawClosedCurve()  Строит замкнутую кривую, определяемую массивом структур Point
DrawCurve() Строит кривую через точки указанного массива структур Point
DrawEllipse() Рисует эллипс, определённый ограничивающим прямоугольником
DrawIcon() Формирует изображение, представленное объектом Icon, располо-женное по указанным координатам
DrawIconUnstretched() Формирует изображение, представленное указанным объектом Icon, без его масштабирования
DrawImage() Рисует указанный объект Image в заданном месте, используя исходный размер
DrawImageUnscaled() Рисует заданное изображение, используя его исходный фактический размер, в месте, задаваемом парой координат
DrawImageUnscaled AndClipped() Рисует заданное изображение без масштабирования и при необходимости обрезает его, чтобы оно вмещалось в указываемом прямоугольнике
DrawLine() Проводит линию, соединяющую две точки, задаваемые парами координат
DrawPath() Рисует объект GraphicsPath
DrawPie() Рисует сектор, определяемый эллипсом
DrawPolygon() Рисует многоугольник, определяемый массивом структур Point
DrawRectangle() Рисует прямоугольник
DrawRectangles() Рисует набор прямоугольников, определяемых структурами Rectangle
DrawString() Выводит указанную текстовую строку в заданном месте с помощью объектов Brush и Font
ExcludeClip() Обновляет вырезанную область данного объекта Graphics, чтобы исключить из неё часть, определяемую структурой Rectangle
FillClosedCurve() Заполняет внутреннюю часть замкнутой кривой, определяемой массивом структур Point
FillEllipse() Заполняет внутреннюю часть эллипса, определяемого ограничивающим прямоугольником
FillPath() Заполняет внутреннюю часть объекта GraphicsPath
FillPie() Заполняет внутреннюю часть сектора, определяемого эллипсом
FillPolygon() Заполняет внутреннюю часть многоугольника, определяемого массивом точек, заданных структурами Point
FillRectangle() Заполняет внутреннюю часть прямоугольника
FillRectangles() Заполняет внутреннюю часть набора прямоугольников, определяемых структурами Rectangle
Flush() Вызывает принудительное выполнение всех отложенных графических операций
FromImage() Создает новый объект Graphics из указанного объекта Image
GetNearestColor() Получает цвет, ближайший к указанному
IntersectClip() Обновляет вырезанную область данного объекта Graphics, включая в неё пересечение текущей вырезанной области и указанной структуры Rectangle
IsVisible() Указывает, содержится ли точка в видимой вырезанной области данного объекта Graphics
MeasureString() Измеряет указанную строку с помощью заданного объекта Font
ResetClip() Сбрасывает вырезанную область данного объекта Graphics и делает её бесконечной
SetClip() Задаёт вырезанную область данного объекта Graphics равной свойству Clip указанного объекта Graphics
TranslateClip() Сдвигает вырезанную область данного объекта Graphics в указанном объёме в горизонтальном и вертикальном направлениях

 

Получение объекта Graphics и его уничтожение

 

Объект Graphics для некоторого окна можно получить двумя путями. Первый заключается в использовании события Paint, которое наследуется от класса Control:

 

private void formGraph_Paint(object sender, PaintEventArgs e) {

System.Drawing.Graphics canvas = e.Graphics;

}

 

Если требуется выполнять рисование в окне непосредственно, не дожидаясь наступления события Paint, доступ к объекту Graphics можно получить с помощью метода CreateGraphics() данного окна, который представляет собой метод, наследуемый от класса Control. Например, для формы:

 

private void buttonDraw_Click(object sender, EventArgs e) {

Graphics canvas = this.CreateGraphics();

canvas.Dispose();

}

 

Механизм «сборщика мусора», реализованный в .NET Framework, не гарантирует решение всех проблем только в автоматическом режиме. Существует классы, которые хотя и являются «управляемыми», но предоставляют «неуправляемый» ресурс (ресурс операционной системы), например, файл, соединение с базой данных, битовую карту и т.д. Нежелательно оставлять эти ресурсы занятыми до следующего сбора мусора, который может случиться только через несколько часов. Такие классы поддерживает модель освобождения ресурсов и реализуют интерфейс IDisposabie, т.е. обладает методом Dispose(), который можно явно вызвать для освобождения ресурса, оболочкой которого является объект (Для удобства некоторые классы, поддерживающие модель освобождения, заодно поддерживают более привычный метод Close(), но для модели освобождения он необязателен). Память, занятая самим объектом в управляемой куче, при этом не освобождается. Сборщик мусора по-прежнему отвечает за освобождение памяти объекта.

Одним из таких классов является Graphics. Использование метода Dispose() необходимо, если объект Graphics создаётся обращением к методу CreateGraphics(). Однако в событии Paint этот объект не создаётся, и, соответственно, метод Dispose() не нужен.

В .NET Framework предусмотрена конструкция using (не путать с одноимённой директивой, используемой в начале модуля), которая может использоваться для принудительного обращения к методу Dispose(). Этот метод автоматически вызывается, как только происходит выход из области действия данного объекта. Например:

 

using (Graphics canvas = this.CreateGraphics()) {

canvas.DrawLine(Pens.Red, 1, 1, 100, 150); }

 

Эквивалентом этой конструкции является блок try-finally.

Метод Dispose() необходимо вызывать и для объектов других «графических» классов, реализующих интерфейс IDisposabie, таких как Pen, Brush, Image (Bitmap), Font и др.


Дата добавления: 2019-03-09; просмотров: 279; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!