
- •Давайте не будем изобретать колесо.
- •Прежде всего: Данные
- •Рисование и Упорство
- •Объект 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
- •Проверяем
- •Итоги первой демонстрации
- •Затененный график
- •Значения вертикальной оси
- •Код Вертикальных Значений
- •Подвижные направляющие линии
- •Отображаем направляющие линии
- •Направляющие линии и отображенные значения
- •Вертикальные значения
- •Возможные улучшения
- •Охваченные темы
Шаг 4b: Вертикальная ось
Вертикальная ось диаграммы (в технике известная, как ось Y) будет нарисована внутри PictureBox. Мы отодвинем ее от границы, используя значения, которые мы присвоили переменным TopMargin, LeftMargin и BaseMargin. У этой оси будут маленькие точечные отметки с равными промежутками, каждый будет обозначать 100 продаж. В дополнение, значение каждой отметки будет написано возле отметки. Рисунок ниже показывает пример части вертикальной оси. Всю ее вы можете видеть на рисунке вначале статьи:
Следующий код устанавливает начальную точку и конечную точку вертикальной оси:
Dim StartPoint As New Point(LeftMargin, PBBarChart.Height - BaseMargin)
Dim EndPoint As New Point(LeftMargin, TopMargin)
Названия переменных StartPoint и EndPoint не нуждаются в объяснении, но понятие Point (точка) стоит упоминания. Нам хорошо знакомо понятие точки – это определенное место, которое может быть определено определенным способом. В графике .NET точка (Point) идентифицируется ее X-положением (как далеко она отдалена от левого края) и ее Y-положением (как далека она от верха). В данном проекте мы измеряем эти два значения в пикселях, потому что эта единица используется для определения позиций на экране. Важно понимать, что Point – это не просто положение в пространстве, фактически это Объект, завершенный в своих свойствах и методах. Вы видите, что StartPoint объекта Point имеет свою X-позицию, установленную в строке с левым полем, которое мы установили раньше; ее Y-позиция вычислена перемещением от основания PictureBox на расстояние, равное BaseMargin. EndPoint оси имеет X-значение, такое же, как и у StartPoint, чего можно было ожидать (в конце концов, это вертикальная линия). Ее Y-значение установлено в точке, которая отступает от верхнего края PictureBox на значениие TopMargin. Вооружившись начальной и конечно точками, мы берем перо и рисуем линию:
Dim LinePen As New Pen(Color.Black, 2)
g.DrawLine(LinePen, StartPoint, EndPoint)
Если вы вводите код по мере прочтения статьи, вы можете поинтересоваться, почему вы не можете видеть, как появляется то, что рисуется. Причина в том, что мы нарисовали линию объекта, который еще не видим для пользователя. На самом деле, мы используем технику, известную как двойная буферизация, при которой мы создали объект изображения того же размера, что и PictureBox и скрыто используем это изображение. На данном уровне мы еще не присвоили это изображение PictureBox’у в качестве его изображения.
Шаг 4c: Отметки и текст
Из-за того, что мы сами генерировали данные во время разработки, мы знаем, что максимальное число продаж равно 942. Поэтому мы заранее знаем, что будет безопасно нарисовать вертикальную ось, которая будет содержать значения от 0 до 1000, и все значения продаж будут находиться в промежутке между этими двумя крайними значениями. В дальнейшем мы будем принимать пользовательские данные во время выполнения и динамически рассчитывать, сколько будет нужно отметок. Но пока что мы будем делать это легким (ну ладно, более легким) способом. Чтобы решить, как растягивать пространство десяти отметок, нам нужно прежде всего узнать длину вертикальной оси:
Dim VertLineLength As Integer = PBBarChart.Height - (BaseMargin + TopMargin)
Это даст нам возможность рассчитать точное расстояние между отметками. Размещая метки от 0 до 1000 с интервалом 100, запоминаем:
Dim VertGap As Integer = CInt(VertLineLength / 10)
Я произвольно выбрал установить (горизонтальную) длину каждой отметки равной 5 пикселей. Тогда следует, что начальная точка каждой отметки должна быть в 5 пикселях слева от вертикальной оси. Конечная точка каждой отметки будет на самой вертикальной оси. Это и есть необходимые X-позиции и они являются одними и теми же для каждой отметки. Y-позиции (которые вы получите, отсчитав количество пикселей вниз от верха) должны меняться для каждой отметки, потому что мы рисуем десять их на равном расстоянии на вертикальной оси. Расстояние между ними, следовательно, должно быть значением, которое мы только что вычислили – VertGap.
Dim TickSP As New Point(LeftMargin - 5, StartPoint.Y - VertGap)
Dim TickEP As New Point(LeftMargin, StartPoint.Y - VertGap)
У нас есть вся необходимая информация для создания отметок и текста 100, 200, 300 и т.д. Давайте установим шрифт для текста:
Dim ValueFont As New Font("Arial", 8, FontStyle.Regular)
И мы можем повторить это 10 раз в блоке кода, который нарисует отметки от низа до верха и в то же время добавит сотни в виде текста:
For i As Integer = 1 To 10
' Отметка
g.DrawLine(New Pen(Color.Black), TickSP, TickEP)
' Значение отметки в виде текста
g.DrawString(CStr(i * 100), ValueFont, Brushes.Black, 2, TickSP.Y - 5)
' Сброс y-позиции, перемещение на 10% вверх по вертикальной линии
TickSP.Y -= VertGap
TickEP.Y -= VertGap
Next
Единственный код, который требует дополнительного объяснения, это тот, который использует DrawString, чтобы нарисовать текст возле отметок. Вы можете заметить, что Y-позиция начала текста была смещена на 5 пикселей вверх, чем начало самой отметки (TickSP, Y-5). Это просто, потому что X,Y позиция (исходная точка) нарисованной строки является самой верхней точкой воображаемого прямоугольника, в котором изображен текст. Поэтому, чтобы поместить середину текста приблизительно на один уровень с отметкой, эта исходная точка должна быть смещена на пять пикселей вверх на странице.