トップ回答者
chartコントロールのゼロラインが最前面に表示されてしまう

質問
-
Visual studio 2013 のVBにて、chartコントロールを使用して開発しております。
SeriesのチャートタイプはFastPointで複数本表示するのですが、
Y=0のラインが最前面に表示されてしまいます。
再背面にしたいのですが、プロパティ等を探してみても今の所見つかっておりません。
コントロールの主な初期化部分は下記になります。
変数宣言等、省いております。
よろしくお願い致します。
With chart
.Series.Clear()
.ChartAreas.Clear()
.BackColor = SystemColors.Control
.Legends(0).BackColor = .BackColor
.Legends(0).Docking = Docking.Left
.Legends(0).Enabled = True
End With
With chartArea
.BackColor = SystemColors.Control
.AxisX.Minimum = 0
.AxisX.Maximum = 10000
.AxisX.MajorTickMark.Interval = .AxisX.Maximum / 5
.CursorX.IsUserEnabled = True
.AxisX.ScaleView.Zoomable = True
.CursorX.IsUserSelectionEnabled = True
.CursorX.Interval = 1
'Yレンジ
.AxisY.Title = "Channel"
.AxisY.Minimum = -5
.AxisY.Maximum = 9
.AxisY.MajorTickMark.Interval = 1
.AxisY.LabelStyle.Interval = .AxisY.MajorTickMark.Interval
.AxisY.MajorTickMark.Enabled = False 'True
.AxisY.MajorGrid.Enabled = True
.AxisY.MinorTickMark.Enabled = False
.AxisY.MinorGrid.Enabled = False
.AxisY.MajorGrid.Interval = 1
.AxisY.MajorGrid.LineColor = Color.Gray
.AxisY.MajorGrid.LineDashStyle = ChartDashStyle.Dot
.AxisY.LabelStyle.Enabled = False
.CursorX.IsUserSelectionEnabled = True
.CursorX.Interval = 10
''ゼロライン このラインが最前面に表示されてしまう
.AxisY.Crossing = 0
.AxisY2.Crossing = 0
.AxisX.IsMarksNextToAxis = False
.AxisX.LineColor = Color.Cyan
.AxisX.LineWidth = 1End With
chart.ChartAreas.Add(chartArea)
For index As Integer = 0 To 2
chartLine = New Series
With chartLine
.ChartType = SeriesChartType.FastPoint
.BorderWidth = 2
.BorderDashStyle = ChartDashStyle.Solid
.MarkerStyle = MarkerStyle.Circle
.MarkerSize = 2
End WithFor index = 0 To 10000 //仮データセット
.Points.AddY(0)
Next
chart.series.add(chartLine)
Next
- 編集済み ttmac_ 2019年3月6日 9:09
回答
-
こんな
Imports System.Windows.Forms.DataVisualization.Charting Public Class Form1 Sub New() ' この呼び出しはデザイナーで必要です。 InitializeComponent() ' InitializeComponent() 呼び出しの後で初期化を追加します。 With chart .Series.Clear() .ChartAreas.Clear() .BackColor = SystemColors.Control .Legends(0).BackColor = .BackColor .Legends(0).Docking = Docking.Left .Legends(0).Enabled = True End With Dim chartArea As ChartArea = New ChartArea() With ChartArea .BackColor = SystemColors.Control .AxisX.Minimum = 0 .AxisX.Maximum = 10000 .AxisX.MajorTickMark.Interval = .AxisX.Maximum / 5 .CursorX.IsUserEnabled = True .AxisX.ScaleView.Zoomable = True .CursorX.IsUserSelectionEnabled = True .CursorX.Interval = 1 'Yレンジ .AxisY.Title = "Channel" .AxisY.Minimum = -5 .AxisY.Maximum = 9 .AxisY.MajorTickMark.Interval = 1 .AxisY.LabelStyle.Interval = .AxisY.MajorTickMark.Interval .AxisY.MajorTickMark.Enabled = False 'True .AxisY.MajorGrid.Enabled = True .AxisY.MinorTickMark.Enabled = False .AxisY.MinorGrid.Enabled = False .AxisY.MajorGrid.Interval = 1 .AxisY.MajorGrid.LineColor = Color.Gray .AxisY.MajorGrid.LineDashStyle = ChartDashStyle.Dot .AxisY.LabelStyle.Enabled = False .CursorX.IsUserSelectionEnabled = True .CursorX.Interval = 10 ''ゼロライン このラインが最前面に表示されてしまう .AxisY.Crossing = 0 .AxisY2.Crossing = 0 .AxisX.IsMarksNextToAxis = False .AxisX.LineColor = Color.Cyan .AxisX.LineWidth = 10 '判り易くするために太くしてみる .AxisY.MajorGrid.LineWidth = 5 End With chart.ChartAreas.Add(chartArea) For index As Integer = 0 To 2 Dim chartLine = New Series With chartLine .ChartType = SeriesChartType.FastPoint .BorderWidth = 2 .BorderDashStyle = ChartDashStyle.Solid .MarkerStyle = MarkerStyle.Circle .MarkerSize = 2 For index2 As Integer = 0 To 10000 '仮データセット .Points.AddY(Math.Sin(index2 / 180 * Math.PI / 10 + index) * 5) Next End With chart.Series.Add(chartLine) Next End Sub Private Sub chart_PrePaint(sender As Object, e As ChartPaintEventArgs) Handles chart.PrePaint If (TypeOf e.ChartElement Is ChartArea) Then Dim area As System.Windows.Forms.DataVisualization.Charting.ChartArea area = CType(e.ChartElement, ChartArea) Dim lineColor As Color lineColor = area.AxisX.LineColor area.AxisX.Tag = area.AxisX.LineColor '一時退避 area.AxisX.LineColor = Color.Transparent '通常の描画で線が引かれないように透明にしておく '通常の描画が行われる前に自前で線を引いておく Dim brush As Brush = New SolidBrush(lineColor) Dim pen As Pen = New Pen(brush, area.AxisX.LineWidth) pen.DashStyle = area.AxisX.LineDashStyle Dim x0 = e.ChartGraphics.GetPositionFromAxis(area.Name, AxisName.X, area.AxisX.ScaleView.ViewMinimum) Dim x1 = e.ChartGraphics.GetPositionFromAxis(area.Name, AxisName.X, area.AxisX.ScaleView.ViewMaximum) Dim y = e.ChartGraphics.GetPositionFromAxis(area.Name, AxisName.Y, area.AxisY.Crossing) Dim p0 = e.ChartGraphics.GetAbsolutePoint(New PointF(x0, y)) Dim p1 = e.ChartGraphics.GetAbsolutePoint(New PointF(x1, y)) e.ChartGraphics.Graphics.DrawLine(pen, p0, p1) End If End Sub Private Sub chart_PostPaint(sender As Object, e As ChartPaintEventArgs) Handles chart.PostPaint If (TypeOf e.ChartElement Is ChartArea) Then Dim area As System.Windows.Forms.DataVisualization.Charting.ChartArea area = CType(e.ChartElement, ChartArea) area.AxisX.LineColor = CType(area.AxisX.Tag, Color) '退避から復帰 End If End Sub End Class
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
すべての返信
-
こんな
Imports System.Windows.Forms.DataVisualization.Charting Public Class Form1 Sub New() ' この呼び出しはデザイナーで必要です。 InitializeComponent() ' InitializeComponent() 呼び出しの後で初期化を追加します。 With chart .Series.Clear() .ChartAreas.Clear() .BackColor = SystemColors.Control .Legends(0).BackColor = .BackColor .Legends(0).Docking = Docking.Left .Legends(0).Enabled = True End With Dim chartArea As ChartArea = New ChartArea() With ChartArea .BackColor = SystemColors.Control .AxisX.Minimum = 0 .AxisX.Maximum = 10000 .AxisX.MajorTickMark.Interval = .AxisX.Maximum / 5 .CursorX.IsUserEnabled = True .AxisX.ScaleView.Zoomable = True .CursorX.IsUserSelectionEnabled = True .CursorX.Interval = 1 'Yレンジ .AxisY.Title = "Channel" .AxisY.Minimum = -5 .AxisY.Maximum = 9 .AxisY.MajorTickMark.Interval = 1 .AxisY.LabelStyle.Interval = .AxisY.MajorTickMark.Interval .AxisY.MajorTickMark.Enabled = False 'True .AxisY.MajorGrid.Enabled = True .AxisY.MinorTickMark.Enabled = False .AxisY.MinorGrid.Enabled = False .AxisY.MajorGrid.Interval = 1 .AxisY.MajorGrid.LineColor = Color.Gray .AxisY.MajorGrid.LineDashStyle = ChartDashStyle.Dot .AxisY.LabelStyle.Enabled = False .CursorX.IsUserSelectionEnabled = True .CursorX.Interval = 10 ''ゼロライン このラインが最前面に表示されてしまう .AxisY.Crossing = 0 .AxisY2.Crossing = 0 .AxisX.IsMarksNextToAxis = False .AxisX.LineColor = Color.Cyan .AxisX.LineWidth = 10 '判り易くするために太くしてみる .AxisY.MajorGrid.LineWidth = 5 End With chart.ChartAreas.Add(chartArea) For index As Integer = 0 To 2 Dim chartLine = New Series With chartLine .ChartType = SeriesChartType.FastPoint .BorderWidth = 2 .BorderDashStyle = ChartDashStyle.Solid .MarkerStyle = MarkerStyle.Circle .MarkerSize = 2 For index2 As Integer = 0 To 10000 '仮データセット .Points.AddY(Math.Sin(index2 / 180 * Math.PI / 10 + index) * 5) Next End With chart.Series.Add(chartLine) Next End Sub Private Sub chart_PrePaint(sender As Object, e As ChartPaintEventArgs) Handles chart.PrePaint If (TypeOf e.ChartElement Is ChartArea) Then Dim area As System.Windows.Forms.DataVisualization.Charting.ChartArea area = CType(e.ChartElement, ChartArea) Dim lineColor As Color lineColor = area.AxisX.LineColor area.AxisX.Tag = area.AxisX.LineColor '一時退避 area.AxisX.LineColor = Color.Transparent '通常の描画で線が引かれないように透明にしておく '通常の描画が行われる前に自前で線を引いておく Dim brush As Brush = New SolidBrush(lineColor) Dim pen As Pen = New Pen(brush, area.AxisX.LineWidth) pen.DashStyle = area.AxisX.LineDashStyle Dim x0 = e.ChartGraphics.GetPositionFromAxis(area.Name, AxisName.X, area.AxisX.ScaleView.ViewMinimum) Dim x1 = e.ChartGraphics.GetPositionFromAxis(area.Name, AxisName.X, area.AxisX.ScaleView.ViewMaximum) Dim y = e.ChartGraphics.GetPositionFromAxis(area.Name, AxisName.Y, area.AxisY.Crossing) Dim p0 = e.ChartGraphics.GetAbsolutePoint(New PointF(x0, y)) Dim p1 = e.ChartGraphics.GetAbsolutePoint(New PointF(x1, y)) e.ChartGraphics.Graphics.DrawLine(pen, p0, p1) End If End Sub Private Sub chart_PostPaint(sender As Object, e As ChartPaintEventArgs) Handles chart.PostPaint If (TypeOf e.ChartElement Is ChartArea) Then Dim area As System.Windows.Forms.DataVisualization.Charting.ChartArea area = CType(e.ChartElement, ChartArea) area.AxisX.LineColor = CType(area.AxisX.Tag, Color) '退避から復帰 End If End Sub End Class
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)