VC++(MFC)でMSCHARTを操作する方法(3)

このところずっとCocoaな毎日だったのですが久しぶり、MFCネタ。以前、VC++(MFC)でMSCHARTを操作する方法といエントリを書いたのですがチャートの線色を変えるには?というコメントを頂いたのでちょっと試してみました。チャートの色を変えるというのは初めてトライするのですが、大体のやり方は他のオブジェクトと同じなのでそれほど迷いなくいけました。用は、Chartオブジェクトを起点に必要なオブジェクトをget_xxx()でたどり、該当するオブジェクトにたどり着いたらput_xxx系でプロパティをセットしてやるというのがおおまかな手順。どのオブジェクトが必要になるかさえ調べてしまえば意外と簡単です。

チャートの色を設定するオブジェクトは階層が深くて、上から順に、

  1. Plot
  2. SeriesCollection
  3. Series
  4. DataPoints
  5. DataPoint
  6. Brush
  7. 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();

MSChart sample 棒グラフ

折れ線グラフの場合、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();

MSChart sample 折れ線グラフ

折れ線チャートで数量が表示されてないのは単位が揃っていないせいですかねぇ?調べてません。:-)

(参考)http://support.microsoft.com/kb/192902/ja
(参考)http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/mschrt/html/vbobjdatapointobject.asp

添付サイズ
chart1.gif13.25 KB
chart2.gif12.51 KB

この記事のトラックバックURL:

http://hippos-lab.com/blog/trackback/175

Comments