2008年8月13日水曜日

【MFC】 プロパティシートとウィザードの作り方

プロパティシートとは例えば、ウィンドウズの「画面のプロパティ」ことだ。
タブごとに壁紙、スクリーンセーバー、解像度などの各種設定ができて画面の設定を変更・保存することができる。
また、ウィザードとはインストーラのようなもの。
画面ごとに質問に答えていって、設定を決める。

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 {
// キャンセルなど
}

ラベル: , , , ,

0 件のコメント:

コメントを投稿

登録 コメントの投稿 [Atom]

この投稿へのリンク:

リンクを作成

<< ホーム