次の方法で共有


手順 5: イベントの追加

更新 : 2007 年 11 月

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

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

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

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

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

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

[default, source] dispinterface _IPolyCtlEvents;

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

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

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

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

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

  3. [戻り値の型] で void を選択します。

  4. [メソッド名] ボックスに「ClickIn」と入力します。

  5. [パラメータの属性] の下にある [in] ボックスをオンにします。

  6. [LONG] の [パラメータの一覧] を選択します。

  7. [パラメータ名] として「x」を入力し、[追加] をクリックします。

  8. 手順 5. ~ 7. を繰り返し、今度は [パラメータ名] に「y」を指定します。

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

  10. 上の手順を繰り返して、同じ LONG パラメータの x および y、[パラメータの属性]、および戻り型 void を持つ ClickOut メソッドを定義します。

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 には、Fire_ClickIn および Fire_ClickOut という 2 つのメソッドが定義されており、それぞれ 2 つの座標パラメータを使用します。コントロールからイベントを発生させるときは、これらのメソッドを呼び出します。

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

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

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

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

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

  3. 表示されるドロップダウン リストの [<追加> 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 チュートリアル