none
chartコントロールのゼロラインが最前面に表示されてしまう RRS feed

  • 質問

  • 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 = 1

            End 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 With

                For index = 0 To 10000   //仮データセット
                    .Points.AddY(0)
                Next

        chart.series.add(chartLine)

            Next





    • 編集済み ttmac_ 2019年3月6日 9:09
    2019年3月6日 9:02

回答

  • こんな

    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!)

    • 編集済み gekkaMVP 2019年3月6日 11:33
    • 回答としてマーク ttmac_ 2019年3月7日 0:51
    2019年3月6日 11:31

すべての返信

  • こんな

    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!)

    • 編集済み gekkaMVP 2019年3月6日 11:33
    • 回答としてマーク ttmac_ 2019年3月7日 0:51
    2019年3月6日 11:31
  • gekkaさん

    うまくいきました。

    ありがとうございました。

    2019年3月7日 0:52