ダイアログ ボックスの実装
ATL プロジェクトにダイアログ ボックスを追加するには、ATL ダイアログ ウィザードを使用する方法と、手動で追加する方法の 2 つがあります。
ATL ダイアログ ウィザードを使用したダイアログ ボックスの追加
[クラスの追加] ダイアログ ボックスで、ATL ダイアログ オブジェクトを選択して、ATL プロジェクトにダイアログ ボックスを追加します。 必要に応じて ATL ダイアログ ウィザードに入力し、[完了] をクリックします。 ウィザードによって、CAxDialogImpl から派生したクラスがプロジェクトに追加されます。 [ビュー] メニューから [リソース ビュー] を開き、ダイアログを見つけて、これをダブルクリックしてリソース エディターで開きます。
Note
ダイアログ ボックスが CAxDialogImpl
から派生している場合は、これにより ActiveX と Windows コントロールの両方をホストすることができます。 ダイアログ ボックス クラスで ActiveX コントロールのサポートのオーバーヘッドが必要ではない場合は、代わりに CSimpleDialog または CDialogImpl を使用します。
メッセージおよびイベント ハンドラーは、ダイアログ クラスからクラス ビューに追加できます。 詳細については、「ATL メッセージ ハンドラーの追加」を参照してください。
ダイアログ ボックスを手動で追加する
ダイアログ ボックスの実装は、ウィンドウの実装に似ています。 CAxDialogImpl、CDialogImpl、または CSimpleDialog からクラスを派生し、メッセージを処理するメッセージ マップを宣言します。 ただし、派生クラスでダイアログ テンプレート リソース ID も指定する必要があります。 この値を保持するには、クラスに IDD
というデータ メンバーが必要です。
Note
ATL ダイアログ ウィザードを使用してダイアログ ボックスを作成すると、ウィザードによって IDD
メンバーが enum
型として自動的に追加されます。
CDialogImpl
を使用すると、Windows コントロールをホストするモーダルまたはモードレス ダイアログ ボックスを実装できます。 CAxDialogImpl
を使用すると、ActiveX および Windows コントロールをホストするモーダルまたはモードレス ダイアログ ボックスを実装できます。
モーダル ダイアログ ボックスを作成するには、CDialogImpl
派生 (または CAxDialogImpl
派生) クラスのインスタンスを作成し、DoModal メソッドを呼び出します。 モーダル ダイアログ ボックスを閉じるには、メッセージ ハンドラー から EndDialog メソッドを呼び出します。 モードレス ダイアログ ボックスを作成するには、DoModal
ではなく Create メソッドを呼び出します。 モードレス ダイアログ ボックスを破棄するには、DestroyWindow を呼び出します。
シンク イベントは、CAxDialogImpl で自動的に行われます。 CWindowImpl
派生クラスのハンドラーの場合と同様に、ダイアログ ボックスのメッセージ ハンドラー実装します。 メッセージ固有の戻り値がある場合は、LRESULT
として返します。 返された LRESULT
値は Windows ダイアログ マネージャーによって適切に処理されるように、ATL によってマップされます。 詳細については、atlwin.h の CDialogImplBaseT::DialogProc のソース コードを参照してください。
例
次のクラスは、ダイアログ ボックスを実装します。
class CMyDialog : public CDialogImpl<CMyDialog>
{
public:
enum { IDD = IDD_MYDLG };
BEGIN_MSG_MAP(CMyDialog)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
COMMAND_HANDLER(IDCANCEL, BN_CLICKED, OnBnClickedCancel)
END_MSG_MAP()
LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/,
BOOL& /*bHandled*/)
{
// Do some initialization code
return 1;
}
public:
LRESULT OnBnClickedCancel(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/);
};