- •Давайте не будем изобретать колесо.
- •Прежде всего: Данные
- •Рисование и Упорство
- •Объект 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, 2, 3
Ладно, чтобы быть совсем точным, правильнее было бы сказать: «Проверяем 1, 2, … 1500». Если вы сейчас хотите убедиться, что код все еще работает, поместите следующий отрывок кода в событие Click кнопки btnDraw, а затем щелкните на кнопке.
Private Sub btnDraw_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles btnDraw.Click
' Различные действия теперь разделены в разные процедуры чтобы сделать
' проект более модульным
' 1. Получаем данные
GetData()
' 2. Получаем объект Graphics и его методы для рисования
g = GetGraphics()
' 3. Рисуем вертикальную ось
DrawVerticalAxis(g)
' : Еще добавим код позже ....
' n. Назначаем bitmap вертикальной оси, проведенной к PictureBox
PBBarChart.Image = bmap
End Sub
Вы видите, что теперь точки отмечают значения от 100 до 1500, отображая высшее текущее значение продаж – 1472 (Турция). Вы можете изменить значения, перезапустить проект снова и вы увидите, что вертикальная ось изменяется пропорционально.
Базовая линия (ось X)
Вы можете вставить горизонтальную ось, если хотите видеть ее. Создайте новую процедуру и назовите ее Draw3DBars.
Private Sub Draw3DBars()
g.DrawLine(New Pen(Color.Black), LeftMargin, PBBarChart.Height - BaseMargin, _
PBBarChart.Width - RightMargin, PBBarChart.Height - BaseMargin)
' Вычисляем длину базовой линии, нарисованной кодом сверху
BaseLineLength = pbBarChart.Width - (LeftMargin + RightMargin)
' Еще код будет дальше
3D Панели
Я натолкнулся на метод C# для рисования панелей с 3D эффектом на codeproject.com. Автор Michael Damron использовал простую, но очень эффективную идею надстраивания серии многоугольников один над другим. Многоугольник более светлого цвета завершает эффект при помещении его сверху панели. Я переделал его оригинальную мысль для этого проекта. Вот путь, которым я шел: первые несколько элементов кода работают с некоторыми из основных требуемых вычислений. Например, мы можем рассчитать оптимальную ширину каждой панели, применяя общую доступную ширину и разделяя ее на количество панелей; не забудьте учесть требуемое смещение между панелями. Большая часть этого повторяет то, что мы делали в Части 2:
' Вычисляет ширину каждой панели, делая доступным все возможное пространство
BarWidth = CInt((BaseLineLength / SalesData.Count) - BarGap)
' Устанавливает начальную точку первой панели
Dim BarStartX As Integer = LeftMargin + BarGap
' Устанавливает базовую линию графика
Dim BaseLine As Integer = PBBarChart.Height - BaseMargin
' Вычисляет масштаб (новый в этом проекте)
VertScale = VertLineLength / HighSale
' : Дальнейший код последует
- единственный новый элемент – переменная VertScale, которая обеспечивает, что панели будут нарисованы правильной высоты, позволяя масштабирование, которое мы применили в процедуре DrawVerticalAxis раньше. Эта процедура продолжается следующим блоком кода, который рисует по очереди каждую панель. Я добавил достаточно много комментариев и (особенно если вы прочли предыдущие статьи) это должно иметь смысл для вас.
For Each gd As GraphData In SalesData
' Устанавливаем позиции четырех точек самого нижнего
' параллелограмма и помещаем в массив
Dim Corners(3) As Point
Corners(0) = New Point(BarStartX, BaseLine - 10)
Corners(1) = New Point(BarStartX + BarWidth - 5, BaseLine - 10)
Corners(2) = New Point(BarStartX + BarWidth, BaseLine)
Corners(3) = New Point(BarStartX + 5, BaseLine)
' Вычисляем высоту этой панели, принимая в расчет масштаб:
Dim BarHeight As Integer = CInt(gd.Sales * VertScale)
' Создаем кисти для рисования панелей
' Цвета будут изменяться, согласно GraphData
Dim barmainBrush As New HatchBrush(HatchStyle.Percent50, gd.BarColor)
Dim bartopBrush As New SolidBrush(gd.BarColor)
' Рисуем одну завершенную панель
For i As Integer = 0 To BarHeight - 11
‘ (“BarHeight - 11” может быть непонятным. Это делает возможным:
‘ a. 10 пикселей, которые добавляются для создания эффекта 3D глубины
‘ плюс
‘ b. последний ромб должен быть нарисован более светлым, поэтому нам
‘ нужно прекратить рисовать такой штриховкой на 1 пиксель ниже
‘ высоты всей панели.
' Заполняем следующий многоугольник с помощью hatchbrush
g.FillPolygon(barmainBrush, Corners)
' Поднимаем все позиции Y картинки на 1 пиксель
Corners(0).Y -= 1
Corners(1).Y -= 1
Corners(2).Y -= 1
Corners(3).Y -= 1
Next
' Наконец, увенчиваем его более светлым ромбом
g.FillPolygon(bartopBrush, Corners)
' Перемещаем начальную точку следующей панели
BarStartX += CInt(BarWidth + BarGap)
‘ Избавляемся от кистей
barmainBrush.Dispose()
bartopBrush.Dispose()
Next
End Sub
(Если хотите проверить эту процедуру, не забудьте вызвать ее в событии btnDraw_Click).