C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Chart上の罫線描画の操作について

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■83709 / inTopicNo.1)  Chart上の罫線描画の操作について
  
□投稿者/ KY (16回)-(2017/04/04(Tue) 07:06:38)

分類:[VB.NET/VB2005 以降] 

下記のようなマウスと共に移動する赤色の線を引くプログラムがあるとします。
この赤色の線をマウスを左クリックでは線が消え、その状態で右クリックすれば再度描画が出来るようになる。
そのようにするにはどのようにすればよいのでしょうか?
よろしくお願いします。


Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim dat As DataTable = New DataTable
        With dat.Columns
            .Add("件数", GetType(Integer))
            .Add("数量", GetType(Integer))
        End With

        For i = 0 To 100
            dat.Rows.Add(i, i * 10)
        Next

        Chart1.DataSource = dat
        Chart1.Series.Clear()
        Dim oresen = Chart1.Series.Add("折れ線")
        With oresen
            .ChartType = DataVisualization.Charting.SeriesChartType.Line
            .XValueMember = "件数"
            .YValueMembers = "数量"
            .IsVisibleInLegend = False
        End With
    End Sub

    Private _mp As Point
    Private Sub Chart1_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Chart1.MouseMove
        _mp = e.Location
        Chart1.Invalidate()
    End Sub

    Private Sub Chart1_PostPaint(sender As Object, e As System.Windows.Forms.DataVisualization.Charting.ChartPaintEventArgs) Handles Chart1.PostPaint
        Dim g = e.ChartGraphics.Graphics
        Dim axy = Chart1.ChartAreas(0).AxisY
        Dim y1 = axy.ValueToPixelPosition(axy.Maximum)  'グラフ領域上部のY座標
        Dim y2 = axy.ValueToPixelPosition(axy.Minimum)  'グラフ領域下部のY座標
        g.DrawLine(Pens.Red, _mp.X, CInt(y1), _mp.X, CInt(y2))
    End Sub
End Class

引用返信 編集キー/
■83713 / inTopicNo.2)  Re[1]: Chart上の罫線描画の操作について
□投稿者/ shu (999回)-(2017/04/04(Tue) 09:24:43)
No83709 (KY さん) に返信

マウスの左クリック、右クリックしたときに描画するかどうかのフラグ状態を変更して
各々 Chart1.Invalidate() をする。

引用返信 編集キー/
■83714 / inTopicNo.3)  Re[1]: Chart上の罫線描画の操作について
□投稿者/ 魔界の仮面弁士 (1234回)-(2017/04/04(Tue) 09:25:26)
No83709 (KY さん) に返信
> この赤色の線をマウスを左クリックでは線が消え、その状態で右クリックすれば再度描画が出来るようになる。

左クリックで消えたなら、再度左クリックで復活した方が On/Off 的にはわかりやすい気がします。
(それとも右クリックした場合は、現在位置ではなく消した時の位置に復活させたいのでしょうか)


とりあえず、赤ラインを表示するかどうかは、Boolean 型の変数で管理すれば良いと思います。
On/Off についてですが、左クリックだけなら Click イベントでよいですが、
右クリックかどうかの判定も行うなら、MouseDown イベントが都合が良いでしょう。


以下サンプル。
説明コメントをつけた関係上、お題とは微妙に異なるコードになっていますが御容赦を。

Private _verticalLine As Boolean = True     '左クリックで表示/非表示
Private _horizontalLine As Boolean = True   '右クリックで移動/固定
Private Sub Chart1_MouseDown(sender As Object, e As MouseEventArgs) Handles Chart1.MouseDown
    If e.Button.HasFlag(MouseButtons.Left) Then
        _verticalLine = Not _verticalLine   '左クリックで反転
    End If
    If e.Button.HasFlag(MouseButtons.Right) Then
        _horizontalLine = Not _horizontalLine  '右クリックで反転
        Chart1.Invalidate()
    End If
End Sub
Private _hp As Point
Private _vp As Point
Private Sub Chart1_MouseMove(sender As Object, e As MouseEventArgs) Handles Chart1.MouseMove
    _vp = e.Location       '垂直ラインの座標を現在のカーソル位置にする
    If _horizontalLine Then
        _hp = e.Location   '垂直ラインの座標は、固定モードでない場合のみ更新
    End If
    Chart1.Invalidate()
End Sub

Private Sub Chart1_PostPaint(sender As Object, e As System.Windows.Forms.DataVisualization.Charting.ChartPaintEventArgs) Handles Chart1.PostPaint
    Dim g = e.ChartGraphics.Graphics
    Dim ca = Chart1.ChartAreas(0)
    Dim area = Rectangle.FromLTRB(
        ca.AxisX.ValueToPixelPosition(ca.AxisX.Minimum),
        ca.AxisY.ValueToPixelPosition(ca.AxisY.Minimum),
        ca.AxisX.ValueToPixelPosition(ca.AxisX.Maximum),
        ca.AxisY.ValueToPixelPosition(ca.AxisY.Maximum)
    )
    If _verticalLine Then
        '水平ラインはOn/Offされるので、表示モードのときのみ描画する
        g.DrawLine(Pens.Red, _vp.X, area.Top, _vp.X, area.Bottom)
    End If
    '_hp.Y が固定されていようと変動しようと、垂直ラインは常に描画する
    g.DrawLine(Pens.ForestGreen, area.Left, _hp.Y, area.Right, _hp.Y)
End Sub

引用返信 編集キー/
■83732 / inTopicNo.4)  Re[2]: Chart上の罫線描画の操作について
□投稿者/ KY (17回)-(2017/04/04(Tue) 20:53:48)
No83714 (魔界の仮面弁士 さん) に返信

ありがとうございます。

既存のプログラムに組むと思わぬ動作にはなってしまいますが、その起因は既存のほうにあるようですで、これで解決とさせていただきます。

ありがとうございました。
またの質問の節にはよろしくお願いします。



解決済み
引用返信 編集キー/
■83733 / inTopicNo.5)  Re[2]: Chart上の罫線描画の操作について
□投稿者/ KY (18回)-(2017/04/04(Tue) 20:57:04)
No83713 (shu さん) に返信

下にも書きましたが一応これで解決とさせていただきます。

ありがとうございました。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ