グラフプレビュー付きダイアログこのセクションでは、グラフプレビュー付きカスタムダイアログの作成方法を示しています。
ダイアログリソースを準備
最初に、プレビューグラフが入れ子になった統計コントロールを含むダイアログリソースを作成します。ここでは、 OriginC\Originlab\ODlg8.dllに組み込まれたリソースである、 IDD_SAMPLE_SPLITTER_DLGを使用します。
ソースファイルを準備
コードビルダで、新規ボタン をクリックして、ファイル名を入力し、上述のダイアログリソースと同じパス(OriginのインストールフォルダのOriginC\Originlab サブフォルダ)にセットします。
必要なヘッダを含める
// これらのヘッダファイルは、ダイアログとコントロールの宣言を含む
#include <..\Originlab\DialogEx.h>
#include <..\Originlab\GraphPageControl.h>
ユーザ定義プレビュークラスを作成Classes, User Defined
//プレビューグラフのいくつかのアクションを禁止する
#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 ボタンをクリックします。 すると、プレビューが更新されたのが確認できます。
|