mfcを使ってインタラクティブ折れ線グラフを作成する
MFCでは、CDCクラスの機能を利用して動的な折れ線グラフを描画することができます。以下に簡単なサンプルコードを示します。
まず、MFCビュークラスに折れ線グラフの描画用描画関数を用意、OnDraw関数の中で描画関数をコールします。
void CMyView::DrawDynamicLineChart(CDC* pDC)
{
// 设置坐标系的原点和大小
int originX = 50;
int originY = 250;
int chartWidth = 400;
int chartHeight = 200;
// 设置数据点
int dataPoints[] = {50, 100, 150, 200, 250, 200, 150, 100, 50};
// 绘制坐标轴
pDC->MoveTo(originX, originY);
pDC->LineTo(originX + chartWidth, originY);
pDC->MoveTo(originX, originY);
pDC->LineTo(originX, originY - chartHeight);
// 绘制折线
int numDataPoints = sizeof(dataPoints) / sizeof(dataPoints[0]);
int stepX = chartWidth / (numDataPoints - 1);
int prevX = originX;
int prevY = originY - dataPoints[0];
for (int i = 1; i < numDataPoints; i++) {
int x = originX + i * stepX;
int y = originY - dataPoints[i];
pDC->MoveTo(prevX, prevY);
pDC->LineTo(x, y);
prevX = x;
prevY = y;
}
}
void CMyView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDC)
return;
// 在此处添加绘制代码
DrawDynamicLineChart(pDC);
}
そして、MFCのフレームワーク型では、タイマーを使って自動的にデータの更新を行い、Invalidate関数を呼び出して再描画をさせています。
void CMainFrame::OnTimer(UINT_PTR nIDEvent)
{
CMyView* pView = (CMyView*)GetActiveView();
if (pView != nullptr) {
pView->Invalidate();
}
CFrameWnd::OnTimer(nIDEvent);
}
最後に、MFC のアプリクラスでタイマーを開始する。
BOOL CMyApp::InitInstance()
{
// ...
// 创建并启动定时器
SetTimer(1, 1000, nullptr);
// ...
}
サンプルコードでは、1秒おきに折れ線グラフのデータポイントを更新(Invalidate()で行う)しています。