開発者がこのようなコントロールを自作したい場合は、どのような作りこみをすれば良いか?
例えばExcelで見られるような、セル幅に合わせた表示をしてくれるラベル・コントロールを作りたい場合です。
Microsoft Visual Studio 2005で、Control Sourceを持つコントロールを作成できました。そのテクニックをご紹介したいと思います。
※ Microsoft社様のサイトにHow to情報が有りました:How to add Excel LinkedCell support to your ATL ActiveX control
既に作成しているコントロールを調整する場合:
- 次のINTERFACE_ENTRYをすべて含みます:
- COM_INTERFACE_ENTRY(IConnectionPointContainer)
COM_INTERFACE_ENTRY(IProvideClassInfo) - 次のCONNECTION_POINT_ENTRYを含みます:
- CONNECTION_POINT_ENTRY(IID_IPropertyNotifySink)
- IDLファイルで次の定義をinterfaceに含みます。Valueの名称、idの序数、displaybindの有無は任意。但しbindable必須、defaultbind必須、VARIANT型を用いることも必須です:
- [propput, bindable, displaybind, defaultbind, id(0)]
HRESULT Value([in]VARIANT *rhs);
[propget, bindable, displaybind, defaultbind, id(0)]
HRESULT Value([out,retval]VARIANT *prv); - Valueプロパティの実装を作りこみます。
新たにコントロールを作成する場合:
- 「クラスビュー」を表示、プロジェクトを右クリック、「追加」クリック、「クラス」クリック、「ATL コントロール」選択、「追加」クリック。
- 「オプション」では、「接続ポイント」のサポートにチェックを入れてください。
- 「インターフェイス」では、「IPropertyNotifySink」「IProvideClassInfo2」をサポート有りに移動します。
- IDLファイル中の作成したinterfaceに、Valueプロパティの定義を追加します。例:
- [propput, bindable, displaybind, defaultbind, id(1001)]
HRESULT Value([in]VARIANT *rhs);
[propget, bindable, displaybind, defaultbind, id(1001)]
HRESULT Value([out,retval]VARIANT *prv); - 作成したクラスのヘッダファイルにValueプロパティ操作の実装を追加します。例:
- public:
CComVariant m_vt;
virtual HRESULT STDMETHODCALLTYPE put_Value(VARIANT *rhs)
{
return m_vt.Copy(rhs);
}
virtual HRESULT STDMETHODCALLTYPE get_Value(VARIANT *prv)
{
return VariantCopy(prv, &m_vt);
}
[ATLコントロールウィザード]-[オプション]画面
[ATLコントロールウィザード]-[インタフェイス]画面
IExcellyLabel6のinterface定義にValueプロパティを追加
CExcellyLabel6にValueプロパティ操作の実装を追加
0 件のコメント:
コメントを投稿