Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ПиОА_1 семестр_1 / ПОСОБИЕ_VB.Net

.pdf
Скачиваний:
658
Добавлен:
06.03.2016
Размер:
3.4 Mб
Скачать

Рис. 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