- •Давайте не будем изобретать колесо.
- •Прежде всего: Данные
- •Рисование и Упорство
- •Объект Graphics
- •Начинаем
- •Расположение и Размер
- •Вычислите Общее значение
- •Вычислите Доли и Нарисуйте Диаграмму
- •Рисуем диаграмму
- •Улучшите диаграмму
- •Заголовок
- •Пули (Bullets) и Информация о Компании
- •Расположите После Использования
- •Все сделано!
- •Нарисуем это!
- •Давайте начнем
- •Шаг 1: генерация данных
- •Шаг 2: Получаем элемент управления
- •Повторно используемые значения
- •Шаг 3: Установка полей, промежутки и размеры
- •Шаг 4а: Объекты Graphics и Bitmap
- •Шаг 4b: Вертикальная ось
- •Шаг 4c: Отметки и текст
- •Шаг 4d: Время для проверки
- •Шаг 5: Горизонтальная ось и панели
- •5B. Панели
- •5C. Названия стран
- •Шаг 6: Все показано!
- •Удачные диаграммы: Вторая помощь в круговых диаграммах. Часть 3
- •Разметка формы
- •Давайте начнем писать код
- •Временные переменные
- •Элементы пользовательского ввода
- •Получение данных
- •Создание диаграммы
- •Рисуем Panel
- •Финальное домоводство
- •Опция «Уппс!»
- •Настройка
- •Создаем данные
- •Элементы управления
- •Вертикальная ось
- •Точечные отметки шкалы
- •Проверяем 1, 2, 3
- •Базовая линия (ось X)
- •3D Панели
- •Последние штрихи
- •Удачные диаграммы. Часть 5 - Линейные графики
- •Данные для образца
- •Переменные
- •Внешние границы диаграммы
- •Объект Graphics
- •Вертикальная ось
- •Отметки
- •Горизонтальная ось (a.K.A. Базовая линия)
- •Рисование Линии (Линий)
- •Расчет вертикальной шкалы
- •Создаем и рисуем первый сегмент линии
- •Превращающаяся и исчезающая проблема линий
- •Первый сегмент линии
- •Остающиеся сегменты линии
- •Преобразования
- •Рисуем преобразованную линию
- •Проверяем
- •Отображаем месяцы
- •Отображаем результат
- •Соединения линий
- •Линии сетки
- •Горизонтальные линии сетки
- •Вертикальные линии сетки
- •Последнее отображение
- •Удачные диаграммы. Часть 6 - Динамическая линейная диаграмма
- •Элементы управления формы
- •Инициирующий код
- •Рисование направляющих линий диаграммы
- •Как это работает
- •Отображаем значения
- •Использование Vertical ScrollBar
- •Проверяем
- •Итоги первой демонстрации
- •Затененный график
- •Значения вертикальной оси
- •Код Вертикальных Значений
- •Подвижные направляющие линии
- •Отображаем направляющие линии
- •Направляющие линии и отображенные значения
- •Вертикальные значения
- •Возможные улучшения
- •Охваченные темы
Элементы управления
Добавьте 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