MFC ActiveX コントロール : カスタム メソッドの追加
更新 : 2007 年 11 月
カスタム メソッドは、COleControl によって実装されていないという点で、ストック メソッドとは異なります。コントロールに追加するカスタム メソッドごとに、実装を提供する必要があります。
ActiveX コントロールのユーザーは、いつでもカスタム メソッドを呼び出して、コントロールに固有の動作を実行させることができます。カスタム メソッドのディスパッチ マップ エントリは、DISP_FUNCTION という形式です。
メソッド追加 ウィザードによるカスタム メソッドの追加
次の手順では、カスタム メソッド PtInCircle を ActiveX コントロールのスケルトン コードに追加します。PtInCircle は、コントロールに渡された座標が円の内側か外側かを判定します。この手順は、ほかのカスタム メソッドを追加するときにも使用できます。その場合は、PtInCircle のメソッド名とパラメータを目的のカスタム メソッドの名前とパラメータに置き換えます。
メモ : |
---|
この例では、カスタム イベントの追加についてのトピックで説明した InCircle 関数を使用します。この関数の詳細については、「MFC ActiveX コントロール : カスタム イベントの追加」を参照してください。 |
メソッド追加 ウィザードを使って PtInCircle カスタム メソッドを追加するには
コントロールのプロジェクトを読み込みます。
[クラス ビュー] ウィンドウで、コントロールのライブラリ ノードを展開します。
コントロールのインターフェイス ノード (ライブラリ ノードの 2 番目のノード) を右クリックし、ショートカット メニューを開きます。
ショートカット メニューの [追加] をクリックし、[メソッドの追加] をクリックします。
メソッド追加 ウィザードが開きます。
[メソッド名] ボックスに「PtInCircle」と入力します。
[内部名] ボックスに、メソッドの内部関数の名前を入力するか、または既定値 (この場合は PtInCircle) を使用します。
メソッドの戻り値の型として、[戻り値の型] ボックスの [VARIANT_BOOL] をクリックします。
[パラメータの型] コントロールと [パラメータ名] コントロールを使って、xCoord というパラメータ (OLE_XPOS_PIXELS 型) を追加します。
[パラメータの型] コントロールと [パラメータ名] コントロールを使って、yCoord というパラメータ (OLE_YPOS_PIXELS 型) を追加します。
[完了] をクリックします。
カスタム メソッドの追加に伴うメソッド追加 ウィザードによる変更
カスタム メソッドを追加すると、メソッド追加 ウィザードによって、コントロール クラスのヘッダー (.H) ファイルと実装 (.CPP) ファイルが一部変更されます。コントロール クラスのヘッダー (.H) ファイル内のディスパッチ マップ宣言に、次の行が追加されます。
VARIANT_BOOL PtInCircle(OLE_XPOS_PIXELS xCoord, OLE_YPOS_PIXELS yCoord);
このコードは、PtInCircle というディスパッチ メソッド ハンドラを宣言しています。コントロールのユーザーは、外部名 PtInCircle を使ってこの関数を呼び出すことができます。
コントロールの .IDL ファイルには、次の行が追加されます。
[id(1), helpstring("method PtInCircle")] VARIANT_BOOL PtInCircle(OLE_XPOS_PIXELS xCoord, OLE_YPOS_PIXELS yCoord);
この行は、PtInCircle メソッドに固有の ID 番号を割り当てます。この ID 番号は、メソッド追加 ウィザードのメソッドとプロパティのリストにおけるこのメソッドの位置を表します。メソッド追加 ウィザードを使ってカスタム メソッドを追加したため、プロジェクトの .IDL ファイルにメソッドのエントリが自動的に追加されます。
また、コントロール クラスの実装 (.CPP) ファイル内にあるコントロールのディスパッチ マップに、次の行が追加されます。
DISP_FUNCTION_ID(CMyAxUICtrl, "PtInCircle", dispidPtInCircle, PtInCircle, VT_BOOL, VTS_XPOS_PIXELS VTS_YPOS_PIXELS)
DISP_FUNCTION マクロは、メソッド PtInCircle をコントロールのハンドラ関数 PtInCircle に割り当て、戻り値の型として VARIANT_BOOL を宣言します。また、PtInCircle に渡す VTS_XPOS_PIXELS 型と VTS_YPOSPIXELS 型の 2 つのパラメータを宣言します。
最後に、メソッド追加 ウィザードによって、スタブ関数 CSampleCtrl::PtInCircle がコントロールの実装 (.CPP) ファイルの末尾に追加されます。PtInCircle を上述のとおりに機能させるには、次のように変更する必要があります。
VARIANT_BOOL CMyAxUICtrl::PtInCircle(OLE_XPOS_PIXELS xCoord, OLE_YPOS_PIXELS yCoord)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CPoint point(xCoord, yCoord);
return InCircle(point);
}