close

Вход

Забыли?

вход по аккаунту

?

Урок 2 (3)

код для вставкиСкачать
Урок 2. Графические методы
Гарнаев А. Visual Basic .NET. Разработка приложений. Глава 12.
Общие сведения о векторной графике
Рисование линий, прямоугольников и других фигур с использованием интерфейса GDI+ происходит в некоторой системе координат. Пользователь может выбрать одну из многих реализованных систем координат, но по умолчанию используется плоская декартова система координат, начало координат которой расположено в верхнем левом углу экрана, ось X направлена вправо, а ось Y - вниз. Единицей измерения в заданной по умолчанию системе координат является пиксель (минимальный элемент изображения).
Изображение на мониторе компьютера формируется как прямоугольный массив точек (пикселей), являющихся минимальными элементами изображения. Количество пикселей, отображаемых на экране, зависит от типа монитора. Количество пикселей, отображаемых на экране конкретного монитора, может быть изменено пользователем в определенных пределах.
При использовании интерфейса GDI+ для рисования линии, прямоугольника или формы необходимо указывать определенные ключевые данные, задающие параметры рисуемого элемент. Например, отрезок задается координатами двух точек, а прямоугольник - точкой, шириной и высотой. Интерфейс GDI+ взаимодействует с программным обеспечением драйвера экрана, чтобы определить, какие пиксели экрана должны быть высвечены, чтобы на экране возникло изображение линии, прямоугольника или кривой. На приведенном ниже рисунке показаны пиксели, высвечиваемые, чтобы отобразить отрезок прямой линии от точки с координатами (4, 2) до точки с координатами (12, 8).
За время развития компьютерной графики были выделены геометрические фигуры, наиболее полезные при создании двухмерных изображений. Все эти элементы поддерживаются интерфейсом GDI+, ниже приведен их полный список:
* Строки
* Прямоугольники
* Эллипсы
* Дуги
* Многоугольники
* Фундаментальные сплайны
* Сплайны Безье
Графические методы
Графические методы - это функции, которые содержатся в языке VB и вызываются во время выполнения программы.
С помощью графических методов можно рисовать на форме, на кнопке, на текстовом поле, на графическом поле PictureBox или на других элементах управления. Для обеспечения рисования в VB имеется специальный класс Graphics, расположенный в пространстве имен System.Drawing. Его код и содержит программы для рисования фигур и для другой работы с графической информацией.
В Обозревателе объектов (F2) можно просмотреть свойства и методы класса Graphics. Среди них много методов рисования фигур (например, все те, что начинаются на Draw и Fill).
http://msdn.microsoft.com/ru-ru/library/system.drawing.graphics.aspx
Перед тем как рисовать линии и фигуры, отображать текст, выводить изображения и управлять ими необходимо создать объект Graphics. Объект - это "копия", экземпляр класса, обладающий всеми нужными его возможностями. Объект Graphics представляет поверхность рисования GDI+ и используется для создания графических изображений.
Класс Graphics предоставляет методы для вывода объектов в устройстве отображения. Объект Graphics связан с конкретным контекстом устройства.
Ниже представлены два этапа работы с графикой.
1. Создание объекта Graphics.
2. Использование объекта Graphics для рисования линий и фигур, отображения текста или изображения и управления ими.
Создание объекта Graphics
http://msdn.microsoft.com/ru-ru/library/5y289054.aspx
Существуют различные способы создания графических объектов. Один из них: Вызвать метод CreateGraphics элемента управления или формы, чтобы получить ссылку на объект Graphics, соответствующий поверхности рисования этой формы или элемента управления. Этот подход используется, если необходимо рисовать на поверхности уже существующей формы или элемента управления.
Существует еще такое требование: форме и каждому элементу управления - свой объект класса Graphics. Например, для рисования на форме, двух метках и на графическом поле PictureBox необходимо создать 4 объекта класса Graphics:
Dim g As Graphics = Me.CreateGraphics
Dim g1 As Graphics = Label1.CreateGraphics
Dim g2 As Graphics = Label2.CreateGraphics
Dim g3 As Graphics = PictureBox1.CreateGraphics
Можно также создать объект Graphics из изображения, используя метод FromImage. Dim myBitmap as New Bitmap("myPict.bmp")
Dim g as Graphics = Graphics.FromImage(myBitmap)
Некоторые методы класса Graphics
* Clear - Очищает всю поверхность рисования и выполняет заливку поверхности указанным цветом фона.
Используя объект Graphics, можно нарисовать много разных фигур и линий. К этим методам относятся * DrawLine - Проводит линию, соединяющую две точки,
* DrawRectangle - Рисует прямоугольник,
* DrawEllipse - Рисует эллипс, определяемый ограничивающим прямоугольником,
* DrawArc - Рисует дугу, которая является частью эллипса,
* DrawPie - Рисует сектор, который определяется эллипсом и двумя радиальными линиями,
* DrawPolygon - Рисует многоугольник, определяемый массивом точек,
* DrawRectangles - Рисует набор прямоугольников
* DrawLines - Рисует набор сегментов линий, которые соединяют массив точек,
* DrawCurve - Строит фундаментальную кривую через точки указанного массива точек,
* DrawClosedCurve - Строит замкнутую фундаментальную кривую,
* DrawBezier - Рисует кривую Безье,
* DrawPath - Рисует объект GraphicsPath.
* DrawString - Создает указываемую текстовую строку в заданном месте с помощью определяемых объектов Brush и Font
Рисунки и значки можно также рисовать с помощью методов:
* DrawImage - Рисует заданный объект Image в заданном месте,
* DrawIcon - Формирует изображение, представленное указанным объектом Icon, расположенным по указанным координатам,
* DrawImageUnscaled - Рисует заданное изображение в заданном месте, используя его исходный фактический размер,
* DrawImageUnscaledAndClipped - Рисует заданное изображение без масштабирования и при необходимости обрезает его, чтобы оно вмещалось в указываемом прямоугольнике,
* CopyFromScreen - Выполняет передачу данных о цвете, соответствующих прямоугольной области пикселей, блоками битов с экрана на поверхность рисования
Методы прорисовки залитых объектов:
* FillRectangle - Заполняет внутреннюю часть прямоугольника
* FillEllipse - Заполняет внутреннюю часть эллипса,
* FillPie - Заполняет внутреннюю часть сектора, определяемого эллипсом и двумя радиальными линиями,
* FillPolygon - Заполняет внутреннюю часть многоугольника, определяемого массивом точек
* FillClosedCurve - Заполняет внутреннюю часть замкнутой фундаментальной кривой, определяемой массивом точек,
* FillPath - Заполняет внутреннюю часть объекта GraphicsPath,
* FillRegion - Заполняет внутреннюю часть объекта Region
Кроме того, можно манипулировать системой координат, используемой объектом Graphics.
Для любого объекта, потребляющего системные ресурсы (например, для объектов Pen и Graphics), всегда нужно вызывать метод Dispose.
Основные объекты, используемые с объектом Graphics.
Класс Pen http://msdn.microsoft.com/ru-ru/library/system.drawing.pen.aspx
http://msdn.microsoft.com/ru-ru/library/8z5dw491.aspx
Служит для рисования линий, контуров и отрисовки других геометрических объектов. При создании объекта Pen можно указать несколько атрибутов. Например, один из конструкторов Pen позволяет указывать при создании объекта его цвет и ширину.
Объект Pen рисует линию заданной ширины и указанного стиля. Объект Pen также разрешает изменять значения некоторых своих свойств, таких как DashStyle, которое используется для рисования разнообразных штрих-пунктирных линий. Нарисованную при помощи объекта Pen линию можно заполнить, используя различные стили заливки, включая сплошные цвета и текстуры. Стиль заливки зависит от кисти или текстуры, выбранной в качестве объекта заполнения.
Изменяя значения свойств объекта Pen, можно задать многие атрибуты линии. Свойства StartCap и EndCap определяют вид конечных точек отрезка. Конец отрезка может быть плоским, квадратным, круглым, треугольным или иметь произвольную форму. Свойство LineJoin позволяет указывать, должны ли соединяемые линии соединяться под углом (с выступающими острыми углами), со скошенными, закругленными или обрезанными краями. На приведенном ниже примере демонстрируются различные стили завершения и соединения линий.
Dim p As New Pen(Color.Blue, 2)
p.DashStyle = Drawing2D.DashStyle.Dash
p.EndCap = Drawing2D.LineCap.Round
p.StartCap = Drawing2D.LineCap.ArrowAnchor
Класс Brush
http://msdn.microsoft.com/ru-ru/library/system.drawing.brush.aspx
http://msdn.microsoft.com/ru-ru/library/cwka53ef.aspx
Служит для заливки областей, например фигур, изображений или текста.
Замкнутые фигуры, такие как прямоугольники или эллипсы, состоят из двух частей - из контура и из внутренней области. Контур рисуется с помощью пера, а внутренняя область заливается с помощью кисти. В GDI+ имеется несколько классов кистей для заливки замкнутых фигур: SolidBrush, HatchBrush, TextureBrush, LinearGradientBrush и PathGradientBrush. Все эти классы являются производными от класса Brush. На приведенном ниже рисунке изображен прямоугольник, залитый сплошной кистью, и эллипс, залитый штриховой кистью.
Dim b As New SolidBrush(Color.Blue)
или
Dim b = Brushes.Aqua
При заливке формы штриховой кистью необходимо задать основной цвет, цвет фона и стиль штриховки. Основной цвет определяет цвет штриховки.
В GDI+ имеется более 50 стилей штриховки; на следующем рисунке показаны стили Horizontal, ForwardDiagonal и Cross.
Текстурная кисть позволяет заливать фигуру с использованием узора, сохраненного в виде растрового изображения. В GDI+ имеется два типа градиентных кистей: кисти линейного градиента и кисти градиента контура. Кисти линейного градиента можно использовать для заливки фигуры цветом, постепенно меняющимся от одного края фигуры до другого по горизонтали, по вертикали или по диагонали.
Класс Font
Содержит описание фигур, которые должны использоваться при отрисовке текста. Определяет конкретный формат текста, включая начертание шрифта, его размер и атрибуты стиля.
http://msdn.microsoft.com/ru-ru/library/system.drawing.font.aspx
Dim f As New Font("Arial", 10, FontStyle.Italic)
Структура Color
Содержит различные цвета. Представляет цвета в терминах каналов альфа, красного, зеленого и синего (ARGB). http://msdn.microsoft.com/ru-ru/library/system.drawing.color.aspx
Именованные цвета представляются с помощью свойств структуры Color. Цвета по имени библиотеки MSDN: http://msdn.microsoft.com/en-us/library/aa358802.aspx.
Цвет каждого пикселя представляется 32-битным числом: по 8 бит для интенсивности альфа-канала, красного, зеленого и синего (ARGB). Каждый из четырех указанных компонентов представляет собой число от 0 до 255, где 0 соответствует нулевой интенсивности, а 255 - наибольшей интенсивности. Альфа-компонент определяет прозрачность цвета: 0 соответствует полной прозрачности, а 255 - полной непрозрачности. Чтобы определить альфа-, красный, зеленый или синий компоненты цвета, можно использовать свойство A, R, G или B, соответственно. Пользовательский цвет можно создать с помощью одного из методов FromArgb. Если этот метод используется с тремя параметрами, то это красный, зеленый или синий компоненты цвета. Например:
FromArgb (255, 0, 0)Красный цветFromArgb (0, 255, 0)Зеленый цветFromArgb (0, 0, 255)Синий цветFromArgb (255, 255, 0)Желтый цветFromArgb (0, 0, 0)Черный цветFromArgb (255, 255, 255)Белый цветFromArgb (90, 90, 90)Темно-серый цветFromArgb (220, 220, 220)Светло-серый цвет Чем меньше каждой краски мы положим, тем темнее будет цвет, чем больше - тем светлее.
Функция FromArgb позволяет управлять прозрачностью цвета. Для этого используется ее вариант не с тремя, а с четырьмя параметрами. Второй, третий и четвертый параметры имеют привычный нам смысл количества красной, зеленой и синей краски. А вот первый параметр определяет прозрачность цвета. Если он равен 255, то цвет полностью непрозрачен, а если 0 - то полностью прозрачен (невидим).
Также возможно использовать функцию FromArgb с двумя параметрами: первый определяет прозрачность цвета, а второй - сам цвет по имени.
Dim c1, c2, c3 As Color
'Непрозрачный случайный цвет
c1 = Color.FromArgb(Int(Rnd() * 256), Int(Rnd() * 256), Int(Rnd() * 256))
'Полупрозрачный синий цвет
c2 = Color.FromArgb(127, 0, 0, 255)
'Полупрозрачный зеленый цвет
c3 = Color.FromArgb(127, Color.Green)
Для определения цвета рисования можно также использовать системные цвета. Это те цвета, на которые настроены элементы Windows: окна, их заголовки, цвет текста в заголовках, меню и т.д. Несистемные цвета VB предоставлял в структуре Color и в классах Pens и Brushes пространства имен System.Drawing. Системные же цвета находятся соответственно в классах SystemColors, SystemPens и SystemBrushes пространства имен System.Drawing.
Если вы не используете в своем проекте системных цветов, цвета вашего приложения на любом компьютере будут одинаковы независимо от настроек Windows.
Опасайтесь делать цвета одних элементов проекта системными, а других - несистемными.
Рисование фигур и изображений и управление ими
После создания объекта Graphics его можно использовать для рисования линий и фигур, отображения текста или изображения и управления ими.
Очистка изображения
Прежде чем создавать новое изображение, часто бывает необходимо вытереть старое. Для этого используется метод Clear. Очищает всю поверхность рисования и выполняет заливку поверхности указанным цветом фона.
Синтаксис метода:
object.Clear (Color.Цвет)
Отрезки прямых
http://msdn.microsoft.com/ru-ru/library/system.drawing.graphics.drawline.aspx
Рисуются методом DrawLine. Отрезок прямой можно построить, если известно положение двух его крайних точек. Они задаются в обращении к методу. Первая пара параметров вслед за указанием пера - координаты одной точки (любой из двух), вторая пара - другой. Первое число в каждой паре - горизонтальная координата, второе число - вертикальная.
Синтаксис метода:
object.DrawLine (Pens.Цвет, x1, y1, x2, y2)
Пример прорисовки зеленой линии из левого верхнего угла формы в правый нижний:
Dim g As Graphics = Me.CreateGraphics
Dim GreenPen As New Pen(Color.Green, 3)
Dim x1 As Integer = 0
Dim y1 As Integer = 0
Dim x2 As Integer = Me.ClientSize.Width
Dim y2 As Integer = Me.ClientSize.Height
g.DrawLine(GreenPen, x1, y1, x2, y2)
Прямоугольники и квадраты http://msdn.microsoft.com/ru-ru/library/system.drawing.graphics.drawrectangle.aspx
http://msdn.microsoft.com/ru-ru/library/system.drawing.graphics.fillrectangle.aspx
Рисуются методами DrawRectangle (контур) и FillRectangle (заливка).
Прямоугольник можно построить, если известно положение его верхнего левого угла, ширина и высота. Четыре параметра в скобках вслед за указанием пера (или кисти) и определяют эти величины. Синтаксис метода:
object.FillRectangle (Brushes.Цвет, x, y, width, height)
object.DrawRectangle (Pens.Цвет, x, y, width, height)
Пример прорисовки голубого квадрата с синим контуром в центре формы:
Dim g As Graphics = Me.CreateGraphics
Dim p As New Pen(Color.Blue, 3)
Dim b As New SolidBrush(Color.SkyBlue)
Dim x As Integer = Me.ClientSize.Width \ 2
Dim y As Integer = Me.ClientSize.Height \ 2
Dim w As Integer = 100
Dim h As Integer = 100
g.FillRectangle(b, x - w \ 2, y - h \ 2, w, h)
g.DrawRectangle(p, x - w \ 2, y - h \ 2, w, h)
Объект Rectangle содержит методы и свойства, позволяющие задавать и извлекать данные о прямоугольнике. Например, методы Inflate и Offset позволяют изменять размер и расположение прямоугольника. Метод IntersectsWith позволяет определить, не пересекается ли данный прямоугольник с некоторым указанным прямоугольником, а метод Contains позволяет определить, находится ли указанная точка внутри данного прямоугольника.
Эллипсы и круги
Рисуются методами DrawEllipse (контур) и FillEllipse (заливка).
Они рисует эллипс, определенный ограничивающим прямоугольником, заданным с помощью пары координат, ширины и высоты.
Синтаксис метода:
object.FillEllipse (Brushes.Цвет, x, y, width, height)
object.DrawEllipse (Pens.Цвет, x, y, width, height)
Пример прорисовки голубого круга с синим контуром, касающегося либо верхнего и нижнего краев формы, либо правого и левого:
Dim w, h, d, x, y As Integer
Dim g As Graphics = Me.CreateGraphics
w = Me.ClientSize.Width
h = Me.ClientSize.Height
d = Math.Min(w, h)
x = w \ 2
y = h \ 2
g.FillEllipse(Brushes.Aqua, x - d \ 2, y - d \ 2, d, d)
g.DrawEllipse(Pens.Blue, x - d \ 2, y - d \ 2, d, d)
Дуги и сектора
http://msdn.microsoft.com/ru-ru/library/hk087c6d.aspx
http://msdn.microsoft.com/ru-ru/library/system.drawing.graphics.drawarc.aspx
Дуги рисуются методом DrawArc. Дуга - это часть эллипса. Поэтому первые пять параметров метода имеют тот же смысл, что и первые пять параметров метода DrawEllipse. Добавляются еще два параметра, задающие в градусах размер и положение дуги на эллипсе (или окружности). На рисунке поясняется смысл этих параметров. Углы измеряются по часовой стрелке, начиная от оси X. Первый из двух параметров указывает начало дуги (30), второй - длину дуги (60).
Синтаксис метода:
object.DrawArc (Pens.Цвет, x, y, width, height, startAngle, sweepAngle)
Если значение параметра sweepAngle больше 360 или меньше -360 градусов, он интерпретируется, соответственно, как 360 или -360 градусов.
http://msdn.microsoft.com/ru-ru/library/system.drawing.graphics.drawpie.aspx
Секторы рисуются методом DrawPie. Этот метод рисует сектор, определяемый дугой эллипса и двумя радиальными линиями, которые пересекаются с конечными точками дуги.
Все параметры имеют тот же смысл, что и в DrawArc.
Синтаксис метода:
object.DrawPie (Pens.Цвет, x, y, width, height, startAngle, sweepAngle)
http://msdn.microsoft.com/ru-ru/library/vstudio/hhfwf6kx%28v=vs.90%29.aspx
Закрашенные секторы рисуются методом FillPie. Этот метод заполняет внутреннюю часть сектора, определяемого дугой эллипса и двумя радиальными линиями, которые пересекаются с конечными точками дуги. Отличается он от DrawPie только наличием кисти вместо пера.
Синтаксис метода:
object.FillPie (Brushes.Цвет, x, y, width, height, startAngle, sweepAngle)
Многоугольники
Чтобы нарисовать многоугольник, используется метод DrawPolygon. Рисует многоугольник, определяемый массивом точек (структур Point). Массив объектов Point содержит точки, которые должны быть соединены отрезками прямых. Каждая пара двух следующих друг за другом точек массива определяет сторону многоугольника. Кроме того, если последняя и первая точки массива не совпадают, то они определяют последнюю сторону многоугольника.
Синтаксис метода:
object.DrawPolygon (Pens.Цвет, Points())
В приведенном ниже примере демонстрируется рисование многоугольника с тремя сторонами. Метод DrawPolygon автоматически замыкает многоугольник, соединяя точки (30, 60) и (0, 0) прямой линией.
Dim PArr As Point() = {New Point(0, 0), New Point(50, 30), New Point(30,60)}
g.DrawPolygon(myPen, PArr)
На приведенном ниже рисунке изображен полученный многоугольник.
Текстовые надписи
http://msdn.microsoft.com/ru-ru/library/system.drawing.graphics.drawstring.aspx
http://msdn.microsoft.com/ru-ru/library/a3a2bads%28v=vs.100%29.aspx
Указываемую текстовую строку в заданном месте создает метод DrawString.
Класс Graphics содержит несколько методов DrawString, позволяющих указывать различные свойства текста, такие как расположение, ограничивающий прямоугольник, шрифт и формат.
Если необходимо нарисовать текст в виде одной горизонтальной строки, которая начинается в указанной точке, тогда используем следующие параметры метода DrawString:
Синтаксис метода:
object.DrawString (s, font, brush, x, y)
s - строка для рисования.
font - объект Font, определяющий формат текстовой строки.
brush - объект Brush, определяющий цвет и текстуру создаваемого текста.
x - координата X верхнего левого угла отображаемого текста.
y - координата Y верхнего левого угла отображаемого текста.
Чтобы нарисовать текст с переносом по строкам внутри прямоугольника, можно воспользоваться методом DrawString, который принимает параметр Rectangle.
Синтаксис метода:
object.DrawString (s, font, brush, layoutRectangle)
layoutRectangle - структура Rectangle, которая задает место расположения создаваемого текста.
Текст, представляемый параметром s, отображается внутри прямоугольника, определяемого параметром layoutRectangle. Если текст не помещается в прямоугольнике, он обрезается до ближайшего слова.
Координаты
Координаты в методах могут быть и отрицательными. В результате вся фигура или ее часть оказывается левей или выше формы и поэтому не видна. Координаты в методах могут быть и слишком большими положительными. В результате вся фигура или ее часть оказывается правей или ниже формы и поэтому не видна.
Освобождение ресурсов системы, используемых объектом
После завершения использования объектов, которые потребляют ресурсы системы, например объектов Graphics или Pen, необходимо вызвать для этих объектов метод Dispose.
Каждый созданный объект, даже если он невидим, расходует ресурсы компьютера. Хорошим тоном у программистов является заботиться о компьютере и не перенапрягать его. Поэтому, когда ясно, что объект отработал свое и больше не понадобится, метод Dispose освобождает все ресурсы, используемые данным объектом Graphics.
g.Dispose()
drawFont.Dispose()
drawBrush.Dispose()
drawPen.Dispose()
Задачи
Задача 1. В контейнере PictureBox нарисовать N наклонных линий таким образом, что самая большая из линий является побочной диагональю контейнера, а остальные линии находятся выше нее на одинаковом расстоянии друг от друга и распределены по контейнеру. Например, N = 4:
Задача 2. В контейнере PictureBox нарисовать 2*N-1 кругов одинакового диаметра, расположенных вдоль горизонтальной прямой. Крайние круги касаются левой и правой границ контейнера. Каждая следующая окружность проходит через центр предыдущего круга. Все окружности имеют одинаковый случайный цвет, а круги чередуются: полупрозрачные синий и зеленый. Например, N = 5:
Задача 3. Создать процедуру, которая рисует кораблик относительно некоторой точки (X,Y). Используя эту процедуру, нарисовать 10 корабликов случайных цветов в случайных местах контейнера PictureBox.
Здесь pct - это контейнер PictureBox.
Документ
Категория
Разное
Просмотров
97
Размер файла
182 Кб
Теги
урок
1/--страниц
Пожаловаться на содержимое документа