手順 5: イベントの追加
この手順では、ATL コントロールに ClickIn と ClickOut のイベントを追加します。ユーザーが外側をクリックするとユーザーが多角形と発生 ClickOut 内でクリックすると ClickIn のイベントを発生させます。イベントの追加タスクは次のとおりです。:
ClickIn と ClickOut メソッドの追加
タイプ ライブラリの生成
コネクション ポイント インターフェイスの実装
ClickIn と ClickOut メソッドの追加
手順 2 の ATL コントロールの作成時に、[接続ポイント] のチェック ボックスを選択します。これは Polygon.idl ファイルの _IPolyCtlEvents のインターフェイスを作成しました。ようにアンダースコアがインターフェイスの名前の先頭に注意してください。これは、インターフェイスが内部インターフェイスであることを示す規則です。ユーザー インターフェイスを表示せずには、COM オブジェクトを検索できるプログラムを選択できます。また [接続ポイント] を選択する場合に _IPolyCtlEvents が既定のソース インターフェイスであることを示すために追加 Polygon.idl ファイルに次の行を表示する:
[default, source] dispinterface _IPolyCtlEvents;
ソースの属性は、コントロールが通知ソースであるため、コンテナーは、このインターフェイスことを示します。
これで ClickIn を追加 _IPolyCtlEvents への ClickOut のメソッドは、インターフェイスです。
ClickIn と ClickOut のメソッドを追加するには
クラス ビューで、_IPolyCtlEvents を表示するには、多角形、および PolygonLib を展開します。
_IPolyCtlEvents を右クリックします。ショートカット メニューのをクリック 追加は、を **[メソッドの追加]**をクリックします。
voidの [戻り値の型] を選択します。
[メソッド名] ボックスに ClickIn を入力します。
[パラメーターの属性]の下に、[in] ボックスをオンにします。
LONGの [パラメーターの型] を選択します。
X を **[パラメーター名]**として 追加入力し、をクリックします。
手順 5 ~ 7、y.の [パラメーター名] の今度は) を繰り返します。
[次へ] をクリックします。
helpstringとして型 method ClickIn。
をクリック [完了]。
LONG のパラメーターと同じ xy、同じ [パラメーターの属性] の ClickOut のメソッドと同じ void の戻り値の型定義するには、上で説明した手順を繰り返します。
コードが _IPolyCtlEvents ディスパッチ インターフェイスに追加されたことを Polygon.idl ファイルを確認します。
自分の 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 座標を受け取ります。
タイプ ライブラリの生成
コントロール用のコネクション ポイント インターフェイス、コネクション ポイント コンテナーのインターフェイスを作成する必要がある情報を取得するには、コネクション ポイント ウィザードが使用するため、この時点でタイプ ライブラリを生成します。
タイプ ライブラリを生成します。
プロジェクトをリビルドします。
または
ソリューション エクスプローラーで Polygon.idl ファイルを右クリックし、ショートカット メニューの [コンパイル] をクリックします。
これにより、タイプ ライブラリである Polygon.tlb ファイルを作成します。Polygon.tlb のファイルがバイナリ ファイルに直接表示または編集できないため、ソリューション エクスプローラーからは参照できません。
コネクション ポイント インターフェイスの実装
コントロール用のコネクション ポイント インターフェイス、コネクション ポイント コンテナーのインターフェイスを実装します。COM では、イベントはコネクション ポイント機構を使用します。COM オブジェクトからのイベントを受け取るには、コンテナーは、コネクション ポイントへのアドバイザリ コネクションを COM オブジェクトがを実装する確立します。COM オブジェクトは、複数のコネクション ポイントを持つことができるため、COM オブジェクトに、コネクション ポイント コンテナーのインターフェイスを実装します。このインターフェイスから、コンテナーは、コネクション ポイントがサポートされているかを判断できます。
コネクション ポイントを実装するインターフェイスは IConnectionPoint、コネクション ポイント コンテナーを実装するインターフェイスと呼びます IConnectionPointContainerと呼ばれます。
IConnectionPointを実装するために、接続ポイントの実装ウィザードを使用します。このウィザードでは、のタイプ ライブラリを読み込み、起動できる各イベントの関数を実行して IConnectionPoint のインターフェイスを生成します。
接続ポイントの実装ウィザードを使用するには
クラス ビューで、コントロールの実装クラス CPolyCtlを右クリックします。
ショートカット メニューのをクリック 追加は、を **[接続ポイントの追加]**をクリックします。
[ソース インターフェイス] の一覧から _IPolyCtlEvents を選択し、[接続ポイントの実装] の列に列を追加するには、をダブルクリックします。をクリック [完了]。コネクション ポイントのプロキシ クラスは、この場合、CProxy_IPolyCtlEvents生成されます。
ソリューション エクスプローラーで生成された_IPolyCtlEvents_CP.h のファイルを見ると、CProxy_IPolyCtlEvents という IConnectionPointImplから派生するクラスがあることが示されます。_IPolyCtlEvents_CP.h は、2 種類の座標のパラメーターを受け取る 2 とおりの方法 Fire_ClickIn と Fire_ClickOutを定義します。作成したコントロールからのイベントを発生させますするときにこれらのメソッドを呼び出します。
ウィザードは、コントロールの多重継承の一覧に CProxy_PolyEvents と IConnectionPointContainerImpl を追加。ウィザードは、COM マップに該当するエントリを追加して、の IConnectionPointContainer を発行します。
終了します。イベントをサポートするコードを実装します。次に、必要なときにイベントを発生させるコードを追加します。ユーザーがコントロールのマウスの左ボタンをクリックすると、ClickIn または ClickOut のイベントを発生させる実行する注意してください。ユーザーがボタンをクリックすると確認するには、WM_LBUTTONDOWN のメッセージのハンドラーを追加します。
WM_LBUTTONDOWN のメッセージのハンドラーを追加します。
クラス ビューで、CPolyCtl のクラスを右クリックし、ショートカット メニューの プロパティ をクリックします。
プロパティ のペインで、[メッセージ] のアイコンをクリックし、左の一覧から WM_LBUTTONDOWN をクリックします。
ドロップダウン リストのをクリック <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; }
このコードは PtInRegionを呼び出して、ユーザーのマウス クリックが検出される領域を作成するに OnDraw 関数で計算されるポイントを使用します。
uMsg のパラメーターで、Windows メッセージの ID です。これは、メッセージの範囲を処理する 1 とおりの関数を持つことができます。wParam と lParam のパラメーターで、メッセージの標準値です。bHandled パラメーターは、関数からメッセージが処理されたかどうかを指定することができます。既定では、値は TRUE に関数がメッセージを処理した、FALSEにコントロールを配置できることを示すようにに設定されます。これにより、ATL はメッセージを送信する別のメッセージ ハンドラー関数を検索します。
コントロールのビルドとテスト
これはイベントをテストします。コントロールをビルドして ActiveX コントロール テスト コンテナーを再起動します。今度は、イベント ログ ウィンドウを表示します。出力ウィンドウにイベントをルーティングするには、オプション のメニューの [ログ記録] をクリックし、**[ログ出力]ウィンドウ]**を選択します。ウィンドウでをクリックすると、コントロールを挿入します。ツールボックスの外部をクリックすると塗りつぶされた多角形内でクリックした場合は、ClickOut が発生します ClickIn が発生することに注意してください。
次に、プロパティ ページを追加します。