- •Давайте не будем изобретать колесо.
- •Прежде всего: Данные
- •Рисование и Упорство
- •Объект 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
- •Проверяем
- •Итоги первой демонстрации
- •Затененный график
- •Значения вертикальной оси
- •Код Вертикальных Значений
- •Подвижные направляющие линии
- •Отображаем направляющие линии
- •Направляющие линии и отображенные значения
- •Вертикальные значения
- •Возможные улучшения
- •Охваченные темы
Рисование Линии (Линий)
Код для рисования линий будет помещен в отдельную процедуру, которая называется DrawTheLine. Первым делом необходимо вычислить длину каждого сегмента всей линии графика. Я хочу сказать, что число продаж каждого месяца должно быть представлено сегментом линии; нам нужно вычислить, сколько пространства PictureBox доступно для сегмента каждого месяца. Это действительно простая математика:
' Вычисляем длину базовой линии, нарисованной в предыдущей процедуре
BaseLineLength = PBLineChart.Width - (LeftMargin + RightMargin)
' Вычисляем ширину каждого сегмента
LineWidth = (BaseLineLength / Sales.Length)
Sales.Length – это, конечно, количество элементов в массиве, который содержит цифры продаж. Мы используем всю доступную ширину базовой линии и делим ее на количество сегментов, которыми мы хотим заполнить ее.
Расчет вертикальной шкалы
Сегменты линии, которые мы рисуем, будут подниматься и опускаться, представляя повышения и понижения цифр продаж от месяца к месяцу. Эти значения фиксированы. Однако длина вертикальной оси может быть изменена (как мы показывали раньше, изменяя размеры формы и наблюдая, как также меняются размеры PictureBox). Чтобы гарантировать, что высота подъемов и падений будет нарисована пропорционально текущему размеру PictureBox, мы должны вычислить масштаб, т.е. сколько продаж представлено в одном пикселе вертикальной линии. Этот результат будет использован, чтобы гарантировать, что сегменты линии нарисованы пропорционально на всей доступной высоте. Это звучит сложно. В действительности это не так, само вычисление очень простое. Мы делим все число пикселей этой вертикальной линии на максимальное значение, которое мы установили для оси:
Dim VertScale As Double
VertScale = VertLineLength / 1000
и это предоставляет нам пропорциональное значение, которое будет подходящим, сколько бы раз мы не меняли размер формы.
Создаем и рисуем первый сегмент линии
Первый сегмент линии, конечно, будет представлять число продаж января (которое будет началом сегмента линии) и число продаж февраля (конец сегмента линии). Мы знаем, что точки начала и конца каждой линии имеют значения X и Y. Лучшим способом нарисовать сегменты линии будет создание четырех переменных, по одной на каждые два значения X и по одной на каждые два значения Y. Вот код, который это делает:
Dim XPosStart As Integer = CInt(LeftMargin + 30)
Dim XPosEnd As Integer = CInt(XPosStart + LineWidth)
Dim YPosStart As Integer = CInt(Sales(0) * VertScale)
Dim YPosEnd As Integer = CInt(Sales(1) * VertScale)
Названия четырех переменных говорят сами за себя. Арифметика понятна: XPosStart - значение X начала сегмента линии и помещено в 30 пикселях от левого поля. XPosEnd - значение X конца сегмента линии, и вычислено добавлением ширины сегмента (или длины, если вы предпочитаете так думать об этом) к значению начальной точки. YPosStart - значение Y начала сегмента линии. Оно равно значению первого числа продаж (Jan) умноженному на коэффициент вертикального масштаба, который будет создан через мгновение. YPosEnd - значение Y конца сегмента линии. Оно равно значению следующего числа продаж, которым в предыдущем коде случилось быть числу Feb, второго элемента массива.