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






4.89/5 (5投票s)
1999 年 11 月 27 日
2分钟阅读

85311

1989
允许您轻松创建 ActiveX 控件的属性页
在开发 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::GetPredefinedStrings 和 IPerPropertyBrowsing::GetPredefinedValue(请参阅演示项目以获取示例)主模板类 CPropertyBrowserPage 派生自 IPropertyPageImpl 和 CDialogImpl,并使用一些下面简要描述的其他辅助类
- CPropBrowseWnd 类是一个自定义绘制的列表框,用于显示属性网格并处理属性选择、开始/停止编辑等。它是主 GUI 窗口,CPropertyBrowserPage 在 OnInitDialog 中创建它。
- CPBProperty 是一个用于存储属性属性(如名称、类型、当前值和“脏”状态)的简单类。
- CPBPropertyHolder 辅助类只是 CPBProperty 对象的非常简单的容器(数组)。
- CPBColorPicker 类是一个弹出式颜色选择器窗口,允许用户从调色板或系统颜色集中选择颜色。
- CPBDropListBox 类与就地编辑窗口一起工作,以类似于组合框的界面
- PBDib 类通常不是由我开发的,此类封装了 DIB 操作 API
如何使用
- 将以下文件复制到您的项目目录
- PropertyBrowserPage.h
- PropertyBrowserPage.cpp
- PBDib.h
- PBDib.cpp
- 从“插入”菜单中选择“新建 ATL 对象”。选择“属性页”并填写向导所需的所有字段。(例如,假设您选择 “CDemoCtrlPage” 作为您的页面类的名称)
- 转到 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 - 在您的控件的类属性映射中添加以下宏
PROP_PAGE(CLSID_DemoCtrlPage)
- 转到向导生成的页面的对话框模板并删除所有子控件。
- 请注意,此类使用一些 C RTL 代码,这使得
_ATL_MIN_CRT
指令不可能,因此您必须将其删除。