このセクションでは、グラフプレビュー付きカスタムダイアログの作成方法を示しています。
最初に、プレビューグラフが入れ子になった統計コントロールを含むダイアログリソースを作成します。ここでは、 OriginC\Originlab\ODlg8.dllに組み込まれたリソースである、 IDD_SAMPLE_SPLITTER_DLGを使用します。
コードビルダで、新規ボタン をクリックして、ファイル名を入力し、上述のダイアログリソースと同じパス(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 ボタンをクリックします。 すると、プレビューが更新されたのが確認できます。