LoginSignup
2
2

More than 5 years have passed since last update.

MFCでグラフ作成 ChartCtrlLibKit

Last updated at Posted at 2018-02-08

MFCでグラフ作成 ChartCtrlLibKit

書き漏らし、勘違い等があれば随時書き込み。

GDI+を利用してグラフを作成するクラスのようです。

codeprojectに本体があります。
https://www.codeproject.com/Articles/317712/An-MFC-Chart-Control-with-Enhanced-User-Interface

環境

  • Windows 10 Pro
  • Visual Stuido 2012 Professional

テストプロジェクトの作成

名前:TestApp

  • シングルドキュメント
  • 基本クラス->CFormView

あとは適当

0.2588nz9kuvh.png

0.lwnqefne0hl.png

Download

CodeProjectに登録して、
Download ChartCtrlLibKitVS2012 (port to VS2012) - 3.2 MBをダウンロードします。

https://www.codeproject.com/Articles/317712/An-MFC-Chart-Control-with-Enhanced-User-Interface

0.c6v01e6wdu.png

ダウンロードしたものをプロジェクトに移動

コードファイルと同じところに入れておきます。

0.gwggy894mzv.png

プロジェクトにファイルを登録

ソリューションエクスプローラーにドラッグアンドドロップでファイルを登録。

スクリーンショット 2018-02-08 13.29.04.png

プロジェクトの設定

MFC

Debugは共有、Releaseはスタティック

Debug用

構成プロパティ->全般->MFCの使用->共有DLLでMFCを使う

ランタイムライブラリ

構成プロパティ->コード生成->ランタイムライブラリ
マルチスレッド デバッグDLL

Release用

構成プロパティ->全般->MFCの使用->スタティックライブラリでMFCを使用する

ランタイムライブラリ

構成プロパティ->コード生成->ランタイムライブラリ
マルチスレッド

リンカー

構成プロパティ->リンカー->入力->追加の依存ファイルに以下を追加

# Debug用
$(ProjectDir)ChartCtrlLibD2012.lib
# Release用
$(ProjectDir)ChartCtrlLib2012.lib

VC2012用

プロジェクトのプロパティを開いて、
構成プロパティ->C/C++->プリプロセッサ->プリプロセッサの定義に_VARIADIC_MAX=10を追記。

コードを入力

オフィシャルのHow to use itをベースにコードを記述していきます。

stdafx.hに追記

stdafx.h
...
#include <stdlib.h>
#include <tchar.h>
#include <cmath>
#include <vector>
#include <deque>
#include <map>
#include <string>
#include <sstream>
#include <iomanip>
#include <algorithm>
#include <tuple>
#include <random>
#include "gdiplus.h"
...

GDI+を使えるようにする。

TestApp.hのCTestAppAppにメンバーを追加。

TestApp.h
class CTestAppApp : public CWinAppEx
{
private:
    ULONG_PTR m_nGdiplusToken;
...

TestApp.cppのBOOL CTestAppApp::InitInstance()に追記

TestApp.cpp
BOOL CTestAppApp::InitInstance()
{
    Gdiplus::GdiplusStartupInput gdiplusStartupInput;
    Gdiplus::GdiplusStartup(&m_nGdiplusToken,
                         &gdiplusStartupInput, NULL);
...

TestApp.cppのint CTestAppApp::ExitInstance()に追記

TestApp.cpp
int CTestAppApp::ExitInstance()
{
    Gdiplus::GdiplusShutdown(m_nGdiplusToken);

リソースビューでPictureControlを配置

プロジェクト作成時の状態によって変わりますが、今回は以下の操作。

リソースビュー->TestApp->TestApp.rc->Dialog->IDD_TESTAPP_FORM

デフォルトで配置されているラベルを削除して、ButtonとPicture Controlを配置します。

Picture COntrolのIDをIDC_STCHARTCONTAINERに変更して、NotifyをTrueにしておきます。

0.g4mypkq6agl.png

メンバの設定

ソリューションエクスプローラーで、TestAppView.hに、include追記

TestAppView.h
#include "ChartContainer.h"

リソースビューで配置したPicutureControlを右クリック->変数を追加(B)...で変数を登録。

  • 変数の種類::CChartContainer
  • 変数名::m_chartContainer
  • コントロールID::IDC_STCHARTCONTAINER

テストデータ

配置しておいたボタンのスクリプトに以下のように記述してみます。

TestAppView.cpp

    void CTestAppView::OnBnClickedButton1()
    {
        // TODO: ここにコントロール通知ハンドラー コードを追加します。
        // テスト用データ
        V_CHARTDATAD vData;
        vData.resize(4,PointD(0.0, 0.0));
        vData[0]=    PointD(0,2);
        vData[1]=    PointD(1,0);
        vData[2]=    PointD(2,2);
        vData[3]=    PointD(3,0);

        V_CHARTDATAD vData2;
        vData2.resize(4,PointD(0.0, 0.0));
        vData2[0]=   PointD(0,0);
        vData2[1]=   PointD(1,2);
        vData2[2]=   PointD(2,0);
        vData2[3]=   PointD(3,2);

        // ラベル
        string_t label(L"test");
        string_t ylabel(L"y_label");

        // グラフ作成

        int chartIdx = m_chartContainer.AddChart(
            true,           // 表示非表示
            false,          // データのポイントに丸を描くか
            label,          // ラベル
            ylabel, 
            1,              // Y軸の精度
            DashStyle(0),   // 線のスタイル(破線とか)
            5,              // 線幅
            float(1.0),     // カーブの強度
            Color(255, 255, 59, 45),  // 色
            vData,          // データ
            true);          // bRedraw は、グラフコンテナとその子(データラベルとチャート名の凡例)​​の再描画を要求するフラグ

        // 別のグラフを重ねる
        int chartIdx2 = m_chartContainer.AddChart(true,false,label, ylabel, 1, DashStyle(0),    5, float(0.1), Color(255, 15, 20, 255), vData2, true); 

        string_t path(L"save.jpeg");
        // 画像保存
    m_chartContainer.SaveContainerImage(path);
    }

これで完成。
ボタンを押すと、ウィンドウ内に表示されるのと、ファイルが保存されます。

save.jpeg

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2