ActiveX コントロール コンテナー : ActiveX コントロールで発生したイベントの処理
ここでは、[プロパティ] ウィンドウを使って ActiveX コントロールのイベント ハンドラーを ActiveX コントロール コンテナーにインストールする方法について説明します。 イベント ハンドラーは、特定のイベントに関する通知をコントロールから受け取り、その通知に応じた操作を実行します。 この通知をイベントの "発生" と呼びます。
注意
ここでは、ダイアログ ベースの ActiveX コントロール コンテナー プロジェクト Container と、埋め込まれたコントロール Circ をプロシージャとコードの例として使用します。
[プロパティ] ウィンドウの [イベント] ボタンを使うと、ActiveX コントロール コンテナー アプリケーションで発生するイベントのマップを作成できます。 このマップは "イベント シンク マップ" と呼ばれ、コントロール コンテナー クラスにイベント ハンドラーを追加すると、Visual C++ によって作成され、保持されます。 各イベント ハンドラーは、イベント マップ エントリと一緒に実装され、コンテナーのイベント ハンドラー メンバー関数に特定のイベントを割り当てます。 このイベント ハンドラー関数は、ActiveX コントロール オブジェクトが発生させる特定のイベントに応じて呼び出されます。
イベント シンク マップの詳細については、『MFC リファレンス』の「イベント シンク マップ」を参照してください。
イベント ハンドラーによるプロジェクトの変更
[プロパティ] ウィンドウを使用してイベント ハンドラーを追加すると、プロジェクトにはイベント シンク マップが宣言および定義されます。 イベント ハンドラーを最初に追加したときに、コントロールの .CPP ファイルに次のステートメントが追加されます。 このコードは、ダイアログ ボックス クラス (この例では CContainerDlg) のイベント シンク マップを宣言しています。
BEGIN_EVENTSINK_MAP(CContainerDlg, CDialog)
...
END_EVENTSINK_MAP()
[プロパティ] ウィンドウを使用してイベントを追加すると、イベント シンク マップにイベント マップ エントリ (ON_EVENT) が追加され、コンテナーの実装ファイル (.CPP) にイベント ハンドラー関数が追加されます。
コントロール Circ の ClickIn イベントに対して OnClickInCircCtrl というイベント ハンドラーを宣言する例を次に示します。
BEGIN_EVENTSINK_MAP(CContainerDlg, CDialog)
ON_EVENT(CContainerDlg, IDC_CIRCCTRL1, 1 /* ClickIn */, OnClickInCircctrl1,
VTS_I4 VTS_I4)
END_EVENTSINK_MAP()
さらに、このイベント ハンドラー メンバー関数に対して、CContainerDlg クラスの実装ファイル (.CPP) に次のテンプレートが追加されます。
BOOL CContainerDlg::OnClickInCircctrl1(OLE_XPOS_PIXELS nX, OLE_YPOS_PIXELS nY)
{
// use nX and nY here
TRACE(_T("nX = %d, nY = %d\n"), nX, nY);
return TRUE;
}
イベント シンク マクロの詳細については、『MFC リファレンス』の「イベント シンク マップ」を参照してください。
イベント ハンドラー関数を作成するには
クラス ビューで、ActiveX コントロールを含むダイアログ クラスを選択します。 この例では CContainerDlg を選択します。
[プロパティ] ウィンドウの [イベント] をクリックします。
[プロパティ] ウィンドウで、埋め込まれている ActiveX コントロールのコントロール ID を選択します。 この例では IDC_CIRCCTRL1 を選択します。
[プロパティ] ウィンドウに、埋め込まれている ActiveX コントロールが発生させるイベントが一覧表示されます。 太字で表示されたメンバー関数には、ハンドラー関数が割り当てられています。
ダイアログ クラスに処理させるイベントを選択します。 この例では、[クリック] を選択します。
右側のドロップダウン リスト ボックスで、[<追加> ClickCircctrl1] をクリックします。
クラス ビューで新しいハンドラー関数をダブルクリックすると、CContainerDlg の実装ファイル (.CPP) 内のイベント ハンドラーのコードに移動します。