次の方法で共有


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 を追加するには、コントロール実装ファイル内 (.CPP) の BEGIN_PROPPAGEIDS マクロの後に次の行を挿入します。

PROPPAGEID(CLSID_CPicturePropPage)

また、BEGIN_PROPPAGEIDS マクロのカウント パラメーターの値を 1 つ増やす必要があります。 次の行に例を示します。

BEGIN_PROPPAGEIDS(CMyAxPicCtrl, 2)

コントロール クラスに CPictureHolder データ メンバーを追加するには、コントロール ヘッダー ファイル (.H) にあるコントロール クラス宣言の protected セクションの下に次の行を挿入します。

CPictureHolder    m_pic;

データ メンバー m_picに名前を付ける必要はありません。任意の名前で十分です。

次に、Picture 型をサポートするカスタム プロパティを追加します。

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

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

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

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

  4. ショートカット メニューから、 [追加][プロパティの追加]の順に選びます。

  5. [プロパティ名] ボックスに、プロパティ名を入力します。 例として、この手順では ControlPicture を使用します。

  6. [プロパティの種類] ボックスで、プロパティの種類として [IPictureDisp]* を選択します。

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

  8. Get 関数と Set 関数に一意の名前を入力するか、既定の名前をそのまま使用します。 (この例では、既定の名前である GetControlPictureSetControlPicture を使用します)。

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

プロパティ追加ウィザードにより、コントロール ヘッダー ファイル (.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 関数で、これらはコントロール実装ファイル内にあります。 (この例では、コントロール クラスは CSampleCtrlCPictureHolder データ メンバーは 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 コントロール: プロパティ ページ