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

またまた、VCの仕事。ちょっと疲れましたよ。今度はデータを画面上でグラフ表示したいという案件。それこそ、エクセルでやればイイじゃんって思うのですが、その場でお客さんにみせたいとのこと....毎度毎度。そこで今度はVisualBasic付属のMSCHRT20.OCXを利用してFormViewにグラフを表示してみました。今回も情報が少なく手探りのコーディングで苦労しました。忘れないうちにメモを残します。

おおまかな手順はこんなカンジ。

  1. FormView上に[ActiveXコントロールの挿入]でMicrosoft Chart Control6.0(SP4)を貼り付け
  2. 貼り付けたコントロールを右クリックして[変数の追加]。コントロール変数としてここではm_chartを宣言
  3. [追加]-[クラスの追加]-[TypeLibからのMFCクラス]でMicrosoft Chart Control6.0(SP4)のタイプライブラリIVCxxxからクラスを作成(以下、サンプルソースでVCxxxクラスが出てきた場合ここで作成したクラス)します。

まず、Y軸の見出しから。Y軸見出しは左右それぞれ設定できます。ここではFontサイズと見出しの縦横の指定をしています。OnInitialUpdate()あたりで。

VARIANT	var;
var.vt = VT_NULL;
CVcPlot	plot(m_chart.get_Plot());
CVcAxis	axis(plot.get_Axis(m_chart.VtChAxisIdY,var));
CVcAxisTitle	axis_title(axis.get_AxisTitle());
CVcFont	font(axis_title.get_VtFont());
CVcTextLayout	text_layout(axis_title.get_TextLayout());

//Y軸(左)
axis_title.put_Text("数量 単位:個");
font.put_Size(10);
text_layout.put_Orientation(m_chart.VtOrientationVertical);

//Y軸(右)
axis.ReleaseDispatch();
axis_title.ReleaseDispatch();
font.ReleaseDispatch();
text_layout.ReleaseDispatch();

axis.AttachDispatch(plot.get_Axis(m_chart.VtChAxisIdY2,var));
axis_title.AttachDispatch(axis.get_AxisTitle());
font.AttachDispatch(axis_title.get_VtFont());
text_layout.AttachDispatch(axis_title.get_TextLayout());

axis_title.put_Text("金額・差益 単位:千円");
font.put_Size(10);
text_layout.put_Orientation(m_chart.VtOrientationVertical);

font.ReleaseDispatch();
text_layout.ReleaseDispatch();
axis_title.ReleaseDispatch();
axis.ReleaseDispatch();
plot.ReleaseDispatch();

次にX軸に関する見出しの設定とデータの初期化をおこないます。例では、X軸の1項目に3つのデータを含ませています。ちょっとわかりにくいのですがX軸1項目の配列(0-3)のうち[0]は見出し項目、[1]-[3]はそれぞれデータ項目を設定します。そしてこの例ではX軸の項目を6個使用しています。したがって、X軸項目[6]データ[4]の多次元配列を作成しそれをデータとしてセットします。

// ------------
// x軸の設定
// ------------
SAFEARRAYBOUND sab[2];
COleSafeArray  sa;
BSTR bstr;
long index[2] = { 0,0 };
const CString x_label[6]={ "1月","2月","3月","4月","5月","6月" };
const CString x_init_data = "0";

sab[0].cElements = 6; sab[1].cElements = 4;
sab[0].lLbound = sab[1].lLbound = 1;
sa.Create(VT_BSTR, 2, sab);

for(int i=0;i<6;i++){
  //見出
  index[0] = i+1;
  index[1] = 1;
  bstr = x_label[i].AllocSysString();
  sa.PutElement(index,bstr);
  //内容(初期値0をセット)
  ::SysFreeString(bstr);
  bstr = x_init_data.AllocSysString();
  index[1] = 2; sa.PutElement(index,bstr);
  index[1] = 3; sa.PutElement(index,bstr);
  index[1] = 4; sa.PutElement(index,bstr);
  ::SysFreeString(bstr);
}
m_chart.put_ChartData(sa.Detach());
//凡例
m_chart.put_ShowLegend(TRUE);
const char* label[] = { "数量","金額","差益" };
m_chart.put_ColumnLabelCount(sizeof(label)/sizeof(char*));
for(int i=0;i<(sizeof(label)/sizeof(char*));i++){
  m_chart.put_Column(i+1);
  m_chart.put_ColumnLabel(label[i]);
}

ここまでで、次のような画面が表示されるハズです。残りは次回。

添付サイズ
sample1.gif25.48 KB

Comments