MFC ActiveX コントロール : カスタム イベントの追加
ストック イベントは、クラス COleControl
によって自動的に起動されないという点でカスタム イベントとは異なります。 カスタム イベントは、コントロールの開発者によって決定された特定のアクションをイベントとして認識します。 カスタム イベントのイベント マップ エントリは、EVENT_CUSTOM マクロによって表されます。 次のセクションでは、ActiveX コントロール ウィザードを使用して作成された ActiveX コントロール プロジェクトのカスタム イベントを実装します。
イベントの追加ウィザードを使用したカスタム イベントの追加
次の手順では、特定のカスタム イベント ClickIn を追加します。 この手順を使用すると、他のカスタム イベントを追加できます。 ClickIn イベント名とパラメーターには、カスタム イベント名とそのパラメーターを置き換えます。
イベントの追加ウィザードを使用して ClickIn カスタム イベントを追加するには
コントロールのプロジェクトを読み込みます。
クラス ビュー で、ActiveX コントロール クラスを右クリックして、ショートカット メニューを開きます。
ショートカット メニューの [追加] をクリックしてから、[イベントの追加] をクリックします。
これにより、[イベントの追加] ウィザードが開きます。
[Event name (イベント名)] ボックスで、まず既存のイベントを選択し、[Custom (カスタム)] ラジオ ボタンをクリックして、 ClickIn と入力します。
[Internal name (内部名)] ボックスに、イベントの発生関数の名前を入力します。 この例では、イベントの追加ウィザード (
FireClickIn
) によって提供される既定値を使用します。パラメーター名 と パラメーター型 コントロールを使用して、xCoord (型 OLE_XPOS_PIXELS) というパラメーターを追加します。
yCoord (型 OLE_YPOS_PIXELS) と呼ばれる 2 番目のパラメーターを追加します。
[Finish (完了)] をクリックしてイベントを作成します。
イベントの追加ウィザードによるカスタム イベントの変更
カスタム イベントを追加すると、イベント追加ウィザードは、コントロール クラスの.H、.CPP、.IDL ファイルを変更します。 次のコード サンプルは、ClickIn イベントに固有のものです。
コントロール クラスのヘッダー (.H) ファイルに、以下の行を追加します。
void FireClickIn(OLE_XPOS_PIXELS xCoord, OLE_YPOS_PIXELS yCoord)
{
FireEvent(eventidClickIn, EVENT_PARAM(VTS_XPOS_PIXELS VTS_YPOS_PIXELS), xCoord, yCoord);
}
このコードでは、インライン関数 FireClickIn
を宣言し、イベント追加ウィザードで定義した ClickIn イベントとパラメータで COleControl::FireEvent を呼び出すようにしています。
また、コントロール クラスの実装ファイル (.CPP) 内にあるコントロールのイベント マップに、次の行を追加します。
EVENT_CUSTOM_ID("ClickIn", eventidClickIn, FireClickIn, VTS_XPOS_PIXELS VTS_YPOS_PIXELS)
EVENT_CUSTOM_ID("ClickIn", eventidClickIn, FireClickIn, VTS_XPOS_PIXELS VTS_YPOS_PIXELS)
このコードは、イベント ClickIn をインライン関数 FireClickIn
にマップし、イベントの追加ウィザードを使用して定義したパラメーターを渡します。
最後に、コントロールの .IDL ファイルに次の行を追加します。
[id(1)] void ClickIn(OLE_XPOS_PIXELS xCoord, OLE_YPOS_PIXELS yCoord);
この行では、ClickIn イベントに特定の ID 番号を割り当てます。これは、イベント ウィザードのイベント追加リストでのイベントの位置から取得します。 イベント一覧のエントリを使用すると、コンテナーでイベントを予測できます。 たとえば、イベントが発生したときに実行されるハンドラー コードを提供できます。
FireClickIn の呼び出し
イベント追加ウィザードを使用して ClickIn カスタム イベントを追加したので、このイベントがいつ発生するかを決定する必要があります。 これを行うには、適切なアクションが発生したときに FireClickIn
を呼び出します。 この説明では、コントロールは、ユーザーが円形または楕円の領域内をクリックしたときに、ClickIn イベントを発生させるために、WM_LBUTTONDOWN
メッセージ ハンドラー内で InCircle
関数を使用します。 WM_LBUTTONDOWN
ハンドラーを追加する手順を次に示します。
イベント追加ウィザードを使用してメッセージ ハンドラーを追加するには
コントロールのプロジェクトを読み込みます。
クラス ビューで、ActiveX コントロール クラスを選択します。
[プロパティ] ウィンドウには、ActiveX コントロールで処理できるメッセージの一覧が表示されます。 太字で示されているメッセージには、既にハンドラー関数が割り当てられています。
処理するメッセージを選択します。 この例では、
WM_LBUTTONDOWN
を選択します。右側のドロップダウン リスト ボックスで、[OnLButtonDown の<>追加] を選択します。
クラス ビューの新しいハンドラー関数をダブルクリックして、ActiveX コントロールの実装 (.CPP) ファイルのメッセージ ハンドラー コードに移動します。
次のコード サンプルでは、コントロール ウィンドウ内でマウスの左ボタンがクリックされるたびに InCircle
関数を呼び出します。 このサンプルは、Circ sample 抽象の WM_LBUTTONDOWN
ハンドラー関数 OnLButtonDown
で参照できます。
void CMyAxUICtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
if (InCircle(point))
FireClickIn(point.x, point.y);
COleControl::OnLButtonDown(nFlags, point);
}
Note
イベントの追加ウィザードでマウスボタン操作のメッセージ ハンドラーが作成されると、基本クラスの同じメッセージ ハンドラーの呼び出しが自動的に追加されます。 この呼び出しは削除しないでください。 コントロールが任意のストック マウス メッセージを使用する場合は、マウス キャプチャが適切に処理されるように、基本クラスのメッセージ ハンドラーを呼び出す必要があります。
次の例では、コントロール内の円形または楕円の領域内でクリックが発生した場合にのみ、イベントが発生します。 この動作を実現するには、コントロールの実装 (CPP) ファイルに InCircle
関数を配置します。
VARIANT_BOOL CMyAxUICtrl::InCircle(CPoint& point)
{
CRect rc;
GetClientRect(rc);
// Determine radii
double a = (rc.right - rc.left) / 2;
double b = (rc.bottom - rc.top) / 2;
// Determine x, y
double x = point.x - (rc.left + rc.right) / 2;
double y = point.y - (rc.top + rc.bottom) / 2;
// Apply ellipse formula
return ((x * x) / (a * a) + (y * y) / (b * b) <= 1);
}
また、InCircle
関数の次の宣言をコントロールのヘッダー (.H) ファイルに追加する必要があります。
VARIANT_BOOL InCircle(CPoint& point);
ストック名を持つカスタムイベント
ストック イベントと同じ名前のカスタム イベントを作成できますが、両方を同じコントロールに実装することはできません。 たとえば、ストック イベントの Click が通常発生したときに起動しない Click というカスタム イベントを作成することができます。 その後、Click 関数を呼び出すことによって、いつでも Click イベントを発生させることができます。
次の手順では、カスタムの Click イベントを追加します。
ストック イベント名を使用するカスタム イベントを追加するには
コントロールのプロジェクトを読み込みます。
クラス ビュー で、ActiveX コントロール クラスを右クリックして、ショートカット メニューを開きます。
ショートカット メニューの [追加] をクリックしてから、[イベントの追加] をクリックします。
これにより、[イベントの追加] ウィザードが開きます。
[Event Name (イベント名)] ボックスの一覧で、ストック イベント名を選択します。 この例では、[クリック] を選択します。
[Event Type (イベントの種類)] で [Custom (カスタム)] を選択します。
[Finish (完了)] をクリックしてイベントを作成します。
コード内の適切な場所で
FireClick
を呼び出します。