MFC ActiveX コントロール : アンビエント プロパティへのアクセス
この記事では、ActiveX コントロールがそのコントロール コンテナーのアンビエント プロパティにアクセスする方法について説明します。
コントロールがそのコンテナーに関する情報を取得するには、コンテナーのアンビエント プロパティにアクセスします。 これらのプロパティによって視覚的特性、たとえばコンテナーの背景色、コンテナーで使用されている現在のフォント、操作上の特性 (コンテナーが現在ユーザー モードかデザイナー モードかなど) が公開されます。 コントロールはアンビエント プロパティを使用して、自身の外観と動作を、自身が埋め込まれている特定のコンテナーに合わせて調整できます。 ただし、コントロールは、そのコンテナーが特定のすべてのアンビエント プロパティをサポートすることを想定してはいけません。 実際、コンテナーによっては、アンビエント プロパティにまったく対応していないこともあります。 アンビエント プロパティがない場合、コントロールは妥当な既定値を想定する必要があります。
アンビエント プロパティにアクセスするには、COleControl::GetAmbientProperty を呼び出します。 この関数は、アンビエント プロパティのディスパッチ ID を、最初のパラメーターとして想定します (OLECTL.H ファイルでは、アンビエント プロパティの標準セットに対してディスパッチ ID が定義されます)。
GetAmbientProperty
関数のパラメーターは、ディスパッチID、想定されるプロパティ型を示すバリアント タグ、値が返されるメモリへのポインターです。 このポインターが参照するデータ型は、バリアント タグによって異なります。 関数は、コンテナーがそのプロパティをサポートしている場合は TRUE、それ以外の場合は FALSE を返します。
次のコード例では、"UserMode" と呼ばれるアンビエント プロパティの値を取得します。プロパティがコンテナーでサポートされていない場合、既定値は TRUE と見なされます。
BOOL bUserMode;
if (!GetAmbientProperty(DISPID_AMBIENT_USERMODE, VT_BOOL, &bUserMode))
bUserMode = TRUE;
ここでは、COleControl
には、一般的に使用される多くのアンビエント プロパティにアクセスし、プロパティが使用できない場合は適切な既定値を返すヘルパー関数が用意されています。 これらのヘルパー関数を次に示します。
-
Note
呼び出し元は、返されたフォントで
Release( )
を呼び出す必要があります。
(コンテナーのアクションによって) アンビエント プロパティの値が変更された場合は、コントロールの OnAmbientPropertyChanged
メンバー関数が呼び出されます。 このような通知を処理するには、このメンバー関数をオーバーライドします。 OnAmbientPropertyChanged
のパラメーターは、影響を受けるアンビエント プロパティのディスパッチ ID です。 このディスパッチ ID の値が DISPID_UNKNOWN の場合がありますが、これは 1 つ以上のアンビエント プロパティが変更されたが、どのプロパティが影響を受けたかに関する情報が使用できないことを示します。