プロパティシートとは例えば、ウィンドウズの「画面のプロパティ」ことだ。
タブごとに壁紙、スクリーンセーバー、解像度などの各種設定ができて画面の設定を変更・保存することができる。
また、ウィザードとはインストーラのようなもの。
画面ごとに質問に答えていって、設定を決める。
MFCではプロパティシートのモードを変えるだけで、プロパティシートがウィザードになる。
上の説明でプロパティシートとウィザードの違いはタブごとか画面ごとかを考えればごく自然だ。
ただし、ダイアログをデザインする際にウィザードはウィザードらしくするなどは言うまでもない。
それではMFCでプロパティシートの作り方から。
Visual C++で適当なMFCプロジェクトを作る。
リソースビューで
Dialogを右クリックして、
Dialogを挿入を選択する。
デフォルトのボタン類は削除する。
ダイアログを右クリックして
クラスの追加を選ぶ。
クラス名:CPage1
基本クラス:CPropertyPage
次にプロパティを変更する。
Style:子
System Menu:False
Caption:my property sheet
同様にCPage2を追加する。
次にプロパティシートクラスを作成する。
プロジェクトを右クリックしてクラスの追加を選択する。
MFCクラスを選んで、次に進む。
クラス名:CSheet
基本クラス:CPropertySheet
Sheet.hを開いてソースを編集する。
#include "Page1.h"
#include "Page2.h"
...
public:
CPage1 m_page1;
CPage2 m_page2;
Sheet.cppを編集
CSheet::CSheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
:CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
{
AddPage(&m_page1);
AddPage(&m_page2);
AddPage(&m_page3);
}
CSheet::CSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
:CPropertySheet(pszCaption, pParentWnd, iSelectPage)
{
AddPage(&m_page1);
AddPage(&m_page2);
AddPage(&m_page3);
}
適用ボタンを無効化するにはCSheetのコンストラクタで
m_psh.dwFlags |= PSH_NOAPPLYNOW;
とします。
逆に有効化するにはCPage1でイベントの追加からメッセージEN_CHANGEを追加します。
プロパティのオーバーライドから、OnApplyにより適用ボタンのイベントを拾うことができる。
たいていの場合はメニューやボタンのイベントでプロパティシートを呼ぶことになるだろう。
好きなイベントハンドラーで以下のようにプロパティシートを作成する。
CSheet sheet(L"タイトルとか", this, 0);
INT_PTR result = sheet.DoModal();
if (result == IDOK) {
...
プロパティシートをウィザードモードに変更するには以下のメソッドを呼ぶだけ。
...
sheet.SetWizardMode();
INT_PTR result = sheet.DoModal();
...
また、ウィザード特有のメソッドがある。
OnSetActiveはページが作られたタイミングで呼ばれる。
ここに「次へ」ボタンなどを追加できる。
...
CPropertySheet* parent = (CPropertySheet*)GetParent();
parent->SetWizardButtons(PSWIZB_NEXT);
...
自分で定義したウィザード共通の変数へアクセスする場合はCSheetを呼ぶ。
...
CSheet *parent = (CSheet*)GetParent();
parent->m_foo = ...
...
PSWIZB_BACK | PSWIZB_NEXTとすると「戻る」と「次へ」ボタンが押せる。
完了ボタンはPSWIZB_FINISH。
「次へ」ボタンのイベントはOnWizardNextで拾える。
ウィザードが完了したかどうかは
...
sheet.SetWizardMode();
INT_PTR result = sheet.DoModal();
if (result == ID_WIZFINISH) {
// 完了処理
} else {
// キャンセルなど
}
ラベル: C/C++, MFC, VC, Windows, Windows API