/
MainForm.vb
86 lines (71 loc) · 3.72 KB
/
MainForm.vb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
Imports DevExpress.Drawing
Imports DevExpress.XtraCharts
Imports System
Imports System.Drawing
Imports System.Windows.Forms
Namespace CustomCheckboxesInLegendViewAndBehavior
Public Partial Class mainForm
Inherits Form
Const LegendRadioSide As Integer = 17
Const LegendRadioInnerPointBoundsSide As Integer = 8
Const LegendRadioWidth As Single = 1.5F
Private initializationFlag As Boolean = False
Public Sub New()
InitializeComponent()
chartControl.BeginInit()
If True Then
AddHandler chartControl.LegendItemChecked, AddressOf OnLegendItemChecked
AddHandler chartControl.CustomDrawSeries, AddressOf OnCustomDrawSeries
chartControl.Legend.UseCheckBoxes = True
chartControl.Series("Point").CheckedInLegend = False
chartControl.Series("Line").CheckedInLegend = True
chartControl.Series("Area").CheckedInLegend = False
End If
chartControl.EndInit()
initializationFlag = False
End Sub
Private Sub OnLegendItemChecked(ByVal sender As Object, ByVal e As LegendItemCheckedEventArgs)
If initializationFlag = True Then Return
initializationFlag = True
If True Then
Dim checkedSeries As Series = TryCast(e.CheckedElement, Series)
If checkedSeries Is Nothing Then Throw New Exception("Expected series only")
For Each series As Series In chartControl.Series
series.CheckedInLegend = False
Next
checkedSeries.CheckedInLegend = True
chartControl.Titles(0).Text = checkedSeries.Name
End If
initializationFlag = False
End Sub
Private Sub OnCustomDrawSeries(ByVal sender As Object, ByVal e As CustomDrawSeriesEventArgs)
Dim bitmap As DXBitmap = New DXBitmap(LegendRadioSide, LegendRadioSide)
Using graphics As DXGraphics = DXGraphics.FromImage(bitmap)
graphics.SmoothingMode = DXSmoothingMode.HighQuality
Dim seriesColor As Color = GetSeriesColor(e.Series, chartControl)
Using radioPen As DXPen = New DXPen(seriesColor, LegendRadioWidth)
Dim radioRadius As Integer = LegendRadioSide - 3
Dim radioRectangle As Rectangle = New Rectangle(1, 1, radioRadius, radioRadius)
graphics.DrawEllipse(radioPen, radioRectangle)
End Using
If e.Series.CheckedInLegend Then
Using brush As DXBrush = New DXSolidBrush(seriesColor)
Dim coord As Integer =(LegendRadioSide - LegendRadioInnerPointBoundsSide) \ 2
Dim filledEllipseBounds As Rectangle = New Rectangle(coord, coord, LegendRadioInnerPointBoundsSide, LegendRadioInnerPointBoundsSide)
graphics.FillEllipse(brush, filledEllipseBounds)
End Using
End If
End Using
e.DisposeLegendMarkerImage = True
e.DXLegendMarkerImage = bitmap
End Sub
Private Function GetSeriesColor(ByVal series As Series, ByVal chartControl As ChartControl) As Color
Dim seriesIndex As Integer = chartControl.Series.IndexOf(series)
Dim paletteName As String = chartControl.PaletteName
Dim currentPalette As Palette = chartControl.PaletteRepository(paletteName)
Dim paletteEntryAccordingToSeries As PaletteEntry = currentPalette(seriesIndex)
Dim result As Color = paletteEntryAccordingToSeries.Color
Return result
End Function
End Class
End Namespace