MFC ActiveX コントロール: ActiveX コントロールにおけるピクチャの使用
この記事では、ActiveX コントロールに共通する Picture 型と、その実装方法を説明します。 ここでは、次の内容について説明します。
カスタム Picture プロパティの概要
Picture 型は、いくつかの ActiveX コントロールに共通な型のグループの 1 つです。 Picture 型は、メタファイル、ビットマップ、またはアイコンを処理して、ユーザーが ActiveX コントロールに表示される画像を指定できるようにします。 カスタム Picture プロパティは、画像オブジェクトと Get/Set 関数を使用して実装されます。これらの関数により、コントロール ユーザーは Picture プロパティにアクセスできます。 コントロール ユーザーは、ストック Picture プロパティ ページを使用してカスタム Picture プロパティにアクセスします。
標準の Picture 型のほかに、Font 型と Color 型も使用できます。 ActiveX コントロールで標準の Font 型を使用する方法について詳しくは、「 MFC ActiveX コントロール: フォントの使用」をご覧ください。
ActiveX コントロール クラスには、コントロール内に Picture プロパティを実装するために使用できるコンポーネントがいくつか用意されています。 コンポーネントには、以下のものがあります。
CPictureHolder クラス。
このクラスは、画像オブジェクトへのアクセスを容易にするほか、カスタム Picture プロパティで表示されるアイテム用の機能を提供します。
Get/Set 関数を使用して実装される LPPICTUREDISP型のプロパティのサポート。
クラス ビューを使うと、Picture 型をサポートするカスタム プロパティを簡単に追加できます。 クラス ビューを使用して ActiveX コントロールのプロパティを追加する方法について詳しくは、「 MFC ActiveX コントロール: プロパティ」をご覧ください。
コントロールの Picture プロパティを操作するプロパティ ページ。
このプロパティ ページは、ActiveX コントロールで使用できる一連のストック プロパティ ページの 1 つです。 ActiveX コントロールのプロパティ ページについて詳しくは、「 MFC ActiveX コントロール: ストック プロパティ ページの使用」をご覧ください。
ActiveX コントロールでのカスタム Picture プロパティの実装
このセクションで説明する手順を完了すると、ユーザーが選択した画像をコントロールで表示できるようになります。 ユーザーは、現在の画像を表示しているプロパティ ページを使用して、表示される画像を変更できます。そのページにある [参照] ボタンを使うと、ユーザーは別の画像を選べます。
カスタム Picture プロパティを実装する際の手順は、その他のプロパティを実装する場合とほぼ同様です。主な違いとして、このカスタム プロパティは Picture 型をサポートする必要があります。 Picture プロパティのアイテムは ActiveX コントロールで描画する必要があるため、完全に実装するには、プロパティに多くの追加や変更を行う必要があります。
カスタム Picture プロパティを実装するには、次の操作を行う必要があります。
-
標準の Picture プロパティ ページ ID、
CPictureHolder
型のデータ メンバー、Get/Set 実装を持つ LPPICTUREDISP 型のカスタム プロパティを追加する必要があります。 -
ActiveX コントロールの描画に使用するいくつかの関数を変更します。
コントロール プロジェクトへの追加
標準の Picture プロパティ ページのプロパティ ページ ID を追加するには、コントロール実装ファイル内 (.CPP) の BEGIN_PROPPAGEIDS マクロの後に次の行を挿入します。
PROPPAGEID(CLSID_CPicturePropPage)
また、BEGIN_PROPPAGEIDS マクロのカウント パラメーターの値を 1 つ増やす必要があります。 次の行に例を示します。
BEGIN_PROPPAGEIDS(CMyAxPicCtrl, 2)
コントロール クラスに CPictureHolder
データ メンバーを追加するには、コントロール ヘッダー ファイル (.H) にあるコントロール クラス宣言の protected セクションの下に次の行を挿入します。
CPictureHolder m_pic;
データ メンバー m_picに名前を付ける必要はありません。任意の名前で十分です。
次に、Picture 型をサポートするカスタム プロパティを追加します。
プロパティ追加ウィザードを使用してカスタム Picture プロパティを追加するには
コントロールのプロジェクトを読み込みます。
[クラス ビュー] で、コントロールのライブラリ ノードを展開します。
コントロールのインターフェイス ノード (ライブラリ ノードの 2 番目のノード) を右クリックし、ショートカット メニューを開きます。
ショートカット メニューから、 [追加] 、 [プロパティの追加]の順に選びます。
[プロパティ名] ボックスに、プロパティ名を入力します。 例として、この手順では
ControlPicture
を使用します。[プロパティの種類] ボックスで、プロパティの種類として [IPictureDisp]* を選択します。
[実装の種類] として、[Get/Set メソッド] をクリックします。
Get 関数と Set 関数に一意の名前を入力するか、既定の名前をそのまま使用します。 (この例では、既定の名前である
GetControlPicture
とSetControlPicture
を使用します)。[完了] をクリックします。
プロパティ追加ウィザードにより、コントロール ヘッダー ファイル (.H) にあるディスパッチ マップのコメントの間に次のコードが追加されます。
IPictureDisp* GetControlPicture(void);
void SetControlPicture(IPictureDisp* pVal);
また、コントロール実装 (.CPP) ファイルのディスパッチ マップに次のコードが挿入されました。
DISP_PROPERTY_EX_ID(CMyAxPicCtrl, "ControlPicture", dispidControlPicture,
GetControlPicture, SetControlPicture, VT_PICTURE)
さらに、プロパティ追加ウィザードにより、コントロール実装ファイルに次の 2 つのスタブ関数が追加されます。
IPictureDisp* CWizardGenCtrl::GetControlPicture(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: Add your dispatch handler code here
return NULL;
}
void CWizardGenCtrl::SetControlPicture(IPictureDisp* /*pVal*/)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: Add your property handler code here
SetModifiedFlag();
}
Note
コントロールのクラス名と関数名は、上記の例とは異なる場合があります。
コントロール プロジェクトの変更
コントロール プロジェクトに必要なコードを追加した後、ActiveX コントロールの描画に影響するいくつかの関数を変更する必要があります。 変更する必要がある関数は、 OnResetState
関数、 OnDraw
関数、カスタム Picture プロパティの Get/Set 関数で、これらはコントロール実装ファイル内にあります。 (この例では、コントロール クラスは CSampleCtrl
、CPictureHolder
データ メンバーは m_pic、カスタム Picture プロパティ名は ControlPicture
です。)
コントロールの OnResetState
関数で、 COleControl::OnResetState
への呼び出しの後にオプションの行を次のように追加します。
m_pic.CreateEmpty();
m_pic.CreateEmpty();
これにより、コントロールの画像は空白の画像に設定されます。
画像を正しく描画するには、コントロールの 関数で CPictureHolder::Render OnDraw
を呼び出します。 関数を次の例のように変更します。
void CMyAxPicCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& /*rcInvalid*/)
{
if (!pdc)
return;
m_pic.Render(pdc, rcBounds, rcBounds);
}
コントロールのカスタム Picture プロパティの Get 関数に、次の行を追加します。
return m_pic.GetPictureDispatch();
return m_pic.GetPictureDispatch();
コントロールのカスタム Picture プロパティの Set 関数に、次の行を追加します。
m_pic.SetPictureDispatch(pVal);
InvalidateControl();
デザイン時に追加された情報が実行時に反映されるようにするため、画像のプロパティを固定する必要があります。 COleControl
派生クラスの DoPropExchange
関数に次の行を追加します。
PX_Picture(pPX, _T("ControlPicture"), m_pic);
Note
クラス名と関数名は、上記の例とは異なる場合があります。
変更が完了したら、プロジェクトをリビルドして、カスタム Picture プロパティの新しい機能を組み込みます。その後、Test Container を使用して新しいプロパティをテストします。 Test Container にアクセスする方法について詳しくは、「 テスト コンテナーでのプロパティとイベントのテスト 」をご覧ください。
関連項目
MFC ActiveX コントロール
MFC ActiveX コントロール: フォントの使用
MFC ActiveX コントロール: プロパティ ページ