
- •Давайте не будем изобретать колесо.
- •Прежде всего: Данные
- •Рисование и Упорство
- •Объект 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
- •Проверяем
- •Итоги первой демонстрации
- •Затененный график
- •Значения вертикальной оси
- •Код Вертикальных Значений
- •Подвижные направляющие линии
- •Отображаем направляющие линии
- •Направляющие линии и отображенные значения
- •Вертикальные значения
- •Возможные улучшения
- •Охваченные темы
Значения вертикальной оси
Пока пользователь мог видеть текущее значение, отображенное на метке (Label), которое было полезным, но не всегда реалистичным. Однако на самой диаграмме текущее значение ограничено серыми горизонтальными линиями. В большинстве случаев мы хотим что-нибудь более определенное, чем это. Особенно было бы лучше получить значение в конце каждой направляющей линии, где хотелось бы нашему пользователю. Всегда есть несколько способов достичь этого, один из самых простых – получить второй PictureBox, который содержит эти значения и поместить его рядом с picGraph PictureBox.
Добавьте на форму второй PictureBox. Поместите его слева от оригинального PictureBox’а picGraph. Установите его размеры 30, 400. Это сделает его той же высоты, что и PictureBox picGraph. Назовите его picValue. Легкий способ выровнять два PictureBox – применить меню Format в Visual Studio IDE. Вероятно, вы уже знаете все об этом, но просто на всякий случай:
Щелкните левой кнопкой мыши на одном из PictureBox’ов.
Нажмите на клавишу Control.
Кликните на втором PictureBox’е удерживая клавишу Control нажатой.
Выберите Format – Alighn – Tops в меню IDE:
Затем, выберите Format – Horisontal Spacing – Remove:
Если необходимо, вы можете вручную перетащить оба PictureBox’а в удобное место на форме.
Наконец, щелкните где-нибудь на главной форме (т.е. вне PictureBox’ов), чтобы убрать выделение.
Код Вертикальных Значений
Процедура, которая размещает линии и значения в новом PictureBox’е называется DrawVerticalValues. Вот она:
Private Sub DrawVerticalValues(ByVal PB As PictureBox)
' Рисуем вертикальные значения (снова применяем двойную буферизацию,
' хотя в этом нет необходимости)
' Шаг 1
Dim bmp As New Bitmap(PB.Width, PB.Height)
Dim gv As Graphics = Graphics.FromImage(bmp)
' Шаг 2
' Рисуем направляющие линии на полосках значений
For i As Integer = 40 To 400 Step 40
gv.DrawLine(Pens.WhiteSmoke, 0, i, PB.Width, i)
Next i
' Шаг 3
Dim NextMarker As Integer = 100
For i As Integer = 0 To 360 Step 40
gv.DrawString(CStr(NextMarker), New Font("Verdana", 8, FontStyle.Regular), Brushes.Black, 1, i)
NextMarker -= 10
Next
' Шаг 4
PB.Image = bmp
' Шаг 5
gv.Dispose()
End Sub
Шаг 1 и Шаг 2 те же, что и обсуждавшиеся раньше, поэтому я не буду на них останавливаться. Шаг 3 имеет задачу – заполнение PictureBox’а значениями.
Первое, он создает переменную, которая называется NextMarker и присваивает ей инициирующее значение 100. Это значение отражает значение Maximum ScrollBar.
Вторая строка в Шаге 3 устанавливает цикл. Из-за того, что значения Шага используются в цикле, в действительности это значит, что цикл будет выполнен десять раз.
В цикле DrawString применяется для того, чтобы писать следующую отметку значения на объекте Graphics PictureBox’а. Первое значение, которое будет написано, должно быть 100, следующее – 90, затем 80, и т.д. Причина того, что значения записываются в порядке убывания, заключается в том, что процедура работает, перемещаясь сверху к низу PictureBox’а и нам приходится уменьшать значения с каждым шагом.
Следующая строка кода просто уменьшает значение, которое мы собираемся отобразить следующим. В этом примере мы уменьшаем значение на 10 каждый раз.
Цикл завершается с ключевым словом Next.
Шаги 4 и 5 снова просто повторяют логику, которую мы использовали в предыдущих процедурах рисования. Так что теперь у вас есть довольно простой способ вставить значения в вертикальный список показываемых значений. Затем нам нужно рассмотреть более реалистичную ситуацию, в которой диапазон значений, которые могут быть отображены, не должен быть точно предустановлен и рассчитан в PictureBox’е.