次の方法で共有


手順 5: イベントの追加

更新 : 2011 年 1 月

この手順では、ClickIn イベントと ClickOut イベントを ATL コントロールに追加します。 ユーザーが多角形の中をクリックした場合は ClickIn イベントを、多角形の外をクリックした場合は ClickOut イベントを発生させます。 イベントを追加するタスクは次のとおりです。

  • 追加、ClickInClickOutメソッド

  • タイプ ライブラリの生成

  • コネクション ポイント インターフェイスの実装

ClickIn メソッドと ClickOut メソッドの追加

手順 2 で ATL コントロールを作成すると、選択した、接続ポイントチェック ボックス。 この操作によって、Polygon.idl ファイルに _IPolyCtlEvents インターフェイスが作成されました。 インターフェイス名はアンダースコア (_) から開始します。 これは、インターフェイスが内部インターフェイスであることを示す表記規則です。 このため、COM オブジェクトを表示できるプログラムでは、ユーザーにインターフェイスを見せないように選択できます。 また、選択に注意してください接続ポイントことを示すで Polygon.idl ファイルに次の行を追加**_IPolyCtlEvents**既定のソース インターフェイスします。

[default, source] dispinterface _IPolyCtlEvents;

このソース属性は、コントロールが通知元であることを示します。コントロールは、コンテナーのこのインターフェイスを呼び出します。

ここで、ClickIn メソッドと ClickOut メソッドを _IPolyCtlEvents インターフェイスに追加します。

ClickIn メソッドと ClickOut メソッドを追加するには

  1. [クラス ビュー] で、Polygon と PolygonLib を展開して _IPolyCtlEvents を表示します。

  2. _IPolyCtlEvents を右クリックします。 ショートカット メニューのをクリックします追加、し メソッドの追加

  3. 選択、型を返すvoid

  4. 入力ClickIn で、 メソッド名ボックス。

  5. パラメーター属性、選択、 ボックス。

  6. 選択、パラメーター型LONG

  7. 型x として、 パラメーター名、し 追加

  8. 手順 5 ~ 7、この時間を繰り返します、パラメーター名 の y。

  9. [次へ] をクリックします。

  10. 型法をクリックして として、 helpstring

  11. [完了] をクリックします。

  12. 定義するのには、上記の手順を繰り返します、ClickOutメソッドと同じLONGパラメーターxy、同じパラメーター属性と同じvoid型を返します。

Polygon.idl ファイルをチェックして、_IPolyCtlEvents ディスパッチ インターフェイスに対してコードが追加されたかどうかを確認してください。

Polygon.idl ファイルの _IPolyCtlEvents ディスパッチ インターフェイスは次のようになります。

dispinterface _IPolyCtlEvents
{
   properties:
   methods:
      [id(1), helpstring("method ClickIn")] void ClickIn([in] LONG x, [in] LONG y);
      [id(2), helpstring("method ClickOut")] void ClickOut([in] LONG x, [in] LONG y);
};

ClickIn メソッドと ClickOut メソッドは、クリックされた点の x 座標と y 座標をパラメーターとして設定します。

タイプ ライブラリの生成

この時点で、コントロールのコネクション ポイント インターフェイスとコネクション ポイント コンテナー インターフェイスを生成するために必要な情報を取得するために、接続ポイントの実装ウィザードが使用するタイプ ライブラリを生成します。

タイプ ライブラリを生成するには

  1. プロジェクトをビルドし直します。

    または

  2. ソリューション エクスプ ローラーで Polygon.idl ファイルを右クリックし、コンパイルショートカット メニューの。

これで、タイプ ライブラリ ファイル Polygon.tlb が作成されます。 Polygon.tlb ファイルはソリューション エクスプローラーでは参照できません。このファイルはバイナリ ファイルであるため、直接表示したり編集したりできません。

コネクション ポイント インターフェイスの実装

コントロールのコネクション ポイント インターフェイスとコネクション ポイント コンテナー インターフェイスを実装します。 COM では、コネクション ポイント機構によってイベントが実装されます。 COM オブジェクトからイベントを受け取るために、コンテナーは、COM オブジェクトが実装するコネクション ポイントにアドバイザリ コネクションを確立します。 COM オブジェクトが複数のコネクション ポイントを持つことがあります。このため、COM オブジェクトは、コネクション ポイント コンテナー インターフェイスも実装します。 コネクション ポイント コンテナー インターフェイスを通して、コンテナーはどのコネクション ポイントがサポートされているかを判別できます。

接続ポイントを実装するインターフェイスと呼ばれるIConnectionPoint、および接続ポイント コンテナーを実装するインターフェイスと呼ばれるIConnectionPointContainer

実装するにIConnectionPoint、接続ポイントの実装ウィザードを使用します。 このウィザード生成、IConnectionPointは、タイプ ライブラリを読み取り、解雇されることができる各イベントの関数を実装するインターフェイス。

接続ポイントの実装ウィザードを使用するには

  1. [クラス ビュー] で、コントロールの実装クラスである CPolyCtl を右クリックします。

  2. ショートカット メニューのをクリックします追加、し 接続ポイントの追加

  3. 選択**_IPolyCtlEventsから、ソース インターフェイスリストし、を追加するをダブルクリック、実装するコネクション ポイント列。 [完了] をクリックします。 プロキシ クラスの接続ポイントをこの場合は、生成されますCProxy_IPolyCtlEvents**。

生成した _IPolyCtlEvents_CP.h ファイルをソリューション エクスプローラーで表示すると、CProxy_IPolyCtlEvents という IConnectionPointImpl の派生クラスがあるのがわかります。 _IPolyCtlEvents_CP.h 2 つのメソッドを定義しますFire_ClickInFire_ClickOutは、2 つの座標のパラメーターを取る。 コントロールからイベントを発生させるときは、これらのメソッドを呼び出します。

ウィザードは、コントロールの多重継承リストに CProxy_PolyEventsIConnectionPointContainerImpl も追加しています。 また公開ウィザードIConnectionPointContainerの COM マップに適切なエントリを追加します。

これで、イベントをサポートするコードの実装は完了です。 次に、適切な時点でイベントを発生させるコードを追加します。 ClickIn イベントまたは ClickOut イベントを発生させるのは、ユーザーがコントロールの中でマウスの左ボタンをクリックしたときです。 ユーザーがボタンをクリックしたことを検出するには、WM_LBUTTONDOWN メッセージのハンドラーを追加します。

WM_LBUTTONDOWN メッセージのハンドラーを追加するには

  1. [クラス ビュー] で CPolyCtl クラスを右クリックし、ショートカット メニューの [プロパティ] をクリックします。

  2. [プロパティ] ウィンドウで、[メッセージ] アイコンをクリックし、左側のリストの [WM_LBUTTONDOWN] をクリックします。

  3. 表示されるドロップダウン リストからクリックします**<Add> OnLButtonDown**。 OnLButtonDown ハンドラーの宣言が PolyCtl.h に追加され、ハンドラーの実装が PolyCtl.cpp に追加されます。

次に、ハンドラーを変更します。

OnLButtonDown メソッドを変更するには

  • PolyCtl.cpp の OnLButtonDown メソッドを構成しているコードを次のように変更します。ウィザードによって挿入されたコードはすべて削除してください。

    LRESULT CPolyCtl::OnLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, 
       BOOL& /*bHandled*/)
    {
       HRGN hRgn;
       WORD xPos = LOWORD(lParam);  // horizontal position of cursor
       WORD yPos = HIWORD(lParam);  // vertical position of cursor
    
       CalcPoints(m_rcPos);
    
       // Create a region from our list of points
       hRgn = CreatePolygonRgn(&m_arrPoint[0], m_nSides, WINDING);
    
       // If the clicked point is in our polygon then fire the ClickIn
       //  event otherwise we fire the ClickOut event
       if (PtInRegion(hRgn, xPos, yPos))
          Fire_ClickIn(xPos, yPos);
       else
          Fire_ClickOut(xPos, yPos);
    
       // Delete the region that we created
       DeleteObject(hRgn);
       return 0;
    }
    

このコードは、OnDraw 関数で計算された点を利用して、PtInRegion の呼び出しによりユーザーのマウス クリックを検出する領域を作成します。

パラメーター uMsg は、処理する Windows メッセージの ID です。 このパラメーターを使用すると、1 つの関数で一定の範囲のメッセージを処理できます。 wParam パラメーターと lParam パラメーターは、処理するメッセージの標準値です。 パラメーター bHandled では、関数が処理するかを指定できます。 既定では、関数がメッセージを処理することを示す TRUE が設定されていますが、この値を FALSE に設定することもできます。 FALSE に設定すると、ATL はメッセージの送信先となる他のメッセージ ハンドラー関数を探します。

コントロールのビルドと動作確認

ここで、イベントの動作を確認してみます。 コントロールをビルドし、再度 ActiveX コントロール テスト コンテナーを起動します。 今回はイベント ログ ウィンドウを表示します。 イベントを出力ウィンドウに送るには、[オプション] メニューの [ログの記録] をクリックし、[出力ウィンドウにログを記録] をクリックします。 コントロールを挿入し、ウィンドウ内をクリックしてみます。 塗りつぶした多角形の中でクリックすると ClickIn が発生し、外でクリックすると ClickOut が発生するのがわかります。

次の手順では、プロパティ ページを追加します。

手順 4 に戻る | 手順 6 に進む

参照

参照

ATL チュートリアル: Web ページ内の ActiveX コントロール

履歴の変更

日付

History

理由

2011 年 1 月

精度を更新します。

カスタマー フィードバック