tagCANDY CGI VBレスキュー(花ちゃん) - VBレスキュー(花ちゃん)の投稿サンプル用掲示板 - Visual Basic 6.0 VB2005 VB2010
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ
VBレスキュー(花ちゃん)の投稿サンプル用掲示板
     サンプル投稿用掲示板  VB2005 〜 用トップページ  VB6.0 用 トップページ
MSChartコントロールの色々なグラフの表示座標を取得する(VB6.0) ( No.33 )  [親スレッドへ]
日時: 2007/08/24 11:43
名前: 花ちゃん

***********************************************************************************
* カテゴリー:[チャート][][]                                                      *
* キーワード:ピクチャーボックス,項目の位置,位置,座標,描画,塗る,こんな事も出来ます*
***********************************************************************************
>>27 MSChartコントロールで作成したグラフをPictureBoxに転送表示する の応用例で今まで
色々掲示板で質問があったのですが、MSChartコントロール 上では出来なくてもPictureBox上
に転送する事により出来るのでここに紹介して置きます。
色々なケースに合せて作成するのは大変なので、今回は、一部決め打ちを行っておりますので
ご使用状況に合せて変更願います。

下記のような場合は、これで解決できるかと思います。

MSChartで補完してプロットする.. - ラトリア 2007/05/23-14:58 No.9211
MSChartの座標値を求めるには - わかば 2007/07/08/21-20:17 No.9938

-----------------------------------------------------------------------------------
投稿者:花ちゃん MSChartコントロールの色々なグラフの表示位置を取得する 2007/08/24
-----------------------------------------------------------------------------------
1.数値軸及び第二数値軸のX座標位置の取得
  これにより各ラベルの間隔・位置等も取得できます。
2.数値軸の目盛りの基点(0 点)の横線のY座標を取得
3.数値軸の目盛りの終点(100 点)の横線のY座標を取得
    (これにより座標位置でのデータの値が取得できグラフの表示位置が求められる)
4.マウス位置の色を取得する事により上記と組み合わせれば、マウス位置のデータの値が
  取得できる


Option Explicit

Private Enum DVASPECT
   DVASPECT_CONTENT = 1
   DVASPECT_THUMBNAIL = 2
   DVASPECT_ICON = 4
   DVASPECT_DOCPRINT = 8
End Enum
Private Type RECT
   Left   As Long
   Top    As Long
   Right  As Long
   Bottom As Long
End Type
Private Declare Function OleDraw Lib "ole32.dll" _
   (ByVal pUnk As Object, ByVal dwAspect As DVASPECT, _
    ByVal hDCDraw As Long, lprcBounds As RECT) As Long

'-----------------------------------------------------------------------------
'ピクセルカラー値を取得する(P489)
Private Declare Function GetPixel Lib "gdi32" _
   (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Private LPos()   As Single    'ラベルの表示座標

Private Sub Form_Resize()
   'フォームのサイズ変更に合わせて MSChart コントロールの表示サイズも変更する
   If Me.Visible = False Then Exit Sub
   MSChart1.Move 0, 0, Me.ScaleWidth, Me.ScaleHeight
   Picture1.Move 0, 0, Me.ScaleWidth, Me.ScaleHeight
   'フォームのサイズが変更されたら転送しなおす。
   Call SetPicture(MSChart1, Picture1)

   Dim i As Long
   Dim X1 As Single
   Dim X2 As Single
   'X軸の始点のX座標を求める(一番左側の目盛りの縦線)
   For i = 20 To 100
      If GetPixel(Picture1.hdc, i, 50) = 0 Then
         X1 = i
         Exit For
      End If
   Next i
   'X軸の終点のX座標を求める(一番右側の目盛りの縦線)
   For i = Picture1.ScaleWidth - 40 To Picture1.ScaleWidth - 150 Step -1
      If GetPixel(Picture1.hdc, i, 50) = 0 Then
         X2 = i
         Exit For
      End If
   Next i
   '生徒名1人当たりの幅を取得
   Picture1.DrawStyle = 6
   Dim XPos As Single
   XPos = (X2 - X1) / MSChart1.RowCount
   ReDim LPos(MSChart1.RowCount) As Single
   For i = 0 To MSChart1.RowCount
      LPos(i) = X1 + (i * XPos)  '各ラベルの左側の座標位置を取得
   Next i
  
   '目盛りの始点のY座標を求める(グラフの 0点の横ラインの位置)
   Dim MinPos As Long
   For i = Picture1.ScaleHeight - 30 To Picture1.ScaleHeight - 80 Step -1
      If GetPixel(Picture1.hdc, 60, i) = 0 Then
         MinPos = i     '目盛り 0 の位置のY座標
         Exit For
      End If
   Next i
   '目盛りの最大点のY座標を求める(グラフの 100点の横ラインの位置)
   Dim MaxPos As Long
   For i = Picture1.ScaleTop + 10 To Picture1.ScaleTop + 80
      If GetPixel(Picture1.hdc, 60, i) = 0 Then
         MaxPos = i     '目盛り 100 の位置のY座標
         Exit For
      End If
   Next i
  
   'これで縦棒の位置と間隔が求められます。
   Dim co As Long
   Dim b(10) As Long
   Dim n As Long
  
   For i = LPos(0) To LPos(1)
      If co <> GetPixel(Picture1.hdc, i, 370) Then
         b(n) = i - LPos(0) - 1
       '  Debug.Print b(n)
         n = n + 1
      End If
      co = Picture1.Point(i, 370)
   Next i

' 以上の事が解れば個々のグラフの表示位置が計算すれば求められます。
End Sub

Private Sub Picture1_MouseMove(Button As Integer, _
                                Shift As Integer, x As Single, y As Single)
'マウス位置のデータをToolTipTextで表示
   Picture1.ToolTipText = ""
   With MSChart1
      Select Case x
         Case LPos(0) To LPos(1)
            If Picture1.Point(x, y) = RGB(255, 0, 0) Then
               Picture1.ToolTipText = .ChartData(1, 0) & "さんの" & _
                  .ChartData(0, 1) & "の点数は" & _
                  .ChartData(1, 1) & "点です。"
            End If
            If Picture1.Point(x, y) = RGB(0, 255, 0) Then
               Picture1.ToolTipText = .ChartData(1, 0) & "さんの" & _
                  .ChartData(0, 2) & "の点数は" & _
                  .ChartData(1, 2) & "点です。"
            End If
            If Picture1.Point(x, y) = RGB(0, 0, 255) Then
               Picture1.ToolTipText = .ChartData(1, 0) & "さんの" & _
                  .ChartData(0, 3) & "の点数は" & _
                  .ChartData(1, 3) & "点です。"
            End If
         Case LPos(1) To LPos(2)
            If Picture1.Point(x, y) = RGB(255, 0, 0) Then
               Picture1.ToolTipText = .ChartData(2, 0) & "さんの" & _
                  .ChartData(0, 1) & "の点数は" & _
                  .ChartData(2, 1) & "点です。"
            End If
            If Picture1.Point(x, y) = RGB(0, 255, 0) Then
               Picture1.ToolTipText = .ChartData(2, 0) & "さんの" & _
                  .ChartData(0, 2) & "の点数は" & _
                  .ChartData(2, 2) & "点です。"
            End If
            If Picture1.Point(x, y) = RGB(0, 0, 255) Then
               Picture1.ToolTipText = .ChartData(2, 0) & "さんの" & _
                  .ChartData(0, 3) & "の点数は" & _
                  .ChartData(2, 3) & "点です。"
            End If
         Case LPos(2) To LPos(3)
            If Picture1.Point(x, y) = RGB(255, 0, 0) Then
               Picture1.ToolTipText = .ChartData(3, 0) & "さんの" & _
                  .ChartData(0, 1) & "の点数は" & _
                  .ChartData(3, 1) & "点です。"
            End If
            If Picture1.Point(x, y) = RGB(0, 255, 0) Then
               Picture1.ToolTipText = .ChartData(3, 0) & "さんの" & _
                  .ChartData(0, 2) & "の点数は" & _
                  .ChartData(3, 2) & "点です。"
            End If
            If Picture1.Point(x, y) = RGB(0, 0, 255) Then
               Picture1.ToolTipText = .ChartData(3, 0) & "さんの" & _
                  .ChartData(0, 3) & "の点数は" & _
                  .ChartData(3, 3) & "点です。"
            End If
        
         Case LPos(3) To LPos(4)
            If Picture1.Point(x, y) = RGB(255, 0, 0) Then
               Picture1.ToolTipText = .ChartData(4, 0) & "さんの" & _
                  .ChartData(0, 1) & "の点数は" & _
                  .ChartData(4, 1) & "点です。"
            End If
            If Picture1.Point(x, y) = RGB(0, 255, 0) Then
               Picture1.ToolTipText = .ChartData(4, 0) & "さんの" & _
                  .ChartData(0, 2) & "の点数は" & _
                  .ChartData(4, 2) & "点です。"
            End If
            If Picture1.Point(x, y) = RGB(0, 0, 255) Then
               Picture1.ToolTipText = .ChartData(4, 0) & "さんの" & _
                  .ChartData(0, 3) & "の点数は" & _
                  .ChartData(4, 3) & "点です。"
            End If
         Case LPos(4) To LPos(5)
            If Picture1.Point(x, y) = RGB(255, 0, 0) Then
               Picture1.ToolTipText = .ChartData(5, 0) & "さんの" & _
                  .ChartData(0, 1) & "の点数は" & _
                  .ChartData(5, 1) & "点です。"
            End If
            If Picture1.Point(x, y) = RGB(0, 255, 0) Then
               Picture1.ToolTipText = .ChartData(5, 0) & "さんの" & _
                  .ChartData(0, 2) & "の点数は" & _
                  .ChartData(5, 2) & "点です。"
            End If
            If Picture1.Point(x, y) = RGB(0, 0, 255) Then
               Picture1.ToolTipText = .ChartData(5, 0) & "さんの" & _
                  .ChartData(0, 3) & "の点数は" & _
                  .ChartData(5, 3) & "点です。"
            End If
         Case Else
            Picture1.ToolTipText = ""
      End Select
   End With

'---------------------------------------------------------------------
' 折れ線グラフのような場合は下記でもいいかな。
'   With MSChart1
'      Select Case X
'         Case LPos(0) To LPos(1)
'            Picture1.ToolTipText = .ChartData(1, 0) & "さんの" & _
'               .ChartData(0, 1) & "の点数は" & _
'               .ChartData(1, 1) & "点で" & vbCrLf & _
'               .ChartData(0, 2) & "の点数は" & _
'               .ChartData(1, 2) & "点で" & vbCrLf & _
'               .ChartData(0, 3) & "の点数は" & _
'               .ChartData(1, 3) & "点です。"
'--------------------- 以下 省略 --------------------------
End Sub

'----------------- 以下のコードは No.27 のサンプルと同様です -----------------------

Private Sub Form_Load()
   'フォームのサイズを設定(好みで変更してください)
   Me.Visible = False
   Form1.Move 0, 0, 10400, 7000
   'MSChart コントロールの表示サイズを設定
   MSChart1.Move 0, 0, Me.ScaleWidth, Me.ScaleHeight
   Picture1.Move 0, 0, Me.ScaleWidth, Me.ScaleHeight
   Call sDataOpen       'データの読み込み
   Call sChartViewSet   'グラフの表示設定
  
   Form1.ScaleMode = vbPixels    'スケールモードをピクセル単位に設定
   'ピクチャーボックスのプロパティの初期設定
   With Picture1
      .ScaleMode = vbPixels      'スケールモードをピクセル単位に設定
      .BorderStyle = 0
      .AutoRedraw = True
      .Visible = True
      .Move 0, 0, Me.ScaleWidth, Me.ScaleHeight
   End With
   Me.Visible = True
End Sub
Private Sub sChartViewSet()
   With MSChart1
      .chartType = VtChChartType2dBar     'デフォルトのグラフタイプ(2D棒)
      .ShowLegend = True                  '凡例を表示する
      '背景を塗っておく(この色の部分はクリックしても塗りつぶさない)
      .Backdrop.Fill.Brush.Style = VtBrushStyleSolid
      .Backdrop.Fill.Brush.FillColor.Set 255, 255, 255
   End With
End Sub
Private Sub SetPicture(ctl As Object, myPic As PictureBox)
'OleDraw API を使ってグラフを転送
   Dim udtRect As RECT
   With udtRect
      .Left = 0
      .Top = 0
      .Right = ctl.Width - 1
      .Bottom = ctl.Height - 1
   End With
   With myPic
      .Cls
      .Move 0, 0, ctl.Width, ctl.Height
      Call OleDraw(ctl.Object, DVASPECT_CONTENT, .hdc, udtRect)
   End With
End Sub
Private Sub sDataOpen()
'グラフ用のデータを作成及び読み込み
   Dim Dat(0 To 5, 0 To 3) As Variant
   Dat(0, 1) = "国語"
   Dat(0, 2) = "数学"
   Dat(0, 3) = "英語"
  
   Dat(1, 0) = "浅野"
   Dat(1, 1) = 69       '国語の点数
   Dat(1, 2) = 81       '数学の点数
   Dat(1, 3) = 73       '英語の点数
  
   Dat(2, 0) = "安室"
   Dat(2, 1) = 87
   Dat(2, 2) = 80
   Dat(2, 3) = 72
  
   Dat(3, 0) = "加藤"
   Dat(3, 1) = 74
   Dat(3, 2) = 82
   Dat(3, 3) = 96
  
   Dat(4, 0) = "斉藤"
   Dat(4, 1) = 71
   Dat(4, 2) = 69
   Dat(4, 3) = 81
  
   Dat(5, 0) = "鈴木"
   Dat(5, 1) = 84
   Dat(5, 2) = 86
   Dat(5, 3) = 75
  
   'グラフに表示する配列データを設定する
   MSChart1.ChartData = Dat()
End Sub

----------------------------------------------------------------------------------
上記の実行図です。
 http://hanatyan.sakura.ne.jp/samplepic/chartno33-1.gif
 



 [スレッド一覧へ] [親スレッドへ]