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

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

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

Re[10]: Chart1と同じ罫線をChart2にも


(過去ログ 140 を表示中)

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

■82084 / inTopicNo.1)  Chart1と同じ罫線をChart2にも
  
□投稿者/ 佐伯 (1回)-(2016/12/08(Thu) 17:49:38)

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

VB初心者ですがお願いします。

Chart1の下に同じサイズとx軸を持つのChart2作り、
Chart1上でマウスの移動と共に引かれる罫線をChart2にも同じx軸で引きたいです。
よろしくお願いします。

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
        Chart2.DataSource = dat
        Chart2.Series.Clear()
        Dim oresen2 = Chart2.Series.Add("折れ線")
        With oresen2
            .ChartType = DataVisualization.Charting.SeriesChartType.Line
            .XValueMember = "件数"
            .YValueMembers = "数量"
            .IsVisibleInLegend = False
        End With
    End Sub

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

    Private Sub Chart1_PostPaint(ByVal sender As Object, ByVal 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)
        Dim y2 = axy.ValueToPixelPosition(axy.Minimum)
        If _mp1.Y >= y1 And _mp1.Y <= y2 Then
            g.DrawLine(Pens.Gold, _mp1.X, CInt(y1), _mp1.X, CInt(y2))
        End If
    End Sub
End Class

引用返信 編集キー/
■82100 / inTopicNo.2)  Re[1]: Chart1と同じ罫線をChart2にも
□投稿者/ shu (946回)-(2016/12/10(Sat) 12:14:34)
No82084 (佐伯 さん) に返信

>     Private Sub Chart1_PostPaint(ByVal sender As Object, ByVal 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)
>         Dim y2 = axy.ValueToPixelPosition(axy.Minimum)
>         If _mp1.Y >= y1 And _mp1.Y <= y2 Then
>             g.DrawLine(Pens.Gold, _mp1.X, CInt(y1), _mp1.X, CInt(y2))
>         End If
>     End Sub

これと同じように
Chart2のPostPaintイベントを実装するとよいかと思います。
    Private Sub Chart2_PostPaint(〜 同じ引数 〜) Handles Chart2.PostPaint

        < Char1をChart2に変更 >

    End Sub


引用返信 編集キー/
■82102 / inTopicNo.3)  Re[2]: Chart1と同じ罫線をChart2にも
□投稿者/ 佐伯 (2回)-(2016/12/11(Sun) 00:30:45)
No82100 (shu さん) に返信
ありがとうございます。

実は、既にChart2上でのマウスの移動と共に、同じChart2上に罫線を引くのに使ってしまってまして、ダブってしまい使えない状態となっています。
  
> これと同じように
> Chart2のPostPaintイベントを実装するとよいかと思います。
>     Private Sub Chart2_PostPaint(〜 同じ引数 〜) Handles Chart2.PostPaint
> 
>         < Char1をChart2に変更 >
> 
>     End Sub
> 

引用返信 編集キー/
■82109 / inTopicNo.4)  Re[3]: Chart1と同じ罫線をChart2にも
□投稿者/ shu (947回)-(2016/12/12(Mon) 11:44:22)
No82102 (佐伯 さん) に返信
> ■No82100 (shu さん) に返信
> ありがとうございます。
> 
> 実は、既にChart2上でのマウスの移動と共に、同じChart2上に罫線を引くのに使ってしまってまして、ダブってしまい使えない状態となっています。
>   

    Private Sub Chart2_PostPaint(〜 同じ引数 〜) Handles Chart2.PostPaint

        <既にある処理>        

        < Chart1_PostPaintの処理を Char1をChart2に変更 >

    End Sub

これでどうでしょうか?

引用返信 編集キー/
■82113 / inTopicNo.5)  Re[4]: Chart1と同じ罫線をChart2にも
□投稿者/ 佐伯 (3回)-(2016/12/12(Mon) 16:41:41)
No82109 (shu さん) に返信

ありがとうございます。

>     <既にある処理>        
>
>     < Chart1_PostPaintの処理を Char1をChart2に変更 >
どのような意味でしょう?
そのままChar1をChart2に変更するとエラーが出てしまいます。

ちなみに下記のようにし、Chart1上にマウスがある時にはChart1に罫線を引き、Chart2上にマウスがある時にはChart2に罫線を引いています。
今回はそれプラス・・、
Chart1上でマウスの移動と共に引かれる罫線をChart2にも同じx軸で引きたいです。
また逆に、
Chart2上でマウスの移動と共に引かれる罫線をChart1にも。 

    'Chart1上にマウスがある時の処理 
    Dim _mp1 As Point
    Private Sub Chart1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Chart1.MouseMove
        _mp1 = e.Location
        Chart1.Invalidate()
    End Sub
    Private Sub Chart1_PostPaint(ByVal sender As Object, ByVal 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)
        Dim y2 = axy.ValueToPixelPosition(axy.Minimum)
        If _mp1.Y >= y1 And _mp1.Y <= y2 Then
            g.DrawLine(Pens.Gold, _mp1.X, CInt(y1), _mp1.X, CInt(y2))
        End If
    End Sub

    'Chart2上にマウスがある時の処理 
    Dim _mp2 As Point
    Private Sub Chart2_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Chart2.MouseMove
        _mp2 = e.Location
        Chart2.Invalidate()
    End Sub
    Private Sub Chart2_PostPaint(ByVal sender As Object, ByVal e As System.Windows.Forms.DataVisualization.Charting.ChartPaintEventArgs) Handles Chart2.PostPaint
        Dim g = e.ChartGraphics.Graphics
        Dim axy = Chart2.ChartAreas(0).AxisY
        Dim y1 = axy.ValueToPixelPosition(axy.Maximum)
        Dim y2 = axy.ValueToPixelPosition(axy.Minimum)
        If _mp2.Y >= y1 And _mp2.Y <= y2 Then
            g.DrawLine(Pens.Gold, _mp2.X, CInt(y1), _mp2.X, CInt(y2))
        End If
    End Sub

引用返信 編集キー/
■82114 / inTopicNo.6)  Re[5]: Chart1と同じ罫線をChart2にも
□投稿者/ 魔界の仮面弁士 (1009回)-(2016/12/12(Mon) 16:53:38)
No82113 (佐伯 さん) に返信
> そのままChar1をChart2に変更するとエラーが出てしまいます。

イメージとしては、こんな感じ。

Private _mp1 As Point
Private Sub Charts_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Chart1.MouseMove, Chart2.MouseMove
  _mp1 = e.Location
  Chart1.Invalidate()
  Chart2.Invalidate()
End Sub

Private Sub DrawVerticalLine(g As Graphics, axy As Axis)
  Dim y1 = axy.ValueToPixelPosition(axy.Maximum)
  Dim y2 = axy.ValueToPixelPosition(axy.Minimum)
  If _mp1.Y >= y1 And _mp1.Y <= y2 Then
    g.DrawLine(Pens.Gold, _mp1.X, CInt(y1), _mp1.X, CInt(y2))
  End If
End Sub
Private Sub Chart1_PostPaint(ByVal sender As Object, ByVal e As ChartPaintEventArgs) Handles Chart1.PostPaint
  DrawVerticalLine(e.ChartGraphics.Graphics, Chart1.ChartAreas(0).AxisY)
End Sub
Private Sub Chart2_PostPaint(ByVal sender As Object, ByVal e As ChartPaintEventArgs) Handles Chart2.PostPaint
  DrawVerticalLine(e.ChartGraphics.Graphics, Chart2.ChartAreas(0).AxisY)
End Sub
引用返信 編集キー/
■82133 / inTopicNo.7)  Re[6]: Chart1と同じ罫線をChart2にも
□投稿者/ 佐伯 (4回)-(2016/12/13(Tue) 14:18:11)
No82114 (魔界の仮面弁士 さん) に返信

ありがとうございます。
実は、質問の簡素化にと思い省いていたのですがx軸の罫線のみでなく、
Chart1上にマウスがある時にはそのChart1に、またChart2上にマウスがある時にはそのChart2にのみ、x軸とy軸が交差する十字の罫線を引きたいのです。
お手数をお掛けして申し訳ありません。よろしくお願いします。

    Private _mp1 As Point
    Private Sub Charts_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Chart1.MouseMove, Chart2.MouseMove
        _mp1 = e.Location
        Chart1.Invalidate()
        Chart2.Invalidate()
    End Sub

    Private Sub DrawVerticalLine(g As Graphics, axy As DataVisualization.Charting.Axis)
        Dim x1 = axy.ValueToPixelPosition(axx.Minimum) '当然ですが「axx' は宣言されていません。アクセスできない保護レベルになっています」とのエラーメッセがでます。
        Dim x2 = axy.ValueToPixelPosition(axx.Maximum) '当然ですが「axx' は宣言されていません。アクセスできない保護レベルになっています」とのエラーメッセがでます。
        Dim y1 = axy.ValueToPixelPosition(axy.Maximum)
        Dim y2 = axy.ValueToPixelPosition(axy.Minimum)
        If _mp1.X >= x1 And _mp1.X <= x2 Then
            If _mp1.Y >= y1 And _mp1.Y <= y2 Then
                g.DrawLine(Pens.Gold, _mp1.X, CInt(y1), _mp1.X, CInt(y2))
                g.DrawLine(Pens.Gold, CInt(x1), _mp1.Y, CInt(x2), _mp1.Y)
            End If
        End If
    End Sub

    Private Sub Chart1_PostPaint(ByVal sender As Object, ByVal e As DataVisualization.Charting.ChartPaintEventArgs) Handles Chart1.PostPaint
        DrawVerticalLine(e.ChartGraphics.Graphics, Chart1.ChartAreas(0).AxisY)
    End Sub
    Private Sub Chart2_PostPaint(ByVal sender As Object, ByVal e As DataVisualization.Charting.ChartPaintEventArgs) Handles Chart2.PostPaint
        DrawVerticalLine(e.ChartGraphics.Graphics, Chart2.ChartAreas(0).AxisY)
    End Sub

引用返信 編集キー/
■82134 / inTopicNo.8)  Re[7]: Chart1と同じ罫線をChart2にも
□投稿者/ 魔界の仮面弁士 (1011回)-(2016/12/13(Tue) 14:28:44)
No82133 (佐伯 さん) に返信
> 実は、質問の簡素化にと思い省いていたのですがx軸の罫線のみでなく、
> Chart1上にマウスがある時にはそのChart1に、またChart2上にマウスがある時にはそのChart2にのみ、x軸とy軸が交差する十字の罫線を引きたいのです。

「やりたい事」は分かりましたが、「何が分からないのか」を書いて頂かないと、
質問ではなく作業依頼になってしまいますよ。(^_^;)


> Dim x1 = axy.ValueToPixelPosition(axx.Minimum) '当然ですが「axx' は宣言されていません。アクセスできない保護レベルになっています」とのエラーメッセがでます。

AxisX と AxisY の両方を受け渡すように改修すれば良いと思うのですが、そういうことではなく?
引用返信 編集キー/
■82151 / inTopicNo.9)  Re[8]: Chart1と同じ罫線をChart2にも
□投稿者/ 佐伯 (5回)-(2016/12/13(Tue) 18:56:06)
No82134 (魔界の仮面弁士 さん) に返信

ありがとうございます。& 失礼しました。

> AxisX と AxisY の両方を受け渡すように改修すれば良いと思うのですが、そういうことではなく?

また質問になってないかもしれませんが、こう言うことで良いのでしょうか?
ただこの場合ですとChart1、Chart2ともに十字線になってしまいます。
希望としては、Chart1上にマウスがあるときにはChart2の罫線はx軸(縦罫線)だけで良いのです。
また逆にChart2上にマウスがあるときにはChart1の罫線はx軸(縦罫線)だけに。

    Private _mp1 As Point
    Private Sub Charts_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Chart1.MouseMove, Chart2.MouseMove
        _mp1 = e.Location
        Chart1.Invalidate()
        Chart2.Invalidate()
    End Sub
    Private Sub DrawVerticalLine(g As Graphics, axx As DataVisualization.Charting.Axis, axy As DataVisualization.Charting.Axis)
        Dim x1 = axx.ValueToPixelPosition(axx.Minimum)
        Dim x2 = axx.ValueToPixelPosition(axx.Maximum)
        Dim y1 = axy.ValueToPixelPosition(axy.Maximum)
        Dim y2 = axy.ValueToPixelPosition(axy.Minimum)
        If _mp1.X >= x1 And _mp1.X <= x2 Then
            If _mp1.Y >= y1 And _mp1.Y <= y2 Then
                g.DrawLine(Pens.Gold, _mp1.X, CInt(y1), _mp1.X, CInt(y2))
                g.DrawLine(Pens.Blue, CInt(x1), _mp1.Y, CInt(x2), _mp1.Y)
            End If
        End If
    End Sub
    Private Sub Chart1_PostPaint(ByVal sender As Object, ByVal e As DataVisualization.Charting.ChartPaintEventArgs) Handles Chart1.PostPaint
        DrawVerticalLine(e.ChartGraphics.Graphics, Chart1.ChartAreas(0).AxisX, Chart1.ChartAreas(0).AxisY)
    End Sub
    Private Sub Chart2_PostPaint(ByVal sender As Object, ByVal e As DataVisualization.Charting.ChartPaintEventArgs) Handles Chart2.PostPaint
        DrawVerticalLine(e.ChartGraphics.Graphics, Chart2.ChartAreas(0).AxisX, Chart2.ChartAreas(0).AxisY)
    End Sub

引用返信 編集キー/
■82157 / inTopicNo.10)  Re[9]: Chart1と同じ罫線をChart2にも
□投稿者/ 魔界の仮面弁士 (1018回)-(2016/12/13(Tue) 20:35:38)
No82151 (佐伯 さん) に返信
> また質問になってないかもしれませんが、
不明点が明確になったので大丈夫です。


> こう言うことで良いのでしょうか?
DrawVerticalLine という名前のメソッドに、
垂直な(vertical)線だけでなく、
水平な(horizontal)線までも引かせるのには抵抗が…。


> 希望としては、Chart1上にマウスがあるときにはChart2の罫線はx軸(縦罫線)だけで良いのです。
> また逆にChart2上にマウスがあるときにはChart1の罫線はx軸(縦罫線)だけに。
今のコードだと、If 文の判定処理が
 「Gold と Blue の両方を描画する」
 「Gold と Blue のどちらも描画しない」
の二択になってしまっていますよね。

座標に応じて、Gold だけになるパターンも追加してあげましょう。

Private Sub Charts_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Chart1.MouseMove, Chart2.MouseMove
  Chart1.Invalidate()
  Chart2.Invalidate()
End Sub
Private Sub Charts_PostPaint(ByVal sender As Object, ByVal e As ChartPaintEventArgs) Handles Chart1.PostPaint, Chart2.PostPaint
  DrawCrossLine(e)
End Sub

Private Sub DrawCrossLine(e As ChartPaintEventArgs)
  Dim axX = e.Chart.ChartAreas(0).AxisX
  Dim axY = e.Chart.ChartAreas(0).AxisY

  Dim x1 = axx.ValueToPixelPosition(axx.Minimum)
  Dim x2 = axx.ValueToPixelPosition(axx.Maximum)
  Dim y1 = axy.ValueToPixelPosition(axy.Maximum)
  Dim y2 = axy.ValueToPixelPosition(axy.Minimum)

  Dim mp = e.Chart.PointToClient(MousePosition)

  If mp.X >= x1 AndAlso mp.X <= x2 Then
    '垂直線
    e.ChartGraphics.Graphics.DrawLine(Pens.Gold, mp.X, CInt(y1), mp.X, CInt(y2))
  End If
  If mp.Y >= y1 AndAlso mp.Y <= y2 Then
    '水平線
    e.ChartGraphics.Graphics.DrawLine(Pens.Blue, CInt(x1), mp.Y, CInt(x2), mp.Y)
  End If
End Sub
引用返信 編集キー/
■82159 / inTopicNo.11)  Re[10]: Chart1と同じ罫線をChart2にも
□投稿者/ 佐伯 (6回)-(2016/12/14(Wed) 00:49:38)
No82157 (魔界の仮面弁士 さん) に返信

大変お世話になりありがとうございました。
お陰を持ちましてChartが4枚あったのですが全てに希望通りになりました。
厚く御礼申し上げます。


解決済み
引用返信 編集キー/


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

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -