Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на BASIC / Visual Basic / Гед Мид. Удачные диаграммы GDI+ Работа с графикой [doc].doc
Скачиваний:
23
Добавлен:
02.05.2014
Размер:
870.4 Кб
Скачать

Проверяем 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).