65.9K
CodeProject 正在变化。 阅读更多。
Home

ATL ActiveX 控件的“属性浏览器”类模板属性页

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.89/5 (5投票s)

1999 年 11 月 27 日

2分钟阅读

viewsIcon

85311

downloadIcon

1989

允许您轻松创建 ActiveX 控件的属性页

Sample Image

在开发 ActiveX 控件时,我总是不喜欢花大量时间在单调的 GUI 工作上,设计和实现属性页。最终我编写了这个类,它在大多数情况下可以作为任何基于 ATL 的 ActiveX 控件的通用属性页。该类的原型是任何 Visual Basic 开发人员都熟悉的属性浏览器窗口。

工作原理

通常,此类使用 IPropertyPage::SetObjects 并查询控件的 IDispatch::GetTypeInfo 来枚举属性。目前,此模板类可以处理以下类型的属性:简单类型,如 long, short, text(BSTR) 等。 Font (IFontDisp) OLE_COLOR Picture (IPictureDisp) enums boolean (VARIANT_BOOL)

目前的实现不显示具有 [hidden] 或 [nonbrowsable] 属性的属性,以及索引属性和自定义类型(IFoo* 或类似)的属性。控件的默认接口应该是双接口,并派生自 IDispatch。如果使用枚举属性,控件必须支持 IPerPropertyBrowsing::GetPredefinedStringsIPerPropertyBrowsing::GetPredefinedValue(请参阅演示项目以获取示例)主模板类 CPropertyBrowserPage 派生自 IPropertyPageImpl 和 CDialogImpl,并使用一些下面简要描述的其他辅助类

  • CPropBrowseWnd 类是一个自定义绘制的列表框,用于显示属性网格并处理属性选择、开始/停止编辑等。它是主 GUI 窗口,CPropertyBrowserPage 在 OnInitDialog 中创建它。
  • CPBProperty 是一个用于存储属性属性(如名称、类型、当前值和“脏”状态)的简单类。
  • CPBPropertyHolder 辅助类只是 CPBProperty 对象的非常简单的容器(数组)。
  • CPBColorPicker 类是一个弹出式颜色选择器窗口,允许用户从调色板或系统颜色集中选择颜色。
  • CPBDropListBox 类与就地编辑窗口一起工作,以类似于组合框的界面
  • PBDib 类通常不是由我开发的,此类封装了 DIB 操作 API

如何使用

  1. 将以下文件复制到您的项目目录

    • PropertyBrowserPage.h
    • PropertyBrowserPage.cpp
    • PBDib.h
    • PBDib.cpp
    并将 *.cpp 文件添加到项目中。
  2. 从“插入”菜单中选择“新建 ATL 对象”。选择“属性页”并填写向导所需的所有字段。(例如,假设您选择 “CDemoCtrlPage” 作为您的页面类的名称)
  3. 转到 CDemoCtrlPage 类声明并修改基类列表,如下所示

    class ATL_NO_VTABLE CDemoCtrlPage :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CDemoCtrlPage, &CLSID_DemoCtrlPage>,
    //	public IPropertyPageImpl, <--- this lines should be removed
    //	public CDialogImpl 
    /* next line should be added*/
    public CPropertyBrowserPage<CDemoCtrlPage>
    接下来,更改消息映射链宏,如下所示
    BEGIN_MSG_MAP(CDemoCtrlPage)
    /* CHAIN_MSG_MAP(IPropertyPageImpl<CDemoCtrlPage>) <--- this line should be removed*/ 
    CHAIN_MSG_MAP(CPropertyBrowserPage<CDemoCtrlPage>)/*<--- this line should be added*/
    END_MSG_MAP() 
    
    并删除向导生成的 CDemoCtrlPage::Apply() 方法,最后不要忘记包含 PropertyBrowserPage.h
  4. 在您的控件的类属性映射中添加以下宏
    	PROP_PAGE(CLSID_DemoCtrlPage)
    
  5. 转到向导生成的页面的对话框模板并删除所有子控件。
  6. 请注意,此类使用一些 C RTL 代码,这使得 _ATL_MIN_CRT 指令不可能,因此您必须将其删除。
© . All rights reserved.