【TeeChart Pro ActiveX教程】(十三):圖表面板上的自定義繪圖(上)
TeeChart通過Canvas對象提供廣泛的自定義繪圖工具。使用Canvas,您可以在“Chart Panel”的任何位置添加形狀,線條和文本,并定義其顏色,筆和畫筆樣式。
TeeChart畫布
繪圖順序
使用TeeChart的Canvas方法時(shí),請記住繪圖順序很重要。在圖表上繪制一條線然后添加系列數(shù)據(jù)點(diǎn)將導(dǎo)致線透支。 有四個(gè)主要的圖表繪制事件,按順序排列:
- BeforeDraw事件
- BeforeDrawAxes事件
- BeforeDrawSeries事件
- AfterDraw事件
[C#]
private bool afterDraw; private bool beforeDraw; private bool beforeDrawAxis; private bool beforeDrawSeries; private void Form1_Load(object sender, System.EventArgs e) { SetFlags(ref beforeDraw); Bar bar1 = new Bar(tChart1.Chart); bar1.FillSampleValues(20); radioButton1.Checked = true; } private void SetFlags(ref bool Flag) { beforeDraw = false; afterDraw = false; beforeDrawAxis = false; beforeDrawSeries = false; Flag = true; } private void DrawShape(Steema.TeeChart.Drawing.Graphics3D gg) { gg.Brush.Color = Color.Yellow; gg.Pen.Visible = true; gg.Pen.Style = System.Drawing.Drawing2D.DashStyle.Dash; gg.Brush.Visible = true; gg.Ellipse(1,1,gg.Chart.Width - 1,gg.Chart.Height - 1); } private void tChart1_AfterDraw(object sender, Steema.TeeChart.Drawing.Graphics3D g) { if(afterDraw) { DrawShape(g); } } private void tChart1_BeforeDraw(object sender, Steema.TeeChart.Drawing.Graphics3D g) { if(beforeDraw) { DrawShape(g); } } private void tChart1_BeforeDrawAxes(object sender, Steema.TeeChart.Drawing.Graphics3D g) { if(beforeDrawAxis) { DrawShape(g); } } private void tChart1_BeforeDrawSeries(object sender, Steema.TeeChart.Drawing.Graphics3D g) { if(beforeDrawSeries) { DrawShape(g); } } private void radioButton4_Click(object sender, System.EventArgs e) { SetFlags(ref afterDraw); tChart1.Refresh(); } private void radioButton3_Click(object sender, System.EventArgs e) { SetFlags(ref beforeDrawSeries); tChart1.Refresh(); } private void radioButton2_Click(object sender, System.EventArgs e) { SetFlags(ref beforeDrawAxis); tChart1.Refresh(); } private void radioButton1_Click(object sender, System.EventArgs e) { SetFlags(ref beforeDraw); tChart1.Refresh(); }
[VB.Net]
Private BeforeDraw As Boolean Private BeforeDrawAxis As Boolean Private BeforeDrawSeries As Boolean Private AfterDraw As Boolean Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load SetFlags(BeforeDraw) Dim Bar1 As New Steema.TeeChart.Styles.Bar(TChart1.Chart) Bar1.FillSampleValues(20) RadioButton1.Checked = True End Sub Private Sub SetFlags(ByRef Flag As Boolean) BeforeDraw = False BeforeDrawAxis = False BeforeDrawSeries = False AfterDraw = False Flag = True End Sub Private Sub DrawShape(ByVal gg As Steema.TeeChart.Drawing.Graphics3D) gg.Brush.Color = Color.Yellow gg.Pen.Visible = True gg.Pen.Style = Drawing.Drawing2D.DashStyle.Dash gg.Brush.Visible = True gg.Ellipse(1, 1, gg.Chart.Width - 1, gg.Chart.Height - 1) End Sub Private Sub TChart1_AfterDraw(ByVal sender As Object, ByVal g As Steema.TeeChart.Drawing.Graphics3D) Handles TChart1.AfterDraw If AfterDraw = True Then DrawShape(g) End If End Sub Private Sub TChart1_BeforeDraw(ByVal sender As Object, ByVal g As Steema.TeeChart.Drawing.Graphics3D) Handles TChart1.BeforeDraw If BeforeDraw = True Then DrawShape(g) End If End Sub Private Sub TChart1_BeforeDrawAxes(ByVal sender As Object, ByVal g As Steema.TeeChart.Drawing.Graphics3D) Handles TChart1.BeforeDrawAxes If BeforeDrawAxis = True Then DrawShape(g) End If End Sub Private Sub TChart1_BeforeDrawSeries(ByVal sender As Object, ByVal g As Steema.TeeChart.Drawing.Graphics3D) Handles TChart1.BeforeDrawSeries If BeforeDrawSeries = True Then DrawShape(g) End If End Sub Private Sub RadioButton4_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles RadioButton4.Click SetFlags(AfterDraw) TChart1.Refresh() End Sub Private Sub RadioButton3_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles RadioButton3.Click SetFlags(BeforeDrawSeries) TChart1.Refresh() End Sub Private Sub RadioButton2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles RadioButton2.Click SetFlags(BeforeDrawAxis) TChart1.Refresh() End Sub Private Sub RadioButton1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles RadioButton1.Click SetFlags(BeforeDraw) TChart1.Refresh() End Sub
確保將自定義繪制的項(xiàng)目保存到Canvas
如果不在其中一個(gè)Chart事件中調(diào)用Canvas繪制代碼,則自定義繪圖將不會永久保存到Canvas,從而導(dǎo)致在應(yīng)用程序最小化時(shí)丟失任何添加內(nèi)容或另一個(gè)窗口放在它上面。您的代碼不需要直接駐留在Chart事件中; 如果將代碼放在BeforeDrawSeries / AfterDraw中并且檢查運(yùn)行時(shí)設(shè)置的標(biāo)記,則可以在圖表窗口的生命周期中保存用戶繪制的項(xiàng)目。當(dāng)活動標(biāo)記為true時(shí),繪制方法因此運(yùn)行繪制代碼,如上例所示。
繪制線
讓我們添加一個(gè)畫布線: 示例(從左上角到右下角對角畫一條線)
[C#]
private void Form1_Load(object sender,System.EventArgs e){ line1.FillSampleValues(20); line1.VertAxis = VerticalAxis.Both; line1.HorizAxis = Horizo??ntalAxis.Both; tChart1.Aspect.View3D = false; } private void tChart1_AfterDraw(object sender,Steema.TeeChart.Drawing.Graphics3D g){ Point s = new Point(tChart1.Axes.Left.Position,tChart1.Axes.Top.Position); 點(diǎn)e =新點(diǎn)(tChart1.Axes.Right.Position,tChart1.Axes.Bottom.Position); g.MoveTo(一個(gè)或多個(gè)); g.LineTo(E,0); }
[VB.Net]
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Line1.FillSampleValues(20) Line1.VertAxis = Steema.TeeChart.VerticalAxis.Both Line1.HorizAxis = Steema.TeeChart.HorizontalAxis.Both TChart1.Aspect.View3D = False End Sub Private Sub TChart1_AfterDraw(ByVal sender As Object, ByVal g As Steema.TeeChart.Drawing.Graphics3D) Handles TChart1.AfterDraw Dim S As New Point(TChart1.Axes.Left.Position, TChart1.Axes.Top.Position) Dim E As New Point(TChart1.Axes.Right.Position, TChart1.Axes.Bottom.Position) g.MoveTo(S) g.LineTo(E, 0) End Sub
在3D圖表上,由于3D正交位移,軸位置偏離圖表區(qū)域。我們可以相應(yīng)地移動線: 示例(在3D圖表的圖表區(qū)域中從左上角到右下角對角繪制一條線)
[C#]
private void Form1_Load(object sender, System.EventArgs e) { line1.FillSampleValues(20); line1.VertAxis = VerticalAxis.Both; line1.HorizAxis = HorizontalAxis.Both; tChart1.Aspect.Chart3DPercent = 50; } private void tChart1_AfterDraw(object sender, Steema.TeeChart.Drawing.Graphics3D g) { Steema.TeeChart.Drawing.Point3D s = new Steema.TeeChart.Drawing.Point3D(); s.X = tChart1.Axes.Left.Position; s.Y = tChart1.Axes.Top.Position; s.Z = 0; Steema.TeeChart.Drawing.Point3D e = new Steema.TeeChart.Drawing.Point3D(); e.X = tChart1.Axes.Right.Position; e.Y = tChart1.Axes.Bottom.Position; e.Z = tChart1.Aspect.Width3D; g.MoveTo(s); g.LineTo(e); }
[VB.Net]
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Line1.FillSampleValues(20) Line1.VertAxis = Steema.TeeChart.VerticalAxis.Both Line1.HorizAxis = Steema.TeeChart.HorizontalAxis.Both TChart1.Aspect.Chart3DPercent = 50 End Sub Private Sub TChart1_AfterDraw(ByVal sender As Object, ByVal g As Steema.TeeChart.Drawing.Graphics3D) Handles TChart1.AfterDraw Dim S As New Steema.TeeChart.Drawing.Point3D() S.X = TChart1.Axes.Left.Position S.Y = TChart1.Axes.Top.Position S.Z = 0 Dim E As New Steema.TeeChart.Drawing.Point3D() E.X = TChart1.Axes.Right.Position E.Y = TChart1.Axes.Bottom.Position E.Z = TChart1.Aspect.Width3D g.MoveTo(S) g.LineTo(E) End Sub
畫布筆和畫筆
上面的線是使用為繪制線之前繪制的最后一個(gè)對象定義的筆和畫筆繪制的。那可能是也可能不是你想要的筆。相應(yīng)地更改筆: 示例(在繪制線之前定義筆)
[C#]
private void tChart1_AfterDraw(object sender, Steema.TeeChart.Drawing.Graphics3D g) { Point p5 = new Point(line1.CalcXPos(5), line1.CalcYPos(5)); Point p15 = new Point(line1.CalcXPos(15), line1.CalcYPos(15)); g.Pen.DashCap = System.Drawing.Drawing2D.DashCap.Triangle; g.Pen.EndCap = System.Drawing.Drawing2D.LineCap.DiamondAnchor; g.Pen.Style = System.Drawing.Drawing2D.DashStyle.DashDotDot; g.Pen.Transparency = 70; g.Pen.Width = 3; g.Pen.Color = Color.BlueViolet; g.MoveTo(p5); g.LineTo(p15, 0); }
[VB.Net]
Private Sub TChart1_AfterDraw(ByVal sender As Object, ByVal g As Steema.TeeChart.Drawing.Graphics3D) Handles TChart1.AfterDraw Dim P5 As New Point(Line1.CalcXPos(5), Line1.CalcYPos(5)) Dim P15 As New Point(Line1.CalcXPos(15), Line1.CalcYPos(15)) g.Pen.DashCap = System.Drawing.Drawing2D.DashCap.Triangle g.Pen.EndCap = System.Drawing.Drawing2D.LineCap.DiamondAnchor g.Pen.Style = System.Drawing.Drawing2D.DashStyle.DashDotDot g.Pen.Transparency = 70 g.Pen.Width = 3 g.Pen.Color = Color.BlueViolet g.MoveTo(P5) g.LineTo(P15, 0) End Sub
購買TeeChart Pro AciveX正版授權(quán),請點(diǎn)擊“咨詢在線客服”喲!