- •Давайте не будем изобретать колесо.
- •Прежде всего: Данные
- •Рисование и Упорство
- •Объект 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
- •Проверяем
- •Итоги первой демонстрации
- •Затененный график
- •Значения вертикальной оси
- •Код Вертикальных Значений
- •Подвижные направляющие линии
- •Отображаем направляющие линии
- •Направляющие линии и отображенные значения
- •Вертикальные значения
- •Возможные улучшения
- •Охваченные темы
Нарисуем это!
В Части 1 мы создавали круговую диаграмму, рисуя непосредственно на форме, с помощью принадлежащего форме объекта Graphics. В этой статье мы собираемся создать гистограмму, снова основанную на некоторых отвлеченных данных – цифрах продаж шести европейских стран. Однако в этот раз мы будем рисовать диаграмму внутри элемента PictureBox.
Вообще, есть небольшое различие между двумя подходами – рисование непосредственно на форме или рисование внутри PictureBox. В этом проекте мы нарисуем диаграмму, когда пользователь щелкнет на кнопке. Как и в Части 1 дисплей будет перерисовываться, когда он будет закрыт или изменен (это известно, как «упорный» рисунок). В примере с круговой диаграммой мы использовали метод формы OnPaint для создания диаграммы заново каждый раз, когда требовалось перерисовать ее заново. Этот подход вполне подходит в большинстве ситуаций. Однако чтобы повысить уровень нашего мастерства, мы собираемся подойти к этой работе с другой стороны, в этот раз мы будем применять объект Bitmap. Если вы новичок в графике, вы можете найти некоторые темы запутанными. Иногда кажется, что вы полностью теряете возможность отследить действия множества графических объектов, отображений, картинок, рисованных поверхностей и их взаимодействия. Но с помощью этих статей все должно оказаться для вас на своих местах. Шаг за шагом я объясню графические процедуры, которые буду использовать для рисования диаграммы. Разделяя код на маленькие части, я надеюсь сделать разные методы легкими для понимания. Так же я включу полностью комментированную демонстрационную версию в Visual Studio Solution которая добавлена к этой статье.
Давайте начнем
Итак, если мы не собираемся помещать код в событие OnPaint на этот раз, то куда он пойдет? Очевидно, один вариант – поместить его в событие кнопки click. Однако чтобы сохранить код в виде легких для следования кусков, я предпочел создать две отдельные процедуры, которые вызываются одна за другой в событии кнопки click. Задачи, предпринятые в соответствии с двумя этими процедурами:
Генерация данных
Рисование диаграммы
Теперь посмотрим на каждую из этих процедур по очереди.
Шаг 1: генерация данных
Ради непрерывности мы будем использовать Structure и ArrayList для данных, потому что этот подход мы использовали в Части 1. Поместите эти операторы вверху формы:
Option Strict On
Imports System.Drawing.Drawing2D
Imports System.Collections
Создайте структуру, подобную той, что использовалась в Части 1 (поместите в код формы, но отдельно от процедур):
Structure GraphData
Dim Country As String
Dim Sales As Short
Sub New(ByVal country As String, ByVal sales As Short)
Me.Country = country
Me.Sales = sales
End Sub
End Structure
Инициируйте ArrayList, чтобы хранить данные. И снова, поместите это в код формы вне процедур:
Dim SalesData As New ArrayList
Процедура GetData генерирует некоторые данные для образца: шесть стран и шесть цифр продаж. (Заглянем в будущее, в Части 3 мы увидим, как заменить их кодом, которые читает данные из файла или принимает введенные пользователем.)
Private Sub GetData()
SalesData.Clear()
' Гарантируем, что сохраняется только один набор сгенерированных данных
SalesData.Clear()
' Генерируем данные и помещаем их в массив
SalesData.Add(New GraphData("Belgium", 834))
SalesData.Add(New GraphData("Greece", 385))
SalesData.Add(New GraphData("Portugal", 672))
SalesData.Add(New GraphData("Spain", 429))
SalesData.Add(New GraphData("Turkey", 715))
SalesData.Add(New GraphData("UK", 942))
End Sub
Теперь у нас есть данные, которые можно применить для создания нашей диаграммы.