更新 : 2007 年 11 月
ここでは、[プロパティ] ウィンドウを使って 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) 内のイベント ハンドラのコードに移動します。