ダイアログ ボックスの実装
ATL プロジェクトにダイアログ ボックスを追加する方法は 2 つあります: ATL ダイアログ ウィザードを使用するか、それを手動で追加します。
ATL ダイアログ ウィザードを使用したダイアログ ボックスの追加
クラスの追加]ダイアログ ボックスで、ATL プロジェクトにダイアログ ボックスを追加するために ATL ダイアログ オブジェクトを選択します。をクリック [完了]適切として ATL ダイアログ ウィザードを入力します。ウィザードは CAxDialogImpl から派生したクラスをプロジェクトに追加します。[表示] のメニューの[リソース ビューを開き、ダイアログを見つけ、リソース エディターで開きます。をダブルクリックします。
[!メモ]
ダイアログ ボックスに CAxDialogImplから派生している場合、ActiveX コントロールと Windows 両方のコントロールをホストできます。ダイアログ ボックスのクラスの ActiveX コントロールのサポートのオーバーヘッドが不要な場合は、CSimpleDialog か CDialogImpl を使用します。
メッセージとイベント ハンドラーは、クラス ビューから、ダイアログ クラスに追加できます。詳細については、「ATL メッセージ ハンドラーの追加」を参照してください。
ダイアログ ボックスを手動で追加します
ダイアログ ボックスを実装すると、ペインの実装に似ています。CAxDialogImpl、CDialogImpl、または CSimpleDialog からクラスを派生し、メッセージに メッセージ マップ を宣言します。ただし、の派生クラスでダイアログ テンプレート リソースの ID を指定する必要があります。このクラスは、この値を保持する IDD というデータ メンバーが必要です。
[!メモ]
ATL ダイアログ ウィザードを使用してダイアログ ボックスを作成すると、ウィザードは enum の型として自動的に IDD のメンバーを追加します。
CDialogImpl は Windows コントロールをホストするモーダルまたはモードレス ダイアログ ボックスを実装できるようにします。CAxDialogImpl は、ActiveX コントロールと Windows 両方のコントロールをホストするモーダルまたはモードレス ダイアログ ボックスを実装できるようにします。
モーダル ダイアログ ボックスを作成するには、の CDialogImplのインスタンスを派生 (または派生 CAxDialogImpl-) を作成します。クラスは、DoModal のメソッドを呼び出して、モーダル ダイアログ ボックスを閉じるには、メッセージ ハンドラーから EndDialog のメソッドを呼び出します。モードレス ダイアログ ボックスを作成するには、DoModalの代わりに [作成] のメソッドを呼び出します。モードレス ダイアログ ボックスを破棄するには、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*/);
};