MFC ActiveX コントロール : カスタム イベントの追加
更新 : 2007 年 11 月
カスタム イベントは、COleControl クラスによって自動的に発生させられることはないという点で、ストック イベントとは異なります。カスタム イベントは、コントロールの開発者が指定した動作をイベントとして認識します。カスタム イベントのイベント マップ エントリは、EVENT_CUSTOM マクロによって表されます。次のセクションでは、ActiveX コントロール ウィザードを使って作成した ActiveX コントロール プロジェクトにカスタム イベントを追加する方法を示します。
イベント追加 ウィザードによるカスタム イベントの追加
次の手順では、ClickIn というカスタム イベントを追加します。この手順は、ほかのカスタム イベントを追加するときにも使用できます。その場合は、ClickIn のイベント名とパラメータを目的のカスタム イベントの名前とパラメータに置き換えます。
イベント追加 ウィザードを使って ClickIn カスタム イベントを追加するには
コントロールのプロジェクトを読み込みます。
[クラス ビュー] ウィンドウで、ActiveX コントロール クラスを右クリックし、ショートカット メニューを開きます。
ショートカット メニューの [追加] をクリックし、[イベントの追加] をクリックします。
これにより、イベント追加 ウィザードが開きます。
[イベント名] ボックスに「ClickIn」と入力します。
[内部名] ボックスに、イベントを発生させる関数の名前を入力します。この例では、イベント追加 ウィザードによって提供される既定値 (FireClickIn) を使用します。
[パラメータ名] ボックスと [パラメータの型] ボックスを使って、xCoord という OLE_XPOS_PIXELS 型のパラメータを追加します。
yCoord という 2 番目のパラメータ (OLE_YPOS_PIXELS 型) を追加します。
[完了] をクリックして、イベントを作成します。
カスタム イベントの追加に伴うイベント追加 ウィザードによる変更
カスタム イベントを追加すると、イベント追加 ウィザードによって、コントロール クラスの .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 というインライン関数を宣言しています。FireClickIn は、イベント追加 ウィザードで定義したパラメータと ClickIn イベントを使って COleControl::FireEvent を呼び出します。
さらに、コントロール クラスの実装 (.CPP) ファイル内にあるコントロールのイベント マップには、次の行が追加されます。
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 番号を割り当てます。この ID 番号は、イベント追加 ウィザードのイベント リストにおけるこのイベントの位置を示します。イベント リストのエントリによって、コンテナがイベントに対応できるようになります。たとえば、イベントの発生時に実行するハンドラ コードをコンテナで用意できます。
FireClickIn の呼び出し
イベント追加 ウィザードを使ってカスタム イベント ClickIn を追加したら、次に、このイベントを発生させる時期を決定します。該当する動作が起こったときに FireClickIn を呼び出すことによって、イベントを発生させることができます。ここでは、WM_LBUTTONDOWN メッセージ ハンドラ内で InCircle 関数を使って、ユーザーが円または楕円の領域の内側をクリックしたときに ClickIn イベントを発生させる場合を例として説明します。次の手順で WM_LBUTTONDOWN ハンドラを追加します。
イベント追加 ウィザードでメッセージ ハンドラを追加するには
コントロールのプロジェクトを読み込みます。
[クラス ビュー] で、使用する ActiveX コントロール クラスを選択します。
[プロパティ] ウィンドウの [メッセージ] をクリックします。
ActiveX コントロールで処理できるメッセージの一覧が [プロパティ] ウィンドウに表示されます。太字で表示されているメッセージには、既にハンドラ関数が割り当てられています。
[プロパティ] ウィンドウで、処理するメッセージを選択します。この例では、[WM_LBUTTONDOWN] を選択します。
右のドロップダウン リスト ボックスで、[<追加> OnLButtonDown] を選択します。
[クラス ビュー] で新しいハンドラ関数をダブルクリックして、ActiveX コントロールの実装 (.CPP) ファイル内のメッセージ ハンドラ コードに移動します。
次のコードは、コントロール ウィンドウ内でマウスの左ボタンがクリックされるたびに InCircle 関数を呼び出します。このコードは、「CIRC サンプル : ActiveX コントロール」の WM_LBUTTONDOWN ハンドラ関数 OnLButtonDown にあります。
void CMyAxUICtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
if (InCircle(point))
FireClickIn(point.x, point.y);
COleControl::OnLButtonDown(nFlags, point);
}
メモ : |
---|
イベント追加 ウィザードでマウス ボタンの動作に対するメッセージ ハンドラを作成すると、基本クラスの同じメッセージ ハンドラの呼び出しが自動的に追加されます。この呼び出しを削除しないでください。コントロールがストック マウス メッセージを使用する場合に、マウスのキャプチャが正しく処理されるようにするには、基本クラスのメッセージ ハンドラを呼び出す必要があります。 |
次の例では、コントロール内の円または楕円の領域の内側でマウスがクリックされたときにだけイベントが発生します。この動作を実現するには、次のようにコントロールの実装 (.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 を追加します。
ストック イベントと同じ名前のカスタム イベントを追加するには
コントロールのプロジェクトを読み込みます。
[クラス ビュー] ウィンドウで、ActiveX コントロール クラスを右クリックし、ショートカット メニューを開きます。
ショートカット メニューの [追加] をクリックし、[イベントの追加] をクリックします。
これにより、イベント追加 ウィザードが開きます。
[イベント名] ボックスの一覧でストック イベント名を選択します。この例では、[Click] を選択します。
[イベントの種類] の [カスタム] を選択します。
[完了] をクリックして、イベントを作成します。
コードの適切な場所で FireClick を呼び出します。