2011年7月9日土曜日

"ControlSource/コントロールソース" プロパティ を持つATLコントロールを作成する

Microsoft Accessでフォームを構築する際には、多数のテキスト ボックス(コントロールソースを設定した物)を多用するかと思います。


開発者がこのようなコントロールを自作したい場合は、どのような作りこみをすれば良いか?

例えば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 件のコメント:

コメントを投稿