VC++(MFC)でMSCHARTを操作する方法(3)
このところずっとCocoaな毎日だったのですが久しぶり、MFCネタ。以前、VC++(MFC)でMSCHARTを操作する方法といエントリを書いたのですがチャートの線色を変えるには?というコメントを頂いたのでちょっと試してみました。チャートの色を変えるというのは初めてトライするのですが、大体のやり方は他のオブジェクトと同じなのでそれほど迷いなくいけました。用は、Chartオブジェクトを起点に必要なオブジェクトをget_xxx()でたどり、該当するオブジェクトにたどり着いたらput_xxx系でプロパティをセットしてやるというのがおおまかな手順。どのオブジェクトが必要になるかさえ調べてしまえば意外と簡単です。
チャートの色を設定するオブジェクトは階層が深くて、上から順に、
- Plot
- SeriesCollection
- Series
- DataPoints
- DataPoint
- Brush
- Color
まで必要になりますから、まずタイプライブラリから上記のクラスをプロジェクトに追加します。
プロジェクトに上記のクラスを追加したら、Colorオブジェクトまで順をおってオブジェクトをアタッチします。
CVcPlot plot(m_chart.get_Plot());
CVcSeriesCollection series_collection(plot.get_SeriesCollection());
CVcSeries series(series_collection.get_Item(1));
CVcDataPoints datapoints(series.get_DataPoints());
CVcDataPoint datapoint = datapoints.get_Item(-1);
CVcBrush brush(datapoint.get_Brush());
CVcColor fill_color(brush.get_FillColor());
それぞれのオブジェクトの意味はおおまかに、
- SeriesCollection
- データ系列オブジェクトのコレクション
- series
- データ系列。サンプルでは(数量・金額・差益)の3つのデータ系列があります。
- DataPoints
- DataPointオブジェクトのコレクション。このコレクションから、ある系列のすべてのデータポイントに対するDataPointオブジェクトを取得する場合itemメソッドに-1を指定して取得します。
- DataPoint
- ある系列のデータポイント。
- Brush
- 矩形塗りつぶし用オブジェクト。棒グラフの「棒」を塗りつぶします。
- Color
- 矩形を塗りつぶす色オブジェクト
となります。ちょっとわかりにくいのはDataPointsでうまく説明できないのは理解が浅い証拠でしょう...また、SeriesCollectionオブジェクトから個々のSeriesオブジェクトを取り出す際のインデックスは1が起点となります。
Colorオブジェクトまで取得してしまえば後は値をセットしてやるだけです。一応、自動カラーの指定をオフにしていますがどちらでも良いようです。(僕の環境では、なくてOKでした)
fill_color.put_Automatic(FALSE);
fill_color.Set(192,192,192);後はオブジェクトを解放してオシマイです。先に書いたようにサンプルの場合、データは(数量・金額・差益)と3つの系列がありますからそれぞれの系列に対して色の指定をしてみました。
CVcPlot plot(m_chart.get_Plot());
CVcSeriesCollection series_collection(
plot.get_SeriesCollection());
for(short i=1; i<series_count+1; i++)
{
CVcSeries series(series_collection.get_Item(i));
CVcDataPoints datapoints(series.get_DataPoints());
CVcDataPoint datapoint = datapoints.get_Item(-1);
CVcBrush brush(datapoint.get_Brush());
CVcColor fill_color(brush.get_FillColor());
fill_color.put_Automatic(FALSE);
switch(i) {
case 1:
fill_color.Set(192,192,192);
break;
case 2:
fill_color.Set(66,99,66);
break;
case 3:
fill_color.Set(160,82,45);
break;
}
fill_color.ReleaseDispatch();
brush.ReleaseDispatch();
datapoint.ReleaseDispatch();
datapoints.ReleaseDispatch();
series.ReleaseDispatch();
}
series_collection.ReleaseDispatch();
折れ線グラフの場合、brushではなくpenを使用します。まあ、このあたりはMFCのCBrush/CPenの感覚です。矩形と線とでは処理が違うのでこれは仕方のないことだとは思いますが、複数のチャートをサポートする場合は、ちょいと面倒.
for(short i=1; i<series_count+1; i++)
{
CVcSeries series(series_collection.get_Item(i));
CVcPen pen(series.get_Pen());
CVcColor pen_color(pen.get_VtColor());
pen_color.put_Automatic(FALSE);
switch(i) {
case 1:
pen_color.Set(192,192,192);
break;
case 2:
pen_color.Set(66,99,66);
break;
case 3:
pen_color.Set(160,82,45);
break;
}
pen_color.ReleaseDispatch();
pen.ReleaseDispatch();
series.ReleaseDispatch();
}
series_collection.ReleaseDispatch();
折れ線チャートで数量が表示されてないのは単位が揃っていないせいですかねぇ?調べてません。:-)
(参考)http://support.microsoft.com/kb/192902/ja
(参考)http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/mschrt/html/vbobjdatapointobject.asp
| 添付 | サイズ |
|---|---|
| chart1.gif | 13.25 KB |
| chart2.gif | 12.51 KB |










Comments