1432
.pdf‘ остальные точки
For i As Integer = 2 To d.Length - 1 x2 = 8 + i * sw
y2 = Me.ClientSize.Height - 20 – m * d(i) g.DrawRectangle(System.Drawing.Pens.Black,x2-2,y2-2,4,4) g.DrawLine(System.Drawing.Pens.Black, x1, y1, x2, y2) g.DrawString(Convert.ToString(d(i)), dF, _ System.Drawing.Brushes.Black, x2 - 10, y2 - 20)
x1 = x2
y1 = y2 Next End Sub
‘ обновление графики при изменении размеров формы
Private Sub Form1_SizeChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.SizeChanged Refresh()
End Sub
‘ подготовка исходны данных
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim fs As FileStream
‘ путь в текущий каталог
Dim FN As String = Application.StartupPath + "\d.txt" Dim i As Integer = 0
Try
' поток для чтения
fs = New FileStream(FN, FileMode.Open, FileAccess.Read) Dim sr As New StreamReader(fs)
‘ читаем числа в массив
Dim t As String = sr.ReadLine() While i < d.Length - 1
i = i + 1
d(i) = Convert.ToDouble(t) t = sr.ReadLine()
79
End While sr.Close()
' задаем функцию обработки события Paint
Dim Paint = New PaintEventHandler(AddressOf Form1_Paint) Catch ex As FileNotFoundException MessageBox.Show(ex.ToString())
Catch ex As Exception MessageBox.Show(ex.ToString()) Finally
fs.Close() End Try End Sub End Class
7.2. Задание на тему «Построение графика»
Разработать программу, вычерчивающую график. Исходные данные должны извлекаться из текстового файла. Количество точек – произвольно.
Порядок выполнения лабораторной работы
Создать папку с набором тестовых данных.
Создать новый проект – приложение Windows Forms.
Вынести на форму необходимые визуальные компоненты.
Добавить программный код обработки событий.
Компилировать программу.
Тестировать программу.
Создать документ с описанием работы программы.
7.3. Построение столбиковой диаграммы
Вычерчивание столбиковой диаграммы выполняется аналогично графику. Относительные изменения только упрощают программу. Вместо шага определяется ширина столбика диаграммы:
W_S = (Me.ClientSize.Width-40-5*d.Length)/d.Length-1
80
Для перехода к следующей точке достаточно выполнить шаг по
Х.
X = X + W_S + 5
Высота столбика h_Y определяется по найденной (как в графике) координате Y точки с учетом отступа от границы формы:
h_Y = ClientSize.Height - Y - 20
Вычерчивание закрашенного столбика выполняется с помощью функции FillRectangle, например: G_P.FillRectangle(Brushes.ForestGreen, X, Y, W_S, h_Y)
Для вычерчивания границ столбика можно также использовать
DrawRectangle: G_P.DrawRectangle(System.Drawing.Pens.Black, X, Y, W_S, h_Y)
Пример программы
Столбиковая диаграмма строится с помощью программы, аналогичной графику. Все процедуры, кроме одной, в этих программах совпадают. Поэтому в примере мы приводим только одну процедуру, которая непосредственно выполняет вычерчивание диаграммы.
‘ Пример 7.2
Private d(10) As Double
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
'графическая поверхность
Dim g As Graphics g = e.Graphics()
'подписи данных
Dim dF As Font = New Font("Tahoma", 9)
' заголовок
Dim hF As Font = New Font("Tahoma", 14, FontStyle.Regular) Dim H As String = "График"
Dim w As Integer = g.MeasureString(H,hF).Width Dim x As Integer = (Me.ClientSize.Width - w) / 2
g.DrawString(H, hF, System.Drawing.Brushes.Black, x, 5)
81
‘ размеры реальной области
Dim max As Double = d(1) Dim min As Double = d(1)
For i As Integer = 1 To d.Length - 1 If d(i) > max Then max = d(i)
If d(i) < min Then min = d(i) Next
Dim x1, y1, m,h0 As Integer
' ширина столбца
w1 = (Me.ClientSize.Width-40-5*(d.Length -1))/(d.Length-1) x1 = 20
‘ масштабный множитель
m = (Me.ClientSize.Height - h1)/(max-min) Dim h1 As Integer = Me.ClientSize.Height \ 2 For i As Integer = 1 To d.Length - 1
y1 = Me.ClientSize.Height - 20 – m*d(i) g.DrawString(Convert.ToString(d(i)), dF, System.Drawing.Brushes.Black, x1, y1 - 21) h0 = Me.ClientSize.Height - y1 - 20
g.FillRectangle(Brushes.ForestGreen, x1, y1, w, h0) g.DrawRectangle(System.Drawing.Pens.Black, x1, y1, w, h0) x1 = x1 + w + 5
Next
End Sub
7.4. Задание на тему «Построение столбиковой диаграммы»
Разработать программу, вычерчивающую столбиковую диаграмму. Исходные данные должны извлекаться из текстового файла. Количество точек – произвольно.
Порядок выполнения лабораторной работы
Создать папку с набором тестовых данных.
Создать новый проект – приложение Windows Forms.
Вынести на форму необходимые визуальные компоненты.
82
Добавить программный код обработки событий.
Компилировать программу.
Тестировать программу.
Создать документ с описанием работы программы.
7.5.Построение круговой диаграммы
Вкруговой диаграмме для определения доли каждого сектора вычисляются доли соответствующих исходных значений в их общей сумме.
Dim s As Double = 0 For i = 1 To d.Length - 1 s = s + d(i)
Next
For i = 1 To d.Length - 1 p(i) = d(i) / s
Next
Для круговой диаграммы выбирается величина диаметра с учетом отступа от границ формы, а также координаты центра:
Dim DD As Integer = ClientSize.Height - 70 Dim x0 As Integer = 30
Dim y0 As Integer = (ClientSize.Height - DD) / 2 + 10
Если в графике и столбиковой диаграмме достаточно одного цвета, то в круговой диаграмме необходимо использовать несколько цветов. Переменная fbrush, используемая для хранения цвета закраски Brushes, объявляется в следующей строке:
Dim fbrush As Brush = Brushes.White
В табл. 7.1 представлены несколько значений для цвета.
Таблица 7.1
Примеры значений свойства Brushes
Свойство |
Описание |
|
|
Aquamarine |
Аквамарин |
|
|
Beige |
Бежевый |
|
|
Black |
Черный |
|
|
Blue |
Синий |
|
|
Brown |
Коричневый |
|
|
Свойство |
Описание |
|
|
Coral |
Коралловый |
|
|
Cyan |
Голубой |
|
|
Gold |
Золотой |
|
|
Green |
Зеленый |
|
|
Yellow |
Желтый |
|
|
83
Для круговой диаграммы обязательны пояснения – легенда. Она может быть изображена с помощью цветных прямоугольников с сопутствующим текстом – названием элемента данных, например: g.FillRectangle(fbrush, Lx, Ly + i * 20, 20, 10)
g.DrawString(title(i) + " - " + p(i).ToString("p"), _ dFont, System.Drawing.Brushes.Black, _
Lx + 24, Ly + i * 20 - 3)
Сектор закрашивается с помощью функции FillPie. Контур сектора рисуется с помощью функции DrawPie. В обеих функциях указываются центр диаграммы, ширина и высота, а также начальный угол сектора и дуга сектора в градусах.
g.FillPie(fbrush, x0, y0, dd, dd, sta, swe) g.DrawPie(System.Drawing.Pens.Black,x0,y0,dd,dd,sta,swe)
Пример программы
Круговая диаграмма строится по данным из текстового файла, в котором в столбик размещены названия 10 элементов и соответствующие величины. Для прорисовки секторов диаграммы используются 10 цветов, которые выбираются с помощью оператора Select Case. В правой части формы выводится легенда данных.
‘ Пример 7.3
Imports System.IO
Public Class Form1
Private d(10), p(10) As Double Private title(10) As String Private n As Integer
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
'графическая поверхность
Dim g As Graphics g = e.Graphics()
'легенда
Dim dF As Font = New Font("Tahoma", 9)
84
' заголовок
Dim hF As Font = New Font("Tahoma", 12, FontStyle.Bold) Dim H As String = "Круговая диаграмма"
Dim w As Integer=Convert.ToInt32(g.MeasureString(H,hF).Width) Dim x As Integer = (Me.ClientSize.Width - w) / 2 g.DrawString(H, hF, System.Drawing.Brushes.Black, x, 10)
‘ диаметр диаграммы
Dim dd As Single = ClientSize.Height - 70
‘центр диаграммы
Dim x0 As Integer = 30
Dim y0 = (ClientSize.Height - dd) / 2 + 10
‘легенда
Dim Lx As Integer = 60 + dd
Dim Ly As Integer = 30
‘дуга сектора
Dim swe As Single Dim sta As Single = -90
‘закраска
Dim fbrush As Brush = Brushes.White
For i As Integer = 1 To d.Length - 1
‘ дуга
swe = 360 * p(i)
‘ выбор цвета закраски
Select Case i
Case 0
fbrush = Brushes.YellowGreen Case 1
fbrush = Brushes.Gold Case 2
fbrush = Brushes.Pink Case 3
fbrush = Brushes.Violet
85
Case 4
fbrush = Brushes.OrangeRed
Case 5
fbrush = Brushes.RoyalBlue
Case 6
fbrush = Brushes.SteelBlue
Case 7
fbrush = Brushes.Chocolate
Case 8
fbrush = Brushes.LightGray
Case 9
fbrush = Brushes.Aquamarine
Case 10
fbrush = Brushes.Brown
Case Else
fbrush = Brushes.Fuchsia
End Select
‘ устранение возможного накопления ошибки
If i = (n - 1) Then swe = 270 - sta
‘вычерчивание сектора g.FillPie(fbrush, x0, y0, dd, dd, sta, swe)
g.DrawPie(System.Drawing.Pens.Black,x0,y0,dd,dd,sta,swe)
‘вывод легенды
g.FillRectangle(fbrush, Lx, Ly + i * 20, 20, 10) g.DrawString(title(i) + " - " + p(i).ToString("p"), _ dFont, System.Drawing.Brushes.Black, _
Lx + 24, Ly + i * 20 - 3)
‘ перейти к началу следующего сектора sta = sta + swe
Next
End Sub
‘ подготовка исходных данных
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
86
Dim fs As FileStream
‘ путь в текущую папку
Dim FN As String = Application.StartupPath + "\d.txt"
Dim i As Integer = 0
Try
fs = New FileStream(FN, FileMode.Open, FileAccess.Read)
Dim sr As New StreamReader(fs, _
System.Text.Encoding.GetEncoding(1251))
‘ читаем данные из файла
Dim st As String = sr.ReadLine() While i < d.Length - 1
i = i + 1
‘заголовок элемента данных title(i) = st
st = sr.ReadLine()
‘значение элемента данных d(i) = Convert.ToDouble(st)
st = sr.ReadLine() End While sr.Close()
' задаем функцию обработки события Paint
Dim Paint = New PaintEventHandler(AddressOf Form1_Paint)
Catch ex As FileNotFoundException MessageBox.Show(ex.ToString()) Catch ex As Exception MessageBox.Show(ex.ToString()) Finally
fs.Close() End Try
Dim s As Double = 0 For i = 1 To d.Length - 1 s = s + d(i)
87
Next
For i = 1 To d.Length - 1 p(i) = d(i) / s
Next
End Sub
‘ обновление после изменения размеров формы
Private Sub Form1_ClientSizeChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.ClientSizeChanged Me.Refresh()
End Sub
End Class
7.6. Задание на тему «Построение круговой диаграммы»
Разработать программу, вычерчивающую круговую диаграмму. Исходные данные должны извлекаться из текстового файла. Количество точек – произвольно.
Порядок выполнения лабораторной работы
Создать папку с набором тестовых данных.
Создать новый проект – приложение Windows Forms.
Вынести на форму необходимые визуальные компоненты.
Добавить программный код обработки событий.
Компилировать программу.
Тестировать программу.
- Создать документ с описанием работы программы.
88