Волченков Проектирование Wиндоwс-Приложений на языке Висуал Басиц 2010
.pdfКод 3.1
Public Class Form1
Dim w, h, Dw, Dh As Integer
Dim i, n As Short
Dim a, s, f1, f2, dx, dy As Single
Dim c As Color
Dim pen As New Pen(Color.Brown, 1)
Private Sub Диаграмма_Click(ByVal _ sender As Object, _
ByVal e As System.EventArgs) _ Handles Диаграмма.Click
Dim gr As Graphics = PictureBox1.CreateGraphics w = PictureBox1.Width : h = PictureBox1.Height dx = w / 10 : dy = h / 10
Dw = w - 2 * dx : Dh = h - 2 * dy n = ListBox1.Items.Count
s = 0
For i = 0 To n - 1
a = CSng(ListBox1.Items.Item(i)) s = s + a
Next gr.Clear(PictureBox1.BackColor) f1 = 0 : f2 = 0
For i = 0 To n - 1
a = CSng(ListBox1.Items.Item(i)) f1 = f1 + f2
f2 = 360 * (a / s)
c = Color.FromArgb(255, _
150 + 100 * Rnd(), 150 + 100 * Rnd(), _ 150 + 100 * Rnd())
Dim br As New SolidBrush(C) gr.FillPie(br, dx, dy, Dw, Dh, f1, f2) gr.DrawPie(pen, dx, dy, Dw, Dh, f1, f2)
Next End Sub
End Class
В рассмотренной процедуре сначала объявлена переменная gr как объект (экземпляр) класса Graphics, позволяющий применять графические методы к графическому окну PictureBox1.
Переменные Dw и Dh – это горизонтальный и вертикальный диаметры эллипса.
31
Переменные dx и dy – это «поля» на графическом окне, чтобы эллипс не касался краёв окна.
Переменная s – это сумма чисел в списке длиной n. Переменные f1 и f2 – углы, измеряемые в градусах – параметры
методов FillPie и DrawPie – рисования сектора.
Цвет сектора – это «случайный» цвет (переменная c) для кисти (переменная br), которая определяется в цикле для каждого сектора. Чтобы цвет был не слишком тёмным, каждая из трёх составляющих цвета получает значение 150 + 100 * Rnd().
Следующий шаг проектирования данного приложения – это реализация печати округленных значений ∑aiai 100% на секторах
диаграммы.
Рис. 3.2. Окно приложения с напечатанными значениями на секторах
Указанные значения печатаются на секторах с помощью графического метода DrawString путем добавления в процедуру (в тело цикла For … Next) вызова данного метода:
gr.DrawString(Round(a / s * 100) |
& "%", Font, brs, _ |
||||||||||||
(w |
/ |
2 |
- |
15) + 0.35 * Dw * |
_ |
/ |
2) |
/ |
180), |
_ |
|||
(h |
/ |
2 |
- |
Cos(3.14 |
* (f1 |
+ |
f2 |
||||||
5) + 0.35 |
* |
Dh * _ |
f2 |
/ |
2) |
/ |
180)) |
|
|||||
|
|
|
|
Sin(3.14 |
* |
(f1 |
+ |
|
Числа 5, 15 и 0.35 в значениях параметров метода DrawString подобраны эмпирически – для установки нужных мест печати.
32
Напомним (см. работу № 2), что для успешной работы математических функций перед объявлением класса данной формы необходимо вставить строку Imports System.Math.
Необходимо также определить особую кисть для печати – вставить в начало программы строку:
Dim brs As New SolidBrush(Color.Black).
Рассмотрим теперь вопрос о редактировании списка чисел – добавлении в меню ещё одной команды: Редактировать список. Создадим для этой команды подменю с 4 командами: Добавить,
Вставить, Удалить и Изменить (рис. 3.3).
Рис. 3.3. Добавление в приложение команд меню Редактировать список с подменю
Рассмотрим две из четырёх процедур для команд этого подменю:
Код 3.2
Private Sub Добавить_Click(ByVal sender As _ System.Object, ByVal e As System.EventArgs) _ Handles Добавить.Click
ListBox1.Items.Add(InputBox("Введите значение"), _ "Ввод нового элемента")
End Sub
Private Sub Удалить_Click(ByVal sender As _ System.Object, ByVal e As System.EventArgs) _ Handles Удалить.Click
i = ListBox1.SelectedIndex
33
If i < 0 Then
MsgBox("Выделите удаляемый элемент!", _
MsgBoxStyle.Critical)
Else
ListBox1.Items.RemoveAt(i)
End If
End Sub
Можно модернизировать выполненный проект, изменив параметры методов FillPie и DrawPie так, чтобы сектора немного сместились от центра эллипса
(рис. 3.4).
Рис. 3.4. Круговая диаграмма со смещёнными центрами секторов
Для указанной модернизации следует ввести две переменные: px и py – горизонтальное и вертикальное смещение:
q = 0.025 'коэффициент "разбегания" (смещения) px = q * Dw * Cos(3.14 * (f1 + f2 / 2) / 180) py = q * Dh * Sin(3.14 * (f1 + f2 / 2) / 180)
Значения 2-го и 3-го параметров указанных методов FillPie и DrawPie надо изменить на значения этих переменных:
gr.FillPie(br, dx + px, dy + py, Dw, Dh, f1, f2) gr.DrawPie(pen, dx + px, dy + py, Dw, Dh, f1, f2)
Задание 3.2. Добавить в меню на экранной форме проекта приложения 1-го задания команду Редактирование списка, содер-
жащую команды подменю Добавить, Удалить, Вставить и Из-
менить в соответствии с вариантами задания.
34
Вариант 1. Написать и отладить процедуру для команды подменю Вставить – включения нового элемента в список – перед выделенным элементом.
Указание. Вместо метода Add, рассмотренного в коде 3.2, следует использовать метод Insert, в котором не один, а два аргумента:
ListBox1.Items.Insert(i, InputBox("Введите значение", _ "Ввод нового элемента", _ ListBox1.Items.Item(i)))
(3-й аргумент функции InputBox – значение «по умолчанию».) Как и в процедуре для команды Удалить (код 3.2), необходимо
предусмотреть случай, когда пользователь не выделил элемент, перед которым вставляется новое значение.
Вариант 2. Написать и отладить процедуру для команды меню Изменить – замены старого значения выделенного элемента новым значением.
Указание. Использовать последовательное применение двух методов: Insert (см. указание к варианту 1) и RemoveAt (см. код 3.2):
ListBox1.Items.Insert(i, InputBox("Введите значение", _ "Ввод исправленного элемента", _ ListBox1.Items.Item(i)))
ListBox1.Items.RemoveAt(i + 1)
Как и в процедуре для команды Удалить (код 3.2) необходимо предусмотреть случай, когда пользователь не выделил элемент, значение которого надо изменить.
Задание 3.3. Реализовать построение линейной и прямоугольной диаграмм в соответствии с вариантами задания.
Вариант 1. Создать проект приложения «Линейная диаграмма» (рис. 3.5), в котором применяются графические методы DrawLine и DrawRectangle.
Вариант 2. Создать проект приложения «Прямоугольная диаграмма» (рис. 3.6), в котором применяются графические методы
FillRectangle и DrawRectangle.
35
Рис. 3.5. Форма приложения «Линейная диаграмма»
Рис. 3.6. Форма приложения «Прямоугольная диаграмма»
Указание. Для более естественного представления диаграмм целесообразно перенести начало координат вниз и перевернуть направленную вниз ось ординат:
dx = w / (n + 2) dy = 0.1 * h
gr.ScaleTransform(1, -1) gr.TranslateTransform(dx, -h + dy)
Кроме того здесь проведено масштабирование:
• длина оси абсцисс составляет теперь (n + 2) условных единиц.
36
• длина оси ординат устанавливается в зависимости от значения переменной max – максимального числа в списке чисел, которое надо найти перед циклическим рисованием отрезков (линейная диаграмма) или прямоугольников (прямоугольная диаграмма).
На каждом шаге этого циклического процесса:
1) изображение очередного отрезка (в случае линейной диаграммы) строится следующим образом:
x2 = (0.5 + i) * dx
y2 = CSng(ListBox1.Items.Item(i))
y2 = y2 * (0.8 * h / max) gr.DrawLine(pen, x1, y1, x2, y2) gr.DrawLine(pens.Black, x2, 0, x2, y2) x1 = x2 : y1 = y2
2) изображение очередного прямоугольника (в случае прямоугольной диаграммы) строится следующим образом:
x1 = i * dx : y1 = 0
dy = CSng(ListBox1.Items.Item(i)) dy = dy * (0.8 * h / max)
gr.FillRectangle(br, x1, y1, dx, dy) gr.DrawRectangle(pen, x1, y1, dx, dy)
Как и для круговой диаграммы (код 3.1) кисть br надо определять на каждом шаге цикла, чтобы закрашивать прямоугольники разными случайными цветами:
c = Color.FromArgb(255, _
150 + 100 * Rnd(), 150 + 100 * Rnd(), _ 150 + 100 * Rnd())
Dim br As New SolidBrush(c)
Для большей выразительности можно сделать прямоугольное обрамление – как у линейной, так и у прямоугольной диаграммы:
gr.DrawRectangle(pen, 0, 0, _
w - 2 * dx, h - 2 * dy + 5)
Дополнение к заданию 3.3. Реализовать печать значений: ∑aiai 100% на диаграммах в соответствии с вариантом.
37
Изображения диаграмм с напечатанными на них указанными значениями показаны на рис. 3.7.
а б
Рис. 3.7. Печать значений в окне изображения приложения: «Линейная диаграмма» (а) и «Прямоугольная диаграмма» (б)
Фрагмент кода для варианта 1:
gr.ScaleTransform(1, -1) For i = 0 To n - 1
a = CSng(ListBox1.Items.Item(i)) a = Round(100 * a / s)
gr.DrawString(a & "%", Font, brs, _
dx * (0.5 + i) - 10, 2)
Next
Фрагмент кода для варианта 2:
gr.ScaleTransform(1, -1) For i = 0 To n - 1
a = CSng(ListBox1.Items.Item(i)) a = Round(100 * a / s)
gr.DrawString(a & "%", Font, brs, dx * i, 0) Next
Отметим, что в данных фрагментах вертикальная ось, перевернутая для построения линейной или прямоугольной диаграммы в традиционной системе координат, опять переворачивается с помо-
щью строки: gr.ScaleTransform(1, -1).
Это делается для того, чтобы печатаемые на диаграмме символы (цифры и знак «%») не изображались перевернутыми.
38
Отчет о работе
Отчет заключается в демонстрации студентом на терминале работы самостоятельно отлаженного проекта «Построение диаграмм» (в соответствии с предложенным вариантом каждого из трех заданий).
Проект должен давать ожидаемые результаты при работе в режиме отладчика. Должна быть также представлена демонстрация исполняемого Windows приложения, соответствующего указанному проекту.
39
Работа № 4
Исследование графических объектов и методов
2D-графики языка Visual Basic .NET (2005, 2008)
на примере проектирования приложений «Построение графиков функций» и «Построение сложных фигур»
Цель работы: изучение возможностей реализации двумерной (2D) графики с помощью графических объектов и методов языка VB .NET (2005, 2008) на примере проектирования двух приложений «Построение графиков функций» и «Построение сложных фигур».
В ходе проведения работы исследуется полезный класс графических объектов – Drawing2D из пространства имён System.Drawing, входящего в состав .NET Framework – ядра системы Visual Studio .NET (2005, 2008).
Подготовка к работе
Перед выполнением работы студенту необходимо ознакомиться с литературой и материалами лекций, а также проконтролировать свои знания, ответив на следующие контрольные вопросы:
1.Что представляют собой графические объекты-структуры Point (точка), Rectangle (прямоугольник), Size (размер)? К какому пространству имён они принадлежат? Приведите примеры графических методов, в которых они используются.
2.Как с помощью метода Inflate можно изменять размеры изображаемых прямоугольников и эллипсов?
3.Для каких графических методов необходим объект Brush (графическая кисть)? Как определить новую кисть?
4.Какие графические объекты используются в качестве двух аргументов графического метода DrawString?
5.Как с помощью графического метода DrawString можно напечатать на некотором объекте ряд чисел? Как напечатать эти числа разными цветами и/или разными шрифтами?
40