tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^2: (△解決)Chartオブジェクトで任意の場所にラベルオブジェクトを移動
投稿日: 2016/04/28(Thu) 15:06
投稿者食う寝る走る
shu さま
レスありがとうございます。

> Labelの役割が何なのかにもよりますが。
複数のライン、カーブ(要素)を引くので、コメント(名前、X値、Y値、備考)を付けたいのが理由です。色分けして、Chartの外にラベル書きしていましたが、プロットした要素の近くにコメントをもっていきたいのが理由ですね。ToolTipはマウスが当たっている時しかでないし・・・。

> ChartのPaintイベントかPostPaintイベント辺りで描画するのはどうでしょう?
これは、Chart座標内のプロット座標をスクリーン座標かフォームのクライアント座標変換が必要ですよね?
先ほどまで、
プロットしたseries2.Points.AddXY(8, 1)をChartのクライアント座標へ変換を試みていましたが断念。
チャート内の(8,1)を変換するとChartオブジェクトの左上の空白部分を指します。
なんとかChartエリア内を取得してもChartスケールはその都度変わるので・・・難と判断。

Chartオブジェクトで完結できるそのような機能が無いか調べておりました。
下記に近そうなものを見つけました。

チャートの注釈(CalloutAnnotation)
http://hanatyan.sakura.ne.jp/patio/read.cgi?mode=view2&f=262&no=14


修正したコードを載せておきます。
注釈(CalloutAnnotation)のプロパティを見ると任意のChart座標指定で配置することは出来そうです。
ただし、引き出し線だらけになるので線を無くしたいところですが・・・。
もう少し、CalloutAnnotationを設定してみて、妥協するかもしれません。
現在「△解決」としておきます。
妥協するか、引き出し線が消すことが出来れば、「解決」としたいと思います。



'--------------------------------------------------------------------------------------
Imports System.Windows.Forms.DataVisualization.Charting

Public Class Form1

    Dim series1 As New Series() 'SIN
    Dim series2 As New Series() '任意
    Dim xval() As Double 'X軸格納
    Dim yval() As Double 'Y1軸格納

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Label1.BackColor = Color.Red
        Label2.BackColor = Color.Red

        'チャートコントロールオブジェクト
        Chart1.Series.Clear()

        '~データのシリーズ追記
        Chart1.Series.Add(series1) 'SIN
        Chart1.Series.Add(series2)


        '内部データの初期化
        series1.Points.Clear()
        series2.Points.Clear()


        With Chart1.ChartAreas(0).AxisX
            '10点毎に補助線を表示
            .MinorGrid.Enabled = True  'True に設定しないと表示しない
            .Title = "X"
            .MinorGrid.Interval = 100
            .MinorGrid.LineDashStyle = DataVisualization.Charting.ChartDashStyle.Dash
            .LabelStyle.Format = "0.0"
        End With


        With Chart1.ChartAreas(0).AxisY 'Y軸の設定
            .TitleForeColor = Color.Red
            .Title = "sin(X)"  'タイトルのテキストを設定
            .LineColor = Color.Red
            .MajorGrid.LineColor = Color.Red
            .LabelStyle.ForeColor = Color.Red
            .MajorGrid.LineDashStyle = DataVisualization.Charting.ChartDashStyle.Solid
            .LabelStyle.Format = "0.0"
            .Enabled = AxisEnabled.True '第1軸を有効化
        End With


        '凡例
        Chart1.Series(0).LegendText = "sin(X)"



        ' グラフの種類は散布図(sin Chart)
        With series1
            .ChartType = SeriesChartType.Point
            .MarkerSize = 5
            .MarkerStyle = MarkerStyle.Circle
            .MarkerBorderColor = Color.Black
            .MarkerBorderWidth = 0.1
            .MarkerColor = Color.Blue
            .XAxisType = AxisType.Primary
            .YAxisType = AxisType.Primary

            .Enabled = True
        End With


        ' グラフの種類は散布図(任意Point Chart)
        With series2
            .ChartType = SeriesChartType.Point
            .MarkerSize = 20
            .MarkerStyle = MarkerStyle.Circle
            .MarkerBorderColor = Color.Black
            .MarkerBorderWidth = 0.1
            .MarkerColor = Color.Green
            .XAxisType = AxisType.Primary
            .YAxisType = AxisType.Primary
            .Enabled = True
        End With

        Dim k As Integer = 0 '格納配列のアドレス用カウンター
        For i = 0 To 10 Step 0.01
            ReDim Preserve xval(k) '配列の要素数の変更
            xval(k) = i 'X軸値格納
            ReDim Preserve yval(k) '配列の要素数の変更
            yval(k) = Math.Sin(xval(k)) 'Y軸値格納

            series1.Points.AddXY(CDbl(xval(k)), yval(k)) 'SIN波プロット

            k = k + 1
        Next

    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'Labelコントロールの親コントロールをチャートコントロールとする
        Label1.Parent = Chart1
        'Labelコントロールの親コントロールをピクチャーコントロールとする
        Label2.Parent = PictureBox1

        series2.Points.Clear()  '内部データの初期化
        series2.Points.AddXY(8, 1) '打点

        Me.Label1.Location = New Point(8, 1)

        Dim objBrush = New SolidBrush(System.Drawing.Color.Blue)
        Dim objGrp As Graphics = PictureBox1.CreateGraphics

        ' 楕円を描く
        objGrp.FillEllipse(objBrush, 500, 50, 20, 20)

        Label2.Location = New Point(500, 50)

        ' リソースを解放する
        objBrush.Dispose()
        objGrp.Dispose()


        '■------------------- 注釈を設定 ----------------Start--■
        Dim ca As New CalloutAnnotation()
        ca.Name = "CA1"
        ca.CalloutStyle = CalloutStyle.Borderline '他7種類の形があります
        ca.Text = "Label"             '注釈の文字
        ca.ForeColor = Color.Black
        ca.Font = New Font("MS P明朝", 8, FontStyle.Bold)
        ca.BackColor = Color.Red
        ca.ShadowColor = Color.Blue
        ca.ShadowOffset = 3
        ca.AllowAnchorMoving = True
        ca.AllowMoving = True
        ca.AllowPathEditing = True

        '表示位置の設定
        ca.AnchorDataPoint = Chart1.Series(1).Points(0)
        Chart1.Annotations.Add(ca)
        '■-----------------------------------------------End----■

    End Sub
End Class

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。