Share via


ダイアログ ボックスの実装

ATL プロジェクトにダイアログ ボックスを追加するには、ATL ダイアログ ウィザードを使用する方法と、手動で追加する方法の 2 つがあります。

ATL ダイアログ ウィザードを使用したダイアログ ボックスの追加

[クラスの追加] ダイアログ ボックスで、ATL ダイアログ オブジェクトを選択して、ATL プロジェクトにダイアログ ボックスを追加します。 必要に応じて ATL ダイアログ ウィザードに入力し、[完了] をクリックします。 ウィザードによって、CAxDialogImpl から派生したクラスがプロジェクトに追加されます。 [ビュー] メニューから [リソース ビュー] を開き、ダイアログを見つけて、これをダブルクリックしてリソース エディターで開きます。

Note

ダイアログ ボックスが CAxDialogImpl から派生している場合は、これにより ActiveX と Windows コントロールの両方をホストすることができます。 ダイアログ ボックス クラスで ActiveX コントロールのサポートのオーバーヘッドが必要ではない場合は、代わりに CSimpleDialog または CDialogImpl を使用します。

メッセージおよびイベント ハンドラーは、ダイアログ クラスからクラス ビューに追加できます。 詳細については、「ATL メッセージ ハンドラーの追加」を参照してください。

ダイアログ ボックスを手動で追加する

ダイアログ ボックスの実装は、ウィンドウの実装に似ています。 CAxDialogImplCDialogImpl、または 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*/);
};

関連項目

ウィンドウ クラス