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 型をサポートするカスタム プロパティを追加します。
プロパティ追加 ウィザードを使ってカスタム ピクチャ プロパティを追加するには
コントロールのプロジェクトを読み込みます。
[クラス ビュー] ウィンドウで、コントロールのライブラリ ノードを展開します。
コントロールのインターフェイス ノード (ライブラリ ノードの 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();
}
メモ : |
---|
コントロール クラスと関数の名前が上記の例と同じであるとは限りません。 |
コントロール プロジェクトの変更
コントロール プロジェクトに必要なコードを追加したら、次に、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);
メモ : |
---|
クラスと関数の名前が上記の例と同じであるとは限りません。 |
変更作業が完了したら、プロジェクトをリビルドして、カスタム ピクチャ プロパティの新しい機能を組み込みます。その後、テスト コンテナを使って新しいプロパティをテストします。テスト コンテナへのアクセス方法については、「テスト コンテナでのプロパティとイベントのテスト」を参照してください。