ПиОА_1 семестр_1 / ПОСОБИЕ_VB.Net
.pdf
Рис. 9.7 Пример заливки эллипса с использованием метода FromArgb
9.3. Геометрические структуры
При создании графики Visual Basic .NET использует так называемые структуры. Структура является собранием элементов, использование которых в процессе рисования является обязательным условием независимо от вида создаваемого изображения. Понятие «структура» сродни понятию «класс», в некоторых случаях ее рассматривают как частный вид класса. Структуры входят в отведенное для них пространство имен. Например, структуры (Point, Size, Rectangle) относятся к пространству имен System Drawing.
В структуре Point собраны данные о точке. Точку следует рассматривать как обязательную составную часть геометрической фигуры.
Как и у класса, у этой структуры имеются свои конструкторы, свойства и методы. Экземпляр структуры Point создается, как правило, путем указания координат точки:
Dim pt As Point = New Point(100, 100)
или так
pt.X = 100 pt.Y = 100
Структура Size определяет размеры – высоту (Width) и ширину (Height) рисуемой на плоскости геометрической фигуры:
Dim sz As Size = New Size(100, 100) sz.Width = 100
sz.Height = 100
108
С помощью структуры Rectangle создаются прямоугольники. Экземпляры структуры Rectangle используются в качестве параметров многих геометрических фигур. Например, параметры эллипса определяются параметрами прямоугольника, в который этот эллипс вписан.
Для создания прямоугольника необходимо указать координаты его верхнего левого угла, а также ширину и высоту. Например, переменная rect, получает при ее описании значения, которые являются параметрами прямоугольника, и задаются соответствующим конструктором:
Dim rect As Rectangle=New Rectangle(100,200,100, 100)
или так
Dim pt As Point = New Point(100, 100) Dim sz As Size = New Size(100, 100)
Dim rect As Rectangle= New Rectangle (pt, sz)
9.4. Методы класса Graphics
Графические возможности Visual Basic .NET позволяют создавать как отдельные геометрические фигуры, так и различные комбинации из них. Этой цели служат разнообразные методы класса Graphics, которые приведены в табл. 8.1.
|
|
|
Таблица 9.1. Некоторые методы класса Graphics |
|
|
|
|
|
Метод |
|
Вид изображения |
|
DrawArc |
|
Дуга, созданная на основе эллипса |
|
|
|
|
|
DrawCloseCurve |
|
Замкнутая кривая, созданная на основе массива точек |
|
|
|
|
|
DrawCurve |
|
Незамкнутая кривая линия, проходящая через произ- |
|
|
вольное количество точек, хранящихся в массиве |
|
|
|
|
|
|
DrawEllipse |
|
Эллипс, вписанный в прямоугольник |
|
|
|
|
|
DrawLine |
|
Прямая линия, построенная по двум точкам |
|
|
|
|
|
DrawPie |
|
Сегмент |
|
|
|
|
|
DrawPolygon |
|
Многоугольник с произвольным число вершин и сто- |
|
|
рон, хранящихся в массиве |
|
|
|
|
|
|
DrawRectangle |
|
Прямоугольник, построенный по четырем точкам |
|
|
|
|
|
DrawString |
|
Текст |
|
|
|
|
|
|
109 |
|
Существуют также методы, которые рисуют фигуры, заполненные каким-либо цветом. Имена этих методов вместо префикса «Draw» имеют префикс «Fill», например.
FillEllipse |
Заполненный эллипс |
|
|
FillPie |
Заполненный сектор |
|
|
FillPolygon |
Заполненный многоугольник |
|
|
FillRectangle |
Заполненный прямоугольник |
|
|
FillRegion |
Заполненная часть объекта |
|
|
Отрезок прямой линии рисуется методом DrawLine. Параметрами этого метода, кроме пера, являются координаты двух точек – начала и конца линии:
G.DrawLine(New Pen(Color.Red,3),10,10,100,100)
или так:
Dim pen As Pen = New Pen(Color.Black, 3)
Dim ptl As New Point(30, 10)
Dim pt2 As New Point(120, 100)
G.DrawLine(pen, ptl, pt2)
Написать текст на форме или элементе управления можно, воспользовавшись методом DrawString, например,
G.DrawString(S, New Font ("Arial", 16), _
Brushes.Black, 100, 100)
Параметрами этого метода являются: создаваемый текст (S – тип String), тип и размер шрифта (Font), кисть (Brush) и координаты левой верхней точки начала текста (х, у).
Вместо метода Brushes можно использовать такой способ создания кисти
Graph.DrawString("Текст",New Font("Arial", 16), _
New SolidBrush(Color.Red), 100, 100)
110
9.5.Практическая часть. Использование графических возможностей Visual Basic.NET
Построение движения геометрического объекта
В приведенном ниже примере объект Graphics создается с помощью метода CreateGraphics элемента управления
PictureBox.
Задание 9.1. Создать программный код, который будет рисовать окружности диаметром 50 пикселей по диагонали объекта
PictureBox цветами радуги (рис. 9.8). Передвижение объекта осуществляется нажатием кнопки Button1. Начальные значения координат и цвета задаются при загрузке формы.
Public Class Form1
Dim a, b As Int32 'Координаты окружности по оси X и Y
|
Dim j As Int32 |
'Цвет |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
Private Sub Button1_Click (...)... |
||||
|
|
|
|
||
|
Dim col() As _ |
|
Задается массив из 7 цветов |
|
|
|
|
|
|
|
|
Color = {Color.Red, Color.Orange, Color.Yellow, _ Color.Green, Color.DarkBlue, Color.Blue,Color.Violet}
'Создается объект Graph на PictureBox
Dim Graph As Graphics = PictureBox1.CreateGraphics
|
Обновление объекта, если нужно, чтобы |
PictureBox1.Refresh() |
предыдущее изображение стиралось |
'Рисуется окружность цветом col(j) по параметрам, 'заданным в пикселях
Graph.DrawEllipse(New Pen(col(j), 3), _ a * 10, b * 10, 50, 50)
a += 1 |
|
b += 1 |
Изменение координат и цвета |
|
|
j += 1 |
|
|
|
'Цвет задается заново, если все цвета исчерпаны |
|
If j > 6 Then j = 0 |
|
'Условие прекращения построения окружности, если она вышла за границы 'области PictureBox1
111
If (a * 10 + 50 > PictureBox1.Width) Or _
(b * 10 + 50 > PictureBox1.Height) Then
Button1.Enabled = False
End If
End Sub
Private Sub Form1_Load (...)...
a = 0 |
|
||
Задаются начальные значения координат окружности |
|||
b = |
0 |
||
(а, b) и начальный индекс цвета (j) при загрузке формы |
|||
j = |
0 |
||
|
|||
|
|
|
|
End Sub
End Class
Примечание. Для того чтобы при перерисовке предыдущее изображение стиралось, а вместо него, в соответствии с заданными параметрами, создавалось новое, необходимо использовать метод Refresh.
Если метод PictureBox1.Refresh() добавить в начало событийной процедуры построения окружностей, то можно создать динамику движения объекта.
Рис. 9.8 Изменение местоположения и цвета окружности
112
Построение графика функции
Изображение на экране монитора формируется из пикселей, поэтому при построении графика функции y = f (x) на заданном интервале следует вначале декартовы координаты перевести в координаты объекта на котором он рисуется (PictureBox), т.е. определить, сколько пикселей умещается в единицах строящегося графика как по оси X, так и по оси Y (рис. 9.9).
Рис. 9.9 График с сеткой пикселей
Для перевода нужно вычислить масштабные коэффициенты преобразования (Мх, My), а также соответствующие сдвиги (Sx, Sy) для каждой оси:
M x = |
d − Ax1 |
, |
||
xmax − xmin |
||||
|
|
|
||
M y = |
c − Ay1 |
|
, |
|
ymin − ymax |
|
|||
|
|
|
||
Sx = Ax1 − CInt(M x xmin ),
Sy = Ay1 − CInt(M y ymax )
Здесь:
113
xmin , xmax |
Минимальное и максимальное значения аргумента x на отрез- |
||
ке, где строится функция (декартовы координаты) |
|||
ymin , ymax |
Минимальное и максимальное значения функции y на отрезке, |
||
где строится функция (декартовы координаты) |
|||
Ax1, Ax2, |
Отступы в PictureBox, выраженные в пикселях, в область |
||
Ay1, Ay2 |
которых график выводится не будет (см. рис. 9.10); |
||
|
|
|
|
|
|
Высота той части окна в пикселях, куда будет выводится |
|
|
с |
график |
|
|
|
|
|
|
|
c = PictureBox1.Size.Height - Ay1 - Ay2 |
|
|
|
|
|
|
|
Ширина той части окна в пикселях, куда будет выводится |
|
|
d |
график |
|
|
|
|
|
|
|
d = PictureBox1.Size.Width - Ax1 - Ax2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
Рис. 9.10 Определение области построения функции
114
Задание 9.2. Построить график функции I (t) = cos(2t) sin(3t) , используя объект PictureBox (рис. 9.11).
Рис. 9.11 График функции I (t) = cos(2t) sin(3t)
Ниже приведен программный код построения графика функции.
Imports System.Math
Public Class Form1
Dim xmax, xmin As Single Dim ymax, ymin As Single Dim hx, hy As Single
Dim ax1, ax2, ay1, ay2 As Int32 Dim d, c, sx, sy As Int32
Dim m_x, m_y As Single
Dim pn As Pen = New Pen(Color.Red, 3) 'Перо для графика Dim pn1 As Pen = New Pen(Color.Green,1) 'Перо для сетки Dim pn2 As Pen = New Pen(Color. Black,2) 'Перо для осей Dim fn As Font = New Font("Arial",12) 'Шрифт для осей
'Шрифт для засечек
Dim fn1 As Font = New Font("Arial",11)
' Функция f(), график которой рисуется
Private Function f(ByVal x As Single) As Single f = Cos(2 * x) * Sin(3 * x)
End Function
115
'Процедура Extrem() рассчитывает масштаб и смещение по каждой оси
Private Sub Extrem()
m_x = (d - ax1) / (xmax - xmin) 'Масштаб по оси Х m_y = (c - ay1) / (ymin - ymax) 'Масштаб по оси Y 'Смещение по оси Х в пикселях
sx = ax1 – Convert.ToInt32(m_x * xmin)
'Смещение по оси Y в пикселях
sy = ay1 - Convert.ToInt32 (m_y * ymax)
End Sub
'Процедура grid_x рисует линии сетки по оси X
Private Sub grid_x(ByVal Graph As Graphics) Dim x As Single
Dim i, n As Int32
x = xmin : n = Convert.ToInt32((xmax - xmin) / hx) + 1
For i = 1 To n
Graph.DrawLine(pn1, Convert.ToInt32(x * m_x) + sx, _ Convert.ToInt32(ymin * m_y) + sy, _ Convert.ToInt32(x * m_x) + sx, _ Convert.ToInt32(ymax * m_y) + sy)
x += hx
Next i
End Sub
'Процедура grid _y рисует линии сетки по оси Y
Private Sub grid_y(ByVal Graph As Graphics) Dim y As Single
Dim i, n As Int32 y = ymin
n = Convert.ToInt32((ymax - ymin) / hy) + 1
For i = 1 To n
Graph.DrawLine(pn1, Convert.ToInt32(xmin * m_x) + sx, _ Convert.ToInt32(y * m_y) + sy, _ Convert.ToInt32(xmax * m_x) + sx, _ Convert.ToInt32(y * m_y) + sy)
y += hy
Next i
End Sub
116
'Процедура axis_x() рисует и подписывает ось X
Private Sub axis_x(ByVal Graph As Graphics) Graph.DrawLine(pn2, _
Convert.ToInt32(xmin * m_x) + sx, sy, _ Convert.ToInt32(xmax * m_x) + sx, sy)
Graph.DrawString("X", fn, Brushes.Green, _ Convert.ToInt32(xmax * m_x) + sx + 20, sy)
End Sub
'Процедура axis_y() рисует и подписывает ось Y
Private Sub axis_y(ByVal Graph As Graphics) Graph.DrawLine(pn2,sx,_
Convert.ToInt32(ymin * m_y) + sy, _ sx, Convert.ToInt32 (ymax * m_y) + sy)
Graph.DrawString("Y", fn, Brushes.Green, _
sx - 30, Convert.ToInt32 (ymax * m_y) + sy)
End Sub
'Процедура z_x рисует и подписывает засечки по оси X
Private Sub z_x (ByVal Graph As Graphics) Dim i As Single
For i = xmin To xmax Step hx Graph.DrawLine(pn2, _
Convert.ToInt32(i * m_x) + sx, sy, _ Convert.ToInt32(i * m_x) + sx, 5 + sy)
Graph.DrawString(Str(i), fn1, Brushes.Black, _ Convert.ToInt32(i * m_x) + sx - 3, 5 + sy)
Next i
End Sub
'Процедура z_y рисует и подписывает засечки по оси y
Private Sub z_y (ByVal Graph As Graphics) Dim i As Single
For i = ymin To ymax Step hy
Graph.DrawLine(pn2, sx, Convert.ToInt32(i * m_y) + sy, _ 5 + sx, Convert.ToInt32(i * m_y) + sy)
If i <> 0 Then
Graph.DrawString(Convert.ToString(i), fn1, _ Brushes.Black, 3 + sx, Convert.ToInt32(i * m_y) + sy)
End If Next i
End Sub
117
Private Sub Button1_Click(...) ...
Dim Graph As Graphics = PictureBox1.CreateGraphics
Dim h As Single
PictureBox1.Refresh()
ax1 = 20 : ay1 = 20 : ax2 = 30 : ay2 = 15
'Высота в пикселях будущего графика
c = PictureBox1.Size.Height - ay1 - ay2
'Ширина в пикселях будущего графика
d = PictureBox1.Size.Width - ax1 - ax2 xmin = Convert.ToSingle(TextBox1.Text) xmax = Convert.ToSingle(TextBox2.Text) ymin = Convert.ToSingle(TextBox3.Text) ymax = Convert.ToSingle(TextBox4.Text)
hx = Convert.ToSingle(TextBox5.Text)'Шаг по засечкам по оси x hy = Convert.ToSingle(TextBox6.Text)'Шаг по засечкам по оси y
Extrem() 'Вычисление масштаба и смещения по осям grid_x(Graph) 'Прорисовка линий сетки по оси X grid_y(Graph) 'Прорисовка линий сетки по оси Y axis_x(Graph) 'Прорисовка оси X
axis_y(Graph) 'Прорисовка оси Y 'Прорисовка засечек и подписей по оси x и по оси y z_x(Graph) : z_y(Graph)
h = 0.001 'Шаг для графика заданной функции 'Построение графика заданной функции
For x = xmin To xmax Step h
Graph.DrawLine(pn, Convert.ToInt32(x * m_x) + sx, _ Convert.ToInt32(f(x) * m_y) + sy, _ Convert.ToInt32((x + h) * m_x) + sx, _ Convert.ToInt32 (f(x + h) * m_y) + sy)
Next x
End Sub
График функции, построенный по приведенному выше коду, представлен на рис. 9.12.
118
Рис. 9.12 График функции cos(2t)sin(3t), построенный в VB.Net
Для того чтобы построить график другой функции, достаточно: 1. Изменить программный код, задающий вид функции, например:
Private Function f(ByVal x As Single) As Single f = 2 * x ^ 4 - 3 * x ^ 3 + x – 1
End Function
2. Задать размеры графика и шаги для засечек новой функции.
График функции 2x 4 − 3x 3 + x −1 представлен на рис. 9.13.
119
Рис. 9.13 График функции 2x 4 − 3x 3 + x −1, построенный в VB.Net
Примечание. Для правильного задания размеров графика и шагов для засечек по осям следует построить график заданной функции в другом программном средстве, например, в Excel или Scilab.
Построение гистограмм
Используя приведенные в программном коде предыдущего раз-
дела процедуры Extrem(), axis_x(), axis_y(), z_x(), z_y() и метод FillRectangle можно вместо графика нарисовать гистограмму.
120
Задание 9.3. Построить гистограмму, отражающую значения элементов одномерного массива a, состоящего из n элементов, используя объект класса PictureBox. По оси X отображаются индексы элементов массива, по оси Y – значения этих элементов массива
(рис. 9.14).
Dim col() As Color = {Color.Red, Color.Orange, _ Color.Yellow, Color.Green, Color.DarkBlue, _ Color.Blue, Color.Chocolate, Color.Coral, _ Color.Brown, Color.Black}
Dim Graph As Graphics = PictureBox1.CreateGraphics
… … … … … … … … … … … … … … … … … … … … … … … …
PictureBox1.Refresh()
ax1 = 30 : ay1 = 20 : ax2 = 30 : ay2 = 15 c = PictureBox1.Size.Height - ay1 - ay2 d = PictureBox1.Size.Width - ax1 - ax2
xmin = 0 : xmax = n : ymin = 0: ymax = a(0) For i = 0 To n - 1
If a(i) > ymax Then ymax = a(i)
Next i
Extrem() : axis_x(Graph) : axis_y(Graph) hx = 1: hy = 2: z_x(Graph): z_y(Graph)
'Построение гистограммы
For i = 0 To n - 1
Graph.FillRectangle(New SolidBrush(col(i)), _ Convert.ToInt32(i * m_x) + sx, _ Convert.ToInt32(a(i) * m_y) + sy, _ Convert.ToInt32(m_x), _ -Convert.ToInt32(a(i)) * m_y)
Next i
121
Рис. 9.14 Пример построения диаграммы
9.6. Контрольные вопросы и задания
1.Какие пространства имен используются для создания графических объектов?
2.Как можно создать объект (экземпляр класса) Graphics?
3.Опишите систему координат формы.
4.Как изменить цвет пикселя?
5.Что такое Конструктор? Для чего он применяется и как задается?
6.Приведите примеры инструментов для рисования.
7.Какой класс используется для заливки изображения?
8.Как можно задать цвет при рисовании?
9.Приведите примеры методов класса Graphics.
122
10.Какие геометрические структуры вы знаете? Для чего они используются?
11.Для чего используется метод DrawLine?
12.С помощью какого метода выводится текст? Какие параметры указываются для этого метода?
13.Как организовать движение объектов?
14.Какой алгоритм применяется для перевода декартовых координат в пиксели? Почему нужно вычислять масштабные коэффициенты при построении графика функции?
15.Создайте приложение для демонстрации движения геометрического объекта по одной из трех заданных траекторий:
Траектория выбирается пользователем.
16.Создайте приложение для построения графика заданной функции
y = 2 cos(x) − ln(x) − x2 на диапазоне [0; 2]
Вначале исследуйте функцию в любом математическом пакете или в Excel, определите минимальное и максимальное значения функции на заданном диапазоне, а также шаги для засечек по обеим осям. Только после этого приступайте к созданию приложения прорисовки вашего графика.
123
10.СОЗДАНИЕ МНОГООКОННОГО ИНТЕРФЕЙСА
Первая форма проекта (Form1) создается автоматически. Для добавления новых форм в проект при создании многооконного приложения используется команда меню Project → Add Windows Form, которая вызывает появление диалогового окна Add New Item, в текстовом поле которого отразится имя очередной формы, например, Form2 (см. рис. 10.2). Кнопка Add добавляет форму в проект.
Рис. 10.2 Окно редактора среды с двумя добавленными окнами Form2 и Form3
Когда проект будет запущен, на экране появится только одна форма Form1. Как же увидеть остальные? Для того чтобы можно было открыть (показать) нужную форму, необходимо в программном коде использовать метод Show для этой формы.
На рис. 10.3 приведены две событийные процедуры, написанные для кнопок Button1 и Button2 формы Form1, в которых открываются окна Form2 и Form3.
Рис. 10.1 Диалоговое окно Add New Item
Все добавленные формы отразятся в окне редактора среды
(рис. 10.2).
Рис. 10.3 Программный код для открытия форм
124 |
125 |
Для того чтобы скрыть форму, можно воспользоваться методом
Hide.
Пример. На первой форме Form1 помещена кнопка Button1. В событийной процедуре для этой кнопки используется метод Show, чтобы открыть другую форму Form2. На второй форме Form2 помещена кнопка Button1. В событийной процедуре для этой кнопки используется метод Hide для того, чтобы скрыть форму Form2 и вернуться к Form1.
Public Class Form1
……………………
Private Sub Button1_Click(…) … Form2.Show()
End Sub
Public Class Form2
……………………
Private Sub Button1_Click(…)… Hide()
End Sub
10.1.Создание многооконного интерфейса с помощью пользовательского меню
Для организации работы многооконного приложения можно использовать пользовательское меню. Для его создания на форме проекта используется элемент управления MenuStrip(рис. 10.4).
Рис. 10.4 Элемент управления MenuStrip
Данный элемент управления располагается не на самой форме, а под ней. Если выделить элемент управления MenuStrip, на форме появится значок с надписью Тyре Неrе (рис. 10.5).
126
Рис. 10.5 Создание объектов типа MenuItem
Если значок с надписью Тyре Неrе выделить, а затем щелкнуть на нем левой кнопкой мыши, надпись Тyре Неrе превратится в пустое текстовое поле, в котором можно написать название пункта меню (например Файл). При этом внизу и справа появляются еще две заготовки для других пунктов меню. Каждый из этих элементов представляет собой объект типа ToolStripMenuItem (рис. 10.6).
Рис. 10.6. Формирование пунктов меню
Основные свойства компонента ToolStripMenuItem:
Свойство |
Описание |
|
В значении True устанавливает флажок слева от |
Checked |
пункта меню, в значении False снимает флажок |
|
(По умолчанию False) |
|
|
ShortcutKeys |
Создает клавиши быстрого вызова |
|
|
|
127 |
