グラフプレビュー付きダイアログ

このセクションでは、グラフプレビュー付きカスタムダイアログの作成方法を示しています。

ダイアログリソースを準備

最初に、プレビューグラフが入れ子になった統計コントロールを含むダイアログリソースを作成します。ここでは、 OriginC\Originlab\ODlg8.dllに組み込まれたリソースである、 IDD_SAMPLE_SPLITTER_DLGを使用します。

ソースファイルを準備

コードビルダで、新規ボタンNewfile button.png をクリックして、ファイル名を入力し、上述のダイアログリソースと同じパス(OriginのインストールフォルダのOriginC\Originlab サブフォルダ)にセットします。

必要なヘッダを含める

// これらのヘッダファイルは、ダイアログとコントロールの宣言を含む
#include <..\Originlab\DialogEx.h>
#include <..\Originlab\GraphPageControl.h>

ユーザ定義プレビュークラスを作成

//プレビューグラフのいくつかのアクションを禁止する
#define PREVIEW_NOCLICK_BITS (NOCLICK_DATA_PLOT|NOCLICK_LAYER|NOCLICK_LAYERICON)

#define PREVIEW_TEMPLATE    "Origin" //グラフテンプレートのプレビュー

class   MyPreviewCtrl
{
public:
    MyPreviewCtrl(){}
    ~MyPreviewCtrl()
    {
        //ダイアログを閉じたときに一時ブックを削除
        if ( m_wksPreview.IsValid() )
            m_wksPreview.Destroy();
    }
    
    void    Init(int nCtrlID, WndContainer& wndParent)
    {
        //プレビューグラフのコントロールを作成
        Control ctrl = wndParent.GetDlgItem(nCtrlID);
        GraphControl gCtrl;
        gCtrl.CreateControl(ctrl.GetSafeHwnd());
        gCtrl.Visible = true;
        
        GraphPageControl gpCtrl;
        gpCtrl.Create(gCtrl, PREVIEW_NOCLICK_BITS, PREVIEW_TEMPLATE);
        GraphPage gpPreview;
        gpPreview = gpCtrl.GetPage();
        gpPreview.Rename("MyPreview");
        m_glPreview = gpPreview.Layers(0); //第1レイヤ
        
        if ( !m_wksPreview )
        {
            //プレビューデータを持つ一時ワークシート
            m_wksPreview.Create("Origin", CREATE_TEMP);
            m_wksPreview.SetSize(-1, 2); //2列
            
            //軸タイトルとしてロングネームを表示
            Column colX(m_wksPreview, 0);
            colX.SetLongName("Preview X");
            Column colY(m_wksPreview, 1);
            colY.SetLongName("Preview Y");
            
            //データ範囲を用意
            DataRange drPrev;
            drPrev.Add(m_wksPreview, 0, "X");
            drPrev.Add(m_wksPreview, 1, "Y");
            
            //プレビュー曲線をプロット。ここではポイントがない
            int nPlot = m_glPreview.AddPlot(drPrev, IDM_PLOT_LINE);
            DataPlot dp = m_glPreview.DataPlots(nPlot);
            if ( dp ) //プレビュー曲線色をセット
                dp.SetColor(SYSCOLOR_RED);
        }
    }
    
    //外部データとともにプレビュー曲線を更新
    void    Update(const vector& vX, const vector& vY)
    {
        if ( m_wksPreview.IsValid() )
        {
            Dataset dsX(m_wksPreview, 0);
            Dataset dsY(m_wksPreview, 1);
            if ( !dsX.IsValid() || !dsY.IsValid() )
                return; //プレビューのための列なし
            
            //ソースデータを更新するとプレビューグラフも更新
            dsX = vX;
            dsY = vY;
            //再スケール
            m_glPreview.Rescale();
        }
    }
    
private:
    //ダイアログ上のプレビューグラフ
    GraphLayer  m_glPreview;
    
    //プレビューデータを置くための一時ワークシート
    Worksheet   m_wksPreview;
};

ダイアログクラスを追加

class   MyGraphPreviewDlg : public MultiPaneDlg
{
public:
    //ダイアログリソース ID と それを含むDLL
    MyGraphPreviewDlg() : MultiPaneDlg(IDD_SAMPLE_SPLITTER_DLG, 
        GetAppPath(TRUE) + "OriginC\\Originlab\\ODlg8")
    {
    }
    
    ~MyGraphPreviewDlg()
    {
    }
    
    int     DoModalEx(HWND hParent = NULL)
    {
        InitMsgMap();
        
        //ユーザが閉じるまでダイアログ表示
        return DoModal(hParent, DLG_NO_DEFAULT_REPOSITION);
    }     
    
protected:
EVENTS_BEGIN
	ON_INIT(OnInitDialog) 
	ON_BN_CLICKED(IDC_LOAD, OnDraw)
EVENTS_END

    //ダイアログイベントのメッセージハンドラー
    BOOL    OnInitDialog();
    BOOL    OnDraw(Control ctrl);
    
private:
    //プレビューコントロールを表すメンバー
    MyPreviewCtrl       m_Preview;
};

BOOL MyGraphPreviewDlg::OnInitDialog()
{
	m_Preview.Init(IDC_FB_BOX, *this);
	Button btn = GetItem(IDC_LOAD);
	if( btn )
		btn.Text = "Draw";
	return true;
}

BOOL MyGraphPreviewDlg::OnDraw(Control ctrl)
{
	vector vecX, vecY;
	vecX.Data(1.0, 10.0, 0.5);
	vecY.SetSize(vecX.GetSize());	
	for(int ii = 0; ii < vecX.GetSize(); ++ii)
		vecY[ii] = rnd();
	
	m_Preview.Update(vecX, vecY);
	return true;
}

ダイアログを開く

void open_preview_dlg()
{
	MyGraphPreviewDlg dlg;
	dlg.DoModalEx(GetWindow());
	return;
}

上記関数を実行し、 Draw ボタンをクリックします。 すると、プレビューが更新されたのが確認できます。