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

更新 : 2007 年 11 月

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

ATL ダイアログ ウィザードによるダイアログ ボックスの追加

[クラスの追加] ダイアログ ボックスで、[ATL ダイアログ] オブジェクトを選択して、ATL プロジェクトにダイアログ ボックスを追加します。ATL ダイアログ ウィザードに必要事項を入力し、[完了] をクリックします。このウィザードは CAxDialogImpl の派生クラスをプロジェクトに追加します。[表示] メニューでリソース ビューを開き、ダイアログを探してダブルクリックし、リソース エディタで開きます。

246a2azb.alert_note(ja-jp,VS.90).gifメモ :

CAxDialogImpl から派生したダイアログ ボックスでは、ActiveX と Windows の両方のコントロールをホストできます。代わりに CSimpleDialog または CDialogImpl から派生すると、ActiveX コントロールのサポートによるオーバーヘッドがかかりません。

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

手動によるダイアログ ボックスの追加

ダイアログ ボックスの実装は、ウィンドウの実装に似ています。CAxDialogImplCDialogImpl、または CSimpleDialog からクラスを派生し、メッセージ処理のためにメッセージ マップを宣言します。ただし、ダイアログ ボックスの実装では、派生クラスでダイアログ テンプレート リソース ID も指定する必要があります。クラスには、ダイアログ テンプレート リソース ID を保持するために、IDD というデータ メンバが必要です。

246a2azb.alert_note(ja-jp,VS.90).gifメモ :

ATL ダイアログ ウィザードでダイアログ ボックスを作成する場合、IDD メンバが enum 型として自動的に追加されます。

CDialogImpl では、Windows コントロールをホストするモーダル ダイアログ ボックスまたはモードレス ダイアログ ボックスを実装できます。CAxDialogImpl では、ActiveX と Windows の両方のコントロールをホストするモーダル ダイアログ ボックスまたはモードレス ダイアログ ボックスを実装できます。

モーダル ダイアログ ボックスを作成するには、CDialogImpl または CAxDialogImpl の派生クラスのインスタンスを作成し、DoModal メソッドを呼び出します。モーダル ダイアログ ボックスを閉じるには、メッセージ ハンドラから EndDialog メソッドを呼び出します。モードレス ダイアログ ボックスを作成するには、DoModal メソッドの代わりに Create メソッドを呼び出します。モードレス ダイアログ ボックスを破棄するには、DestroyWindow を呼び出します。

イベントのシンクは CAxDialogImpl で自動的に行われます。ダイアログ ボックスのメッセージ ハンドラは、CWindowImpl の派生クラスのハンドラと同様に実装します。メッセージ固有の戻り値がある場合は、LRESULT として返します。ATL は、返された LRESULT を Windows ダイアログ マネージャで正しく処理できるように割り当てます。詳細については、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*/);
};

参照

その他の技術情報

ATL ウィンドウ クラス