次の方法で共有


MFC ActiveX コントロール: ActiveX コントロールでの画像の使用

この記事では、一般的な画像の種類と、それを ActiveX コントロールに実装する方法について説明します。 ここでは、次の内容について説明します。

カスタム図プロパティの概要

図の種類は、一部の ActiveX コントロールに共通する種類のグループの 1 つです。 Picture 型は、メタファイル、ビットマップ、またはアイコンを処理し、ActiveX コントロールに表示する図を指定できます。 カスタム Picture プロパティは、Picture オブジェクトと、コントロール ユーザーが Picture プロパティにアクセスできるようにする Get/Set 関数を使用して実装されます。 ストック画像プロパティ ページを使用して、ユーザーがカスタム Picture プロパティにアクセスできるようにします。

標準の画像の種類に加えて、フォントと色の種類も使用できます。 ActiveX コントロールで標準のフォントの種類を使用する方法の詳細については、「 MFC ActiveX コントロール: フォントの使用」を参照してください。

ActiveX コントロール クラスには、コントロール内に Picture プロパティを実装するために使用できるコンポーネントがいくつか用意されています。 これらのコンポーネントは次のとおりです。

  • CPictureHolder クラス。

    このクラスを使用すると、カスタム Picture プロパティによって表示される項目の画像オブジェクトと機能に簡単にアクセスできます。

  • Get/Set 関数で実装される LPPICTUREDISP 型のプロパティのサポート。

    クラス ビューを使用すると、Picture 型をサポートするカスタム プロパティ (プロパティ) をすばやく追加できます。 クラス ビューを使用して ActiveX コントロールのプロパティを追加する方法の詳細については、「 MFC ActiveX コントロール: プロパティ」を参照してください。

  • コントロールの Picture プロパティまたはプロパティを操作するプロパティ ページ。

    このプロパティ ページは、ActiveX コントロールで使用できるストック プロパティ ページのグループの一部です。 ActiveX コントロールのプロパティ ページの詳細については、「MFC ActiveX コントロール: ストック プロパティ ページの使用」を参照してください。

ActiveX コントロールでのカスタム画像プロパティの実装

このセクションで説明する手順を完了すると、コントロールはユーザーが選択した画像を表示できます。 ユーザーは、現在の画像を表示するプロパティ ページを使用して表示される画像を変更でき、ユーザーが別の画像を選択できるようにする [参照] ボタンがあります。

カスタム Picture プロパティは、他のプロパティの実装に使用されるプロセスと同様のプロセスを使用して実装されます。主な違いは、カスタム プロパティが Picture 型をサポートする必要がある点です。 Picture プロパティの項目は ActiveX コントロールによって描画される必要があるため、プロパティを完全に実装する前に、いくつかの追加と変更を行う必要があります。

カスタム Picture プロパティを実装するには、次の操作を行う必要があります。

コントロール プロジェクトへの追加

標準の Picture プロパティ ページのプロパティ ページ ID を追加するには BEGIN_PROPPAGEIDS、コントロール実装ファイル (.CPP):

PROPPAGEID(CLSID_CPicturePropPage)

また、BEGIN_PROPPAGEIDS マクロの count パラメーターを 1 ずつインクリメントする必要があります。 次の行は、これを示しています。

BEGIN_PROPPAGEIDS(CMyAxPicCtrl, 2)

CPictureHolder データ メンバーをコントロール クラスに追加するには、コントロール ヘッダー ファイル (.H):

CPictureHolder    m_pic;

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

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

コントロール クラスと関数名は、上記の例とは異なる場合があります。

コントロール プロジェクトの変更

コントロール プロジェクトに必要な追加を行った後、ActiveX コントロールのレンダリングに影響を与えるいくつかの関数を変更する必要があります。 これらの関数、 OnResetStateOnDraw、およびカスタム Picture プロパティの Get/Set 関数は、コントロール実装ファイルにあります。 (この例では、コントロール クラスは CSampleCtrl と呼ばれ、 CPictureHolder データ メンバーは m_pic と呼ばれ、カスタム図プロパティ名は ControlPicture

コントロール OnResetState 関数で、 COleControl::OnResetStateの呼び出しの後に次の省略可能な行を追加します。

m_pic.CreateEmpty();
m_pic.CreateEmpty();

これにより、コントロールの画像が空白の図に設定されます。

図を適切に描画するには、コントロールOnDraw関数で CPictureHolder::Render を呼び出します。 次の例のように関数を変更します。

void CMyAxPicCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& /*rcInvalid*/)
{
   if (!pdc)
      return;

   m_pic.Render(pdc, rcBounds, rcBounds);
}

コントロールのカスタム画像プロパティの Get 関数に、次の行を追加します。

return m_pic.GetPictureDispatch();
return m_pic.GetPictureDispatch();

コントロールのカスタム Picture プロパティの Set 関数に、次の行を追加します。

m_pic.SetPictureDispatch(pVal);
InvalidateControl();

デザイン時に追加された情報が実行時に表示されるように、picture プロパティを永続的にする必要があります。 COleControl派生クラスのDoPropExchange関数に次の行を追加します。

PX_Picture(pPX, _T("ControlPicture"), m_pic);

クラス名と関数名は、上記の例とは異なる場合があります。

変更が完了したら、プロジェクトをリビルドしてカスタム Picture プロパティの新機能を組み込み、テスト コンテナーを使用して新しいプロパティをテストします。 Test Container にアクセスする方法について詳しくは、「 テスト コンテナーでのプロパティとイベントのテスト 」をご覧ください。

こちらも参照ください

MFC ActiveX コントロール
MFC ActiveX コントロール: フォントの使用
MFC ActiveX コントロール: プロパティ ページ