MFC ActiveX コントロール : カスタム プロパティの追加
更新 : 2007 年 11 月
カスタム プロパティは、COleControl クラスによって実装されていないという点で、ストック プロパティとは異なります。カスタム プロパティを使うと、コントロールを使用するプログラマに ActiveX コントロールの特定の状態や外観を公開できます。
ここでは、プロパティ追加 ウィザードを使って ActiveX コントロールにカスタム プロパティを追加する方法と、それに伴うコードの変更について説明します。ここでは、次の内容について説明します。
プロパティ追加ウィザードによるカスタム プロパティの追加
カスタム プロパティの追加に伴うプロパティ追加ウィザードによる変更
カスタム プロパティの実装には、メンバ変数、通知付きのメンバ変数、Get/Set メソッド、およびパラメータ化されたプロパティの 4 種類があります。
メンバ変数
プロパティの状態をコントロール クラスのメンバ変数として表します。プロパティ値が変更されたときの通知が特に必要ない場合は、この実装を使用します。4 種類の実装のうち、プロパティのサポート コードが最も少なくなります。この実装のディスパッチ マップ エントリ マクロは、DISP_PROPERTY です。
通知付きのメンバ変数
メンバ変数と、プロパティ追加 ウィザードによって作成される通知関数を使用します。通知関数は、プロパティ値が変更されると自動的に呼び出されます。プロパティ値の変更後に通知が必要な場合は、この実装を使用します。関数呼び出しが必要になるため、メンバ変数だけの場合に比べて時間がかかります。この実装のディスパッチ マップ エントリ マクロは、DISP_PROPERTY_NOTIFY です。
Get/Set メソッド
コントロール クラスの 1 組のメンバ関数を使用します。コントロールのユーザーがプロパティの現在の値を要求すると Get メンバ関数が自動的に呼び出され、プロパティの変更を要求すると Set メンバ関数が呼び出されます。実行時にプロパティ値を計算する場合、コントロールのユーザーによって渡された値の妥当性をチェックしてからプロパティを変更する場合、または読み取り専用/書き込み専用のプロパティを実装する場合は、この実装を使用します。この実装のディスパッチ マップ エントリ マクロは、DISP_PROPERTY_EX です。次の「プロパティ追加 ウィザードによるカスタム プロパティの追加」の CircleOffset カスタム プロパティは、この実装を使用しています。
パラメータ化されたプロパティ
プロパティ追加 ウィザードによってサポートされています。パラメータ化されたプロパティ (プロパティ配列とも呼ばれる) を使うと、コントロールの 1 つのプロパティを通じて一連の値にアクセスできます。この実装のディスパッチ マップ エントリ マクロは、DISP_PROPERTY_PARAM です。実装方法の詳細については、「MFC ActiveX コントロール : 高度なトピック」の「パラメータ化したプロパティの実装」を参照してください。
プロパティ追加 ウィザードによるカスタム プロパティの追加
次の手順では、カスタム プロパティ CircleOffset を追加します。CircleOffset は、Get/Set メソッドを使って実装します。CircleOffset カスタム プロパティを追加すると、コントロールのユーザーが、コントロールの外接する四角形の中心から円をオフセットできるようになります。Get/Set メソッド以外の方法によって実装するカスタム プロパティも、ほとんど同じ手順で追加できます。
この手順は、ほかのカスタム プロパティを追加するときにも使用できます。その場合は、CircleOffset のプロパティ名とパラメータを目的のカスタム プロパティの名前とパラメータに置き換えます。
プロパティ追加 ウィザードを使って CircleOffset カスタム プロパティを追加するには
コントロールのプロジェクトを読み込みます。
[クラス ビュー] ウィンドウで、コントロールのライブラリ ノードを展開します。
コントロールのインターフェイス ノード (ライブラリ ノードの 2 番目のノード) を右クリックし、ショートカット メニューを開きます。
ショートカット メニューの [追加] をクリックし、[プロパティの追加] をクリックします。
これにより、プロパティ追加 ウィザードが開きます。
[プロパティ名] ボックスに「CircleOffset」と入力します。
実装の種類として、[Get/Set メソッド] をクリックします。
[プロパティの種類] ボックスで、[SHORT] を選択します。
Get 関数と Set 関数に一意の名前を付けるか、既定の名前をそのまま使用します。
[完了] をクリックします。
カスタム プロパティの追加に伴うプロパティ追加 ウィザードによる変更
CircleOffset カスタム プロパティを追加すると、プロパティ追加 ウィザードによって、コントロール クラスのヘッダー (.H) ファイルと実装 (.CPP) ファイルが変更されます。
.H ファイルには、GetCircleOffset と SetCircleOffset の 2 つの関数を宣言する次の行が追加されます。
SHORT GetCircleOffset(void);
void SetCircleOffset(SHORT newVal);
コントロールの .IDL ファイルには、次の行が追加されます。
[id(2), helpstring("property CircleOffset")] SHORT CircleOffset;
[id(3), helpstring("property MyProperty")] SHORT MyProperty;
この行により、CircleOffset プロパティに固有の ID 番号が割り当てられます。この ID 番号は、プロパティ追加 ウィザードのメソッドとプロパティのリストにおけるこのプロパティの位置に対応します。
さらに、コントロール クラスの .CPP ファイル内のディスパッチ マップに次の行が追加されます。この行は、CircleOffset プロパティをコントロールの 2 つのハンドラ関数に割り当てます。
DISP_PROPERTY_EX_ID(CMyAxUICtrl, "CircleOffset", dispidCircleOffset, GetCircleOffset, SetCircleOffset, VT_I2)
最後に、GetCircleOffset 関数と SetCircleOffset 関数の実装が、コントロールの .CPP ファイルの末尾に追加されます。ほとんどの場合は、プロパティの値を返すように Get 関数を変更します。Set 関数には、通常、プロパティの変更前または変更後に実行されるコードが入ります。
void CMyAxUICtrl::SetCircleOffset(SHORT /*newVal*/)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: Add your property handler code here
SetModifiedFlag();
}
プロパティ追加 ウィザードによって、SetModifiedFlag の呼び出しが Set 関数の本体に自動的に追加されます。この関数を呼び出すと、コントロールは変更されたものとして認識されます。コントロールが変更された場合は、コンテナが保存されるときに新しい状態が保存されます。この関数は、コントロールの永続的な状態の一部として保存されているプロパティの値が変更されるたびに呼び出されます。