次の方法で共有


MFC ActiveX コントロール: カスタム プロパティの追加

カスタム プロパティは、 COleControl クラスによってカスタム プロパティがまだ実装されていないという点でストック プロパティとは異なります。 カスタム プロパティは、ActiveX コントロールの特定の状態または外観を、コントロールを使用してプログラマに公開するために使用されます。

この記事では、プロパティの追加ウィザードを使用して ActiveX コントロールにカスタム プロパティを追加する方法について説明し、結果のコード変更について説明します。 ここでは、次の内容について説明します。

カスタム プロパティには、メンバー変数、通知付きのメンバー変数、Get/Set メソッド、およびパラメーター化の 4 種類の実装があります。

  • メンバー変数の実装

    この実装は、コントロール クラスのメンバー変数としてプロパティの状態を表します。 プロパティ値がいつ変更されるかを把握することが重要でない場合は、メンバー変数の実装を使用します。 この実装では、3 種類のうち、プロパティのサポート コードの量が最も少ないものを作成します。 メンバー変数実装のディスパッチ マップ エントリ マクロが DISP_PROPERTY

  • 通知の実装を含むメンバー変数

    この実装は、プロパティの追加ウィザードによって作成されたメンバー変数と通知関数で構成されます。 通知関数は、プロパティ値が変更された後、フレームワークによって自動的に呼び出されます。 プロパティ値が変更された後に通知を受け取る必要がある場合は、Notification 実装でメンバー変数を使用します。 この実装では、関数呼び出しが必要なため、より多くの時間が必要です。 この実装のディスパッチ マップ エントリ マクロは DISP_PROPERTY_NOTIFY

  • Get/Set メソッドの実装

    この実装は、コントロール クラスのメンバー関数のペアで構成されます。 Get/Set メソッドの実装は、コントロールのユーザーがプロパティの現在の値を要求したときに Get メンバー関数を自動的に呼び出し、コントロールのユーザーがプロパティの変更を要求したときに Set メンバー関数を呼び出します。 実行時にプロパティの値を計算する必要がある場合、実際のプロパティを変更する前にコントロールのユーザーが渡した値を検証する場合、または読み取り専用または書き込み専用のプロパティ型を実装する必要がある場合は、この実装を使用します。 この実装のディスパッチ マップ エントリ マクロは DISP_PROPERTY_EX。 次のセクションでは、 プロパティの追加ウィザードを使用してカスタム プロパティを追加し、CircleOffset カスタム プロパティを使用してこの実装を示します。

  • パラメーター化された実装

    パラメーター化された実装は、プロパティの追加ウィザードでサポートされています。 パラメーター化されたプロパティ (プロパティ配列とも呼ばれます) を使用して、コントロールの 1 つのプロパティを介して値のセットにアクセスできます。 この実装のディスパッチ マップ エントリ マクロはDISP_PROPERTY_PARAM。 この型の実装の詳細については、「ActiveX コントロール: 高度なトピック」の 「パラメーター化されたプロパティの実装 」を参照してください。

プロパティの追加ウィザードを使用してカスタム プロパティを追加する

次の手順では、Get/Set メソッドの実装を使用するカスタム プロパティ CircleOffset を追加する方法を示します。 CircleOffset カスタム プロパティを使用すると、コントロールのユーザーは、コントロールの外接する四角形の中心から円をオフセットできます。 Get/Set メソッド以外の実装でカスタム プロパティを追加する手順は非常によく似ています。

この同じ手順を使用して、必要な他のカスタム プロパティを追加することもできます。 CircleOffset プロパティ名とパラメーターにカスタム プロパティ名を置き換えます。

プロパティの追加ウィザードを使用して CircleOffset カスタム プロパティを追加するには

  1. コントロールのプロジェクトを読み込みます。

  2. クラス ビューで、コントロールのライブラリ ノードを展開します。

  3. コントロールのインターフェイス ノード (ライブラリ ノードの 2 番目のノード) を右クリックして、ショートカット メニューを開きます。

  4. ショートカット メニューの [ 追加 ] をクリックし、[ プロパティの追加] をクリックします。

    プロパティの追加ウィザードが開きます。

  5. [ プロパティ名] ボックスに「 CircleOffset」と入力します。

  6. [実装の種類] で、[Get/Set メソッド] をクリックします。

  7. [ プロパティの種類 ] ボックスで、 shortを選択します。

  8. Get 関数と Set 関数の一意の名前を入力するか、既定の名前をそのまま使用します。

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

カスタム プロパティのプロパティの追加ウィザードの変更

CircleOffset カスタム プロパティを追加すると、プロパティの追加ウィザードによってヘッダー (.H) と実装 (.CPP) コントロール クラスのファイル。

次の行が . GetCircleOffsetSetCircleOffsetと呼ばれる 2 つの関数を宣言する H ファイル:

SHORT GetCircleOffset(void);
void SetCircleOffset(SHORT newVal);

次の行がコントロールに追加されます。IDL ファイル:

[id(2), helpstring("property CircleOffset")] SHORT CircleOffset;
[id(3), helpstring("property MyProperty")] SHORT MyProperty;

この行は、CircleOffset プロパティに特定の 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 関数の本体に自動的に追加されることに注意してください。 この関数を呼び出すと、コントロールが変更済みとしてマークされます。 コントロールが変更された場合、コンテナーの保存時に新しい状態が保存されます。 この関数は、コントロールの永続的な状態の一部として保存されたプロパティが値を変更するたびに呼び出す必要があります。

こちらも参照ください

MFC ActiveX コントロール
MFC ActiveX コントロール: プロパティ
MFC ActiveX コントロール: メソッド
COleControl クラス