Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на BASIC / Visual Basic / Гед Мид. Удачные диаграммы GDI+ Работа с графикой [doc].doc
Скачиваний:
23
Добавлен:
02.05.2014
Размер:
870.4 Кб
Скачать

Элементы управления

    Добавьте PictureBox (Графическое окно) PBBarChart и кнопку btnDraw на форму. Поместите кнопку куда-нибудь вниз, в углу формы. Растяните PictureBox так, чтобы он закрывал верхний, правый и левый края формы. Установите его свойство Anchor так, чтобы оно было привязано ко всем четырем сторонам. Это позволит пользователю щелкнуть на кнопке, чтобы версия диаграммы с измененными размерами отображалась, какими бы ни стали размеры формы. (Как мы увидим в дальнейших статьях, есть более динамичные способы достичь этого, но мы пока будем придерживаться этого метода.)     Затем мы установим объекты Graphics и Bitmap. Поместите этот инициализирующий код в отдельную процедуру, названную GetGraphics:

Private Function GetGraphics() As Graphics

' Сделайте bmap того же размера и разрешения, чито и PictureBox

bmap = New Bitmap(PBBarChart.Width, PBBarChart.Height, _

PBBarChart.CreateGraphics)

' Присвойте объект Bitmap объекту Graphics

' и верните его

Return Graphics.FromImage(bmap)

End Function

Вертикальная ось

    Если вы читали предыдущие статьи, вы можете заметить, что разные этапы теперь разделены на меньшие куски кода и помещены в отдельные процедуры. Код для вертикальной оси теперь помещен в свою процедуру и остается, в значительной степени, неизменен относительно предыдущих версий. Первая часть его выглядит так:

Private Sub DrawVerticalAxis(ByVal g As Graphics)

' Рисует линию вертикальной оси.

Dim StartPoint As New Point(LeftMargin, _

PBBarChart.Height - BaseMargin)

Dim EndPoint As New Point(LeftMargin, TopMargin)

' Основной Pen

Dim LinePen As New Pen(Color.Black, 2)

' Рисуем вертикальную линию (без точечных меток)

g.DrawLine(LinePen, StartPoint, EndPoint)

' Рисуем Tickmarks и отображаем числа

' рассчитанной длинны вертикальной оси

VertLineLength = PBBarChart.Height - (BaseMargin + TopMargin)

' Идентифицируем число самой высшей продажи

For Each gd As GraphData In SalesData

If gd.Sales > HighSale Then HighSale = gd.Sales

Next

' : Код точечных отметок шкалы последует

Точечные отметки шкалы

    Здесь есть отличие от предыдущей статьи. В Части 2 мы отмечали максимальное число продаж равным 1000. Не очень реалистично, но это помогало сделать код менее сложным. На этот раз мы будем регулировать число максимальных продаж (а соответственно и число, и пространство точечных меток) в соответствии с любым значением переменной HighSale.   Это значит, что вы можете изменить данные продаж, чтобы позволить значение общих продаж превышающим 1000 в любое время в будущем, и ваша диаграмма при этом не будет искажаться.     Чтобы сделать это, мы идентифицируем число максимальных продаж, затем округляем его пока не получим следующее круглое значение, кратное 100. На пример, если число HighSale равно 1675, следующее максимальное значение на шкале будет установлено 1700.     Вот код, который делает это:

' Процедура DrawVerticalAxis продолжена:

' Округляем до следующей сотни высшее число продаж

Dim NextCent As Integer = CInt(HighSale)

Do While NextCent Mod 100 <> 0

NextCent += 1

Loop

' Определяем, сколько точечных отметок

' (TickMarks) требуется (одна на сотню):

Dim TotalTicks As Integer = CInt(NextCent / 100)

    Теперь, когда мы знаем, сколько сотен мы должны допустить, мы можем разделить вертикальную ось пропорционально на сотни, нарисовать точечные отметки и текстовые значения, точно так же, как мы делали в Части 2:

' Рассчитываем промежутки между вертикальными отметками

Dim YPos As Integer = CInt(VertLineLength / TotalTicks)

' Переменные для точек Start и End

Dim TickSP As New Point(LeftMargin - 5, StartPoint.Y - YPos)

Dim TickEP As New Point(LeftMargin, StartPoint.Y - YPos)

' Шрифт для значений – объявляем здесь для читабельности

Dim ValueFont As New Font("Arial", 8, FontStyle.Regular)

For i As Integer = 1 To TotalTicks

g.DrawLine(New Pen(Color.Black), TickSP, TickEP) ' Tick mark

' Значения точек как текст:

g.DrawString(CStr(i * 100), ValueFont, Brushes.Black, 2, TickSP.Y - 5)

' Сбрасываем позиции x, y пропорционально вертикальной линии

TickSP.Y = CInt(TickSP.Y - (VertLineLength / TotalTicks))

TickEP.Y -= CInt(VertLineLength / TotalTicks)

Next

End Sub