- 日時: 2007/08/05 18:08
- 名前: 花ちゃん
- ***********************************************************************************
* カテゴリー:[チャート][][] * * キーワード:ピクチャーボックス,コピー,ペースト,横置き,こんな事も出来ます * ***********************************************************************************
>>27 MSChartコントロールで作成したグラフをPictureBoxに転送 の応用編です。 横置き用に文字列等を設定した棒グラフを、PictureBox に転送して、右回りに90度回転させ たものです。画像の回転は、この掲示板で紹介している、画像を高速に90度毎に回転表示 する方法 を使っておりますので、コードはそちらをご覧下さい。 http://hanatyan.sakura.ne.jp/patio/read.cgi?mode=view2&f=2&no=0
MSChartコントロールの仕様等の制限で、上手く表示設定できない部分もあります。 凡例は、左上に別途、後で、PictureBox に書いて見ました。
又、同じく180度回転させた吊下げ棒グラフも描いてみました。こんな事もできるという事で。
----------------------------------------------------------------------------------- 投稿者:花ちゃん MSChartコントロールで横棒グラフ・吊下げ棒グラフを作成 2007/08/05 -----------------------------------------------------------------------------------
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
Private Sub Form_Load() 'フォームのサイズを設定(好みで変更してください) 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 'データの読み込み Me.Visible = False Form1.ScaleMode = vbPixels 'スケールモードをピクセル単位に設定 'ピクチャーボックスのプロパティの初期設定 With Picture1 .ScaleMode = vbPixels 'スケールモードをピクセル単位に設定 .BorderStyle = 0 .AutoRedraw = True .Visible = True .Move 0, 0, Me.ScaleWidth, Me.ScaleHeight End With Call sChartViewSet 'グラフの表示設定 Me.Visible = True Me.Show End Sub
Private Sub sChartViewSet() With MSChart1 .chartType = VtChChartType2dBar 'デフォルトのグラフタイプ(2D棒) '凡例の表示位置を設定(下記以外に上手く表示できない) .Legend.Location.LocationType = VtChLocationTypeTop .Legend.TextLayout.Orientation = VtOrientationUp .Legend.VtFont.Name = "@MS P明朝" .ShowLegend = True '凡例を表示する End With 'X軸のラベルの設定 With MSChart1.Plot.Axis(VtChAxisIdX).Labels(1) .Auto = False .TextLayout.Orientation = VtOrientationUp .VtFont.Size = 14 .VtFont.VtColor.Set 255, 0, 0 End With 'Y軸のラベルフォントの設定 With MSChart1.Plot.Axis(VtChAxisIdY2).Labels(1) '左側の 点数の目盛 .Auto = False '下から上へ読めるように回転(文字が綺麗に表示されない) .TextLayout.Orientation = VtOrientationUp .VtFont.Size = 12 End With '上側の目盛りは非表示に設定 MSChart1.Plot.Axis(VtChAxisIdY).AxisScale.Hide = True
'タイトルの設定 With MSChart1.Title 'タイトル文字の設定 .Text = "期末テスト結果" '表示位置 .Location.LocationType = VtChLocationTypeLeft .TextLayout.Orientation = VtOrientationUp 'フォントサイズ .VtFont.Size = 16 'フォントスタイル .VtFont.Style = VtFontStyleBold 'タイトルの文字の表示色 .VtFont.VtColor.Set 255, 0, 255 End With 'データポイントラベルの設定 Dim s As Series For Each s In MSChart1.Plot.SeriesCollection With s.DataPoints.Item(-1).DataPointLabel '表示位置(ラベルはデータ ポイントの上に表示) .LocationType = VtChLabelLocationTypeAbovePoint 'データ ポイントの値がラベルに表示 .Component = VtChLabelComponentValue 'フォントサイズとスタイルを設定 .VtFont.Size = 11 '下から上へ読めるように回転(文字が綺麗に表示されない) .TextLayout.Orientation = VtOrientationUp ' .VtFont.Style = VtFontStyleBold '表示色棒の色と同じ色で .VtFont.VtColor.Set _ s.DataPoints(-1).Brush.FillColor.Red, _ s.DataPoints(-1).Brush.FillColor.Green, _ s.DataPoints(-1).Brush.FillColor.Blue End With Next 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 '画像を高速に90度毎に回転表示する方法 'http://hanatyan.sakura.ne.jp/patio/read.cgi?mode=view2&f=2&no=0 '上記サンプルを使って右回りに90度回転 PicRot90 Picture1 End Sub
Private Sub Form_Resize() 'フォームのサイズ変更に合わせて MSChart コントロールの表示サイズも変更する MSChart1.Move 0, 0, Me.ScaleHeight, Me.ScaleWidth Picture1.Move 0, 0, MSChart1.Width, MSChart1.Height
'フォームのサイズが変更されたら転送しなおす。 Call SetPicture(MSChart1, Picture1) Me.Caption = "MSChartコントロールで横棒グラフを作成する(473)" '自前の凡例の表示設定 Dim r As Long, g As Long, b As Long, i As Long Shape1.Move 10, 10, 50, 50 For i = 1 To MSChart1.Plot.SeriesCollection.Count r = MSChart1.Plot.SeriesCollection(i).Pen.VtColor.Red g = MSChart1.Plot.SeriesCollection(i).Pen.VtColor.Green b = MSChart1.Plot.SeriesCollection(i).Pen.VtColor.Blue Picture1.Line (15, 15 * i)-(25, 10 + (15 * i)), RGB(r, g, b), BF Picture1.CurrentX = 30 Picture1.CurrentY = 15 * i Picture1.Print MSChart1.ChartData(0, i) Next i 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/chartno32-1.gif
上記コードの実行図(吊下げ棒グラフ) http://hanatyan.sakura.ne.jp/samplepic/chartno32-2.gif
|