MFC ActiveX コントロール : カスタム イベントの追加
カスタム イベントは、ストック イベントとクラス COleControlによって自動的に発生しないことは異なります。カスタム イベントはイベントとして、コントロールの開発者によって決定される特定の操作を認識します。カスタム イベントのイベント マップ エントリは EVENT_CUSTOM のマクロによって表されます。以降のセクションでは、 ActiveX コントロール ウィザードを使用して作成された ActiveX コントロール プロジェクトのカスタム イベントを実装します。
追加のイベントと、ウィザードでカスタム イベントの追加
次の手順では、特定のカスタム イベント、 ClickIn を追加します。他のカスタム イベントを追加するには、この手順を使用します。ClickIn イベント名とパラメーターのカスタム イベント名およびパラメーターに置き換えてください。
ClickIn のカスタム イベントをイベントの追加ウィザードを追加するには
コントロール プロジェクトを読み込んでください。
クラス ビューで、ショートカット メニューを開くには、 ActiveX コントロール クラスを右クリックします。
ショートカット メニューの [ 追加 をクリックし、 イベントの追加をクリックします。
これは、イベントの追加ウィザードを開きます。
Event name ボックスでは、既存のイベントを選択し、を カスタム,カスタム(U),カスタム(T) のオプション ボタン、型 ClickInをクリックします。
Internal name ボックスでは、イベント発生の関数の名前を入力します。この例では、追加のイベントFireClickInウィザード ()で提供される既定値を使用します。
パラメーター名,パラメーター名(N) と パラメーターの型 のコントロールを使用して xCoord (型 OLE_XPOS_PIXELS)というパラメーターを追加します。
yCoord (型 OLE_YPOS_PIXELS)と呼ばれる第 2 パラメーターを追加します。
イベントを作成するクリック 完了 。
カスタム イベントのイベント ウィザードの変更を追加します。
カスタム イベントを追加すると、追加のイベント ウィザードは、コントロール クラスを変更します。ただし、 .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);
}
このコードは、イベントの追加ウィザードを使用して定義したパラメーターおよび ClickIn イベントの COleControl::FireEvent をダイヤルするインライン関数を FireClickIn と宣言します。
また、次の行はコントロール クラスの実装 (.cpp)ファイルにあるコントロールのイベント マップに追加されます:
EVENT_CUSTOM_ID("ClickIn", eventidClickIn, FireClickIn, VTS_XPOS_PIXELS VTS_YPOS_PIXELS)
このコードは、イベントの追加ウィザードを使用して定義したパラメーターを渡すインライン関数 FireClickInにイベント ClickIn をマップします。
最後に、次の行はコントロールの .IDL ファイルに追加されます:
[id(1)] void ClickIn(OLE_XPOS_PIXELS xCoord, OLE_YPOS_PIXELS yCoord);
この行は追加のイベント ウィザードのイベントの一覧のイベントの場所から取得した特定の ID 番号 ClickIn のイベントに割り当てます。イベント リストのエントリは、コンテナーがイベントを予測できるようにします。たとえば、イベントが発生したときに実行されるハンドラー コードを提供する可能性があります。
FireClickIn を呼び出します。
イベントの追加ウィザードを使用して ClickIn のカスタム イベントを追加したので、このイベントがいつ発生するかを決定します。FireClickIn を呼び出すことで行われます適切なアクションが発生したとき。このついては、コントロールは、ユーザーが円または楕円空間内でクリックすると ClickIn のイベントを発生させるために WM_LBUTTONDOWN のメッセージ ハンドラー内の InCircle 関数を使用します。次の手順では、 WM_LBUTTONDOWN ハンドラーを追加します。
イベントの追加ウィザードを持つメッセージ ハンドラーを追加するには
コントロール プロジェクトを読み込んでください。
クラス ビューで、 ActiveX コントロール クラスを選択します。
[プロパティ] ウィンドウの [メッセージ] をクリックします。
[プロパティ] ウィンドウは、 ActiveX コントロールで処理できるメッセージの一覧を表示します。太字で示されているメッセージが既に、割り当てられたハンドラー関数があります。
プロパティ ウィンドウで、処理するメッセージを選択します。この例では、 WM_LBUTTONDOWNを選択します。
下のボックスの一覧で、を選択します 追加 OnLButtonDown。
ActiveX コントロールの実装 (.cpp)ファイルのメッセージ ハンドラー コードにジャンプするには、クラス ビューで新しいハンドラー関数をダブルクリック。
次のコード例は、マウスの左ボタンをコントロール ペイン内をクリックするたびに InCircle 関数を呼び出しますします。このサンプルは WM_LBUTTONDOWN のハンドラー関数、 Circ のサンプル の抽象の 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);
標準的な名前のカスタム イベント
同じコントロールの両方を実行できないただし、ストック イベントと同じ名前のカスタム イベントを作成できます。たとえば、ストック イベント クリックが発生するか、通常、いつ発生させずクリックというカスタム イベントを作成する場合があります。イベント発生の関数を呼び出すことにより、クリック イベントを発生に実行できます。
次の手順では、カスタム クリック イベントを追加します。
ストック イベントの名前を使用するカスタム イベントを追加するには
コントロール プロジェクトを読み込んでください。
クラス ビューで、ショートカット メニューを開くには、 ActiveX コントロール クラスを右クリックします。
ショートカット メニューの [ 追加 をクリックし、 イベントの追加をクリックします。
これは、イベントの追加ウィザードを開きます。
Event Name のドロップダウン リストで、ストック イベントの名前を選択します。この例で、を選択します クリック。
イベントの種類で、を選択します カスタム,カスタム(U),カスタム(T)。
イベントを作成するクリック 完了 。
コードの適切な場所に FireClick を呼び出します。