次の方法で共有


MFC ActiveX コントロール: カスタム イベントの追加

カスタム イベントは、クラス COleControlによって自動的に発生しないという点で、ストック イベントとは異なります。 カスタム イベントは、コントロール開発者によって決定された特定のアクションをイベントとして認識します。 カスタム イベントのイベント マップ エントリは、EVENT_CUSTOM マクロによって表されます。 次のセクションでは、ActiveX コントロール ウィザードを使用して作成された ActiveX コントロール プロジェクトのカスタム イベントを実装します。

イベントの追加ウィザードを使用したカスタム イベントの追加

次の手順では、特定のカスタム イベント ClickIn を追加します。 この手順を使用して、他のカスタム イベントを追加できます。 カスタム イベント名とそのパラメーターを ClickIn イベント名とパラメーターに置き換えます。

イベントの追加ウィザードを使用して ClickIn カスタム イベントを追加するには

  1. コントロールのプロジェクトを読み込みます。

  2. クラス ビューで、ActiveX コントロール クラスを右クリックしてショートカット メニューを開きます。

  3. ショートカット メニューの [ 追加 ] をクリックし、[ イベントの追加] をクリックします。

    イベントの追加ウィザードが開きます。

  4. [ イベント名 ] ボックスで、まず既存のイベントを選択し、[ カスタム ] ラジオ ボタンをクリックし、「 ClickIn」と入力します。

  5. [ 内部名 ] ボックスに、イベントの発生関数の名前を入力します。 この例では、イベントの追加ウィザード (FireClickIn) で提供される既定値を使用します。

  6. パラメーターコントロールとパラメーター型コントロールを使用して、xCoord (型OLE_XPOS_PIXELS) と呼ばれるパラメーターを追加します。

  7. yCoord (型 OLE_YPOS_PIXELS) という 2 番目のパラメーターを追加します。

  8. [ 完了] をクリックしてイベントを作成します。

カスタム イベントのイベント ウィザードの変更の追加

カスタム イベントを追加すると、イベントの追加ウィザードによってコントロール クラスが変更されます。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);
}

このコードでは、ClickIn イベントと、イベントの追加ウィザードを使用して定義したパラメーターを指定して COleControl::FireEvent を呼び出す、FireClickInというインライン関数を宣言します。

さらに、次の行は、実装内にあるコントロールのイベント マップに追加されます (.コントロール クラスの 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 を呼び出します。 この説明では、コントロールは、WM_LBUTTONDOWN メッセージ ハンドラー内のInCircle関数を使用して、ユーザーが円形または楕円領域内をクリックしたときに ClickIn イベントを発生させます。 次の手順では、 WM_LBUTTONDOWN ハンドラーを追加します。

イベントの追加ウィザードでメッセージ ハンドラーを追加するには

  1. コントロールのプロジェクトを読み込みます。

  2. クラス ビューで、ActiveX コントロール クラスを選択します。

  3. [ プロパティ ] ウィンドウには、ActiveX コントロールで処理できるメッセージの一覧が表示されます。 太字で表示されるすべてのメッセージには、既にハンドラー関数が割り当てられます。

  4. 処理するメッセージを選択します。 この例では、[ WM_LBUTTONDOWN] を選択します。

  5. 右側のドロップダウン リスト ボックスで、onLButtonDown <追加>選択します。

  6. クラス ビューで新しいハンドラー関数をダブルクリックして、実装内のメッセージ ハンドラー コード (.ActiveX コントロールの CPP) ファイル。

次のコード サンプルでは、コントロール ウィンドウ内でマウスの左ボタンがクリックされるたびに、 InCircle 関数を呼び出します。 このサンプルは、Circ サンプル抽象の WM_LBUTTONDOWN ハンドラー関数 (OnLButtonDown) にあります。

void CMyAxUICtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
   if (InCircle(point))
      FireClickIn(point.x, point.y);

   COleControl::OnLButtonDown(nFlags, point);
}

イベントの追加ウィザードでマウス ボタン 操作のメッセージ ハンドラーが作成されると、基底クラスの同じメッセージ ハンドラーへの呼び出しが自動的に追加されます。 この呼び出しは削除しないでください。 コントロールでストック マウス メッセージのいずれかを使用する場合は、マウス キャプチャが適切に処理されるように、基底クラスのメッセージ ハンドラーを呼び出す必要があります。

次の例では、コントロール内の円形または楕円領域内でクリックが発生した場合にのみイベントが発生します。 この動作を実現するには、 InCircle 関数をコントロールの実装 (.CPP) ファイル:

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 イベントを追加します。

ストック イベント名を使用するカスタム イベントを追加するには

  1. コントロールのプロジェクトを読み込みます。

  2. クラス ビューで、ActiveX コントロール クラスを右クリックしてショートカット メニューを開きます。

  3. ショートカット メニューの [ 追加 ] をクリックし、[ イベントの追加] をクリックします。

    イベントの追加ウィザードが開きます。

  4. [ イベント名] ドロップダウン リストで、ストック イベント名を選択します。 この例では、[クリック] を選択 します

  5. [イベントの種類] で、[カスタム] を選択します

  6. [ 完了] をクリックしてイベントを作成します。

  7. コード内の適切な場所で FireClick を呼び出します。

こちらも参照ください

MFC ActiveX コントロール
MFC ActiveX コントロール: メソッド
COleControl クラス