MFC ActiveX コントロール : ActiveX コントロールにおけるピクチャの使用

更新 : 2007 年 11 月

ここでは、よく使用される Picture 型について説明し、それを ActiveX コントロールに実装する方法を紹介します。ここでは、次の内容について説明します。

  • カスタム ピクチャ プロパティの概要

  • ActiveX コントロールにおけるカスタム ピクチャ プロパティの実装

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

カスタム ピクチャ プロパティの概要

Picture 型は、一部の ActiveX コントロールでよく使用される型の 1 つです。Picture 型では、メタファイル、ビットマップ、またはアイコンを扱えるので、ユーザーはこの型を使って、ActiveX コントロールに表示するピクチャを指定できます。カスタム ピクチャ プロパティを実装するには、ピクチャ オブジェクトと Get/Set 関数を使用します。コントロールのユーザーは、Get/Set 関数を使ってピクチャ プロパティにアクセスします。カスタム ピクチャ プロパティにアクセスするときには、ストック ピクチャ プロパティ ページを使用します。

標準の Picture 型のほかに、Font 型と Color 型も使用できます。ActiveX コントロールで標準の Font 型を使う方法については、「MFC ActiveX コントロール : フォントの使用」を参照してください。

ActiveX コントロールのクラスには、コントロールにピクチャ プロパティを実装するときに使用できるコンポーネントがいくつかあります。たとえば、次のようなコンポーネントがあります。

  • CPictureHolder クラス。

    このクラスを使うと、カスタム ピクチャ プロパティによって表示されるアイテムで、ピクチャ オブジェクトやその機能に簡単にアクセスできます。

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

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

  • コントロールのピクチャ プロパティを操作するためのプロパティ ページ。

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

ActiveX コントロールにおけるカスタム ピクチャ プロパティの実装

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

カスタム ピクチャ プロパティを実装する際の手順は、その他のプロパティの場合とほぼ同様です。ただし、ほかのプロパティとは違って、カスタム ピクチャ プロパティは Picture 型をサポートする必要があります。ピクチャ プロパティでは、ActiveX コントロールでアイテムを描画する必要があるため、完全に実装するにはいくつかの追加や変更が必要になります。

カスタム ピクチャ プロパティを実装するときには、以下の作業が必要になります。

  • コントロール プロジェクトにコードを追加する。

    標準のピクチャ プロパティ ページの ID、CPictureHolder 型のデータ メンバ、および Get/Set を使って実装した LPPICTUREDISP 型のカスタム プロパティを追加する必要があります。

  • コントロール クラスの関数を変更する。

    ActiveX コントロールの描画に使用するいくつかの関数を変更します。

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

標準のピクチャ プロパティ ページのプロパティ ページ ID を追加するには、コントロールの実装 (.CPP) ファイルの BEGIN_PROPPAGEIDS マクロの後に次の行を挿入します。

PROPPAGEID(CLSID_CPicturePropPage)

このほか、BEGIN_PROPPAGEIDS マクロのパラメータ count の値を 1 つ増やす必要があります。たとえば、次のようになります。

BEGIN_PROPPAGEIDS(CMyAxPicCtrl, 2)

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

CPictureHolder    m_pic;

データ メンバの名前は m_pic でなくてもかまいません。

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

プロパティ追加 ウィザードを使ってカスタム ピクチャ プロパティを追加するには

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

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

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

  4. ショートカット メニューの [追加] をポイントし、[プロパティの追加] をクリックします。

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

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

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

  8. Get 関数と Set 関数に一意の名前を付けるか、既定の名前をそのまま使用します。この例では、既定の名前である GetControlPicture と SetControlPicture を使用します。

  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();
}
1exs6wht.alert_note(ja-jp,VS.90).gifメモ :

コントロール クラスと関数の名前が上記の例と同じであるとは限りません。

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

コントロール プロジェクトに必要なコードを追加したら、次に、ActiveX コントロールの描画に関する関数を変更します。変更する必要がある関数は、OnResetState、OnDraw、およびカスタム ピクチャ プロパティの Get/Set 関数です。これらの関数は、コントロールの実装ファイルにあります。この例では、コントロール クラスの名前は CSampleCtrl、CPictureHolder データ メンバの名前は m_pic、カスタム ピクチャ プロパティの名前は ControlPicture です。

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

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

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

m_pic.SetPictureDispatch(pVal);
InvalidateControl();

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

PX_Picture(pPX, _T("ControlPicture"), m_pic);
1exs6wht.alert_note(ja-jp,VS.90).gifメモ :

クラスと関数の名前が上記の例と同じであるとは限りません。

変更作業が完了したら、プロジェクトをリビルドして、カスタム ピクチャ プロパティの新しい機能を組み込みます。その後、テスト コンテナを使って新しいプロパティをテストします。テスト コンテナへのアクセス方法については、「テスト コンテナでのプロパティとイベントのテスト」を参照してください。

参照

概念

MFC ActiveX コントロール

MFC ActiveX コントロール : フォントの使用

MFC ActiveX コントロール : プロパティ ページ