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

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

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

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

  • メンバー変数実装

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

  • メンバー変数と通知実装

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

  • get および set メソッド実装

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

  • パラメーター化実装

    パラメーター化実装は、プロパティの追加ウィザードでサポートされています。 パラメーター化されたプロパティ (プロパティ配列と呼ばれることもあります) を使用すると、コントロールの単一のプロパティを介して値のセットにアクセスできます。 この実装のディスパッチ マップ エントリ マクロは 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;

この行では、プロパティの追加ウィザードのメソッドとプロパティの一覧でのメソッドの位置から取得した特定の ID 番号を CircleOffset プロパティに割り当てます。

さらに、CircleOffset プロパティをコントロールの 2 つのハンドラー関数にマップするために、次の行がディスパッチ マップ (コントロール クラスの .CPP ファイル内) に追加されます。

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();
}

プロパティの追加ウィザードでは Set 関数の本体に SetModifiedFlag への呼び出しが自動的に追加されることに注意してください。 この関数を呼び出すと、コントロールが変更済みとしてマークされます。 コントロールが変更されている場合、その新しい状態はコンテナーが保存されるときに保存されます。 この関数は、コントロールの永続的な状態の一部として保存されたプロパティの値が変更されるたびに呼び出す必要があります。

関連項目

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