当前位置:首页 > VC++控件开发教程(实用)
摘要: 本文对COM组件中的ActiveX控件的MFC开发方法进行了介绍,讲述了用户自定义和库存属性、方法以及事件的添加方法和属性页的制作过程。使读者能够掌握基本的MFC ActiveX开发方法。
关键词: MFC;ActiveX控件;COM
ActiveX控件可以使COM组件从外观和使用上能与普通的窗口控件一样,而且还提供了类似于设置Windows标准控件属性的属性页,使其能够在包容器程序的设计阶段对ActiveX控件的属性进行可视化设置。ActiveX控件提供的这些功能使得对其的使用将是非常方便的。本文下面即以MFC为工具对ActiveX控件的开发进行介绍。
内附部分截图,手把手教你学控件 建立工程框架
图1 使用缺省选项建立的ActiveX控件工程结构
其中,_DSample68和_DSample68Events这两个接口将为客户程序提供本控件的属性、方法以及可能响应的事件。全局函数DllRegisterServer()和DllUnregisterServer()分别用于控件在注册表的注册和注销,一般不需要对其进行改动aaa。
应用程序类从COleControlModule继承。而COleControlModule有是从CWinApp派生,提供了初始化控件模块的功能。CSample68PropPage的基类是COlePropertyPage,CDialog类的派生类,主要负责对属性页中对图形界面下用户控件属性的显示。控件类CSample68Ctrl类是这几个类中比较重要的一个类,大部分实质性工作都在该类完成,其基类为CActiveX控件与其包容器之间的所有通信过程都是由COleControl来完成的:
图2 COleControl在ActiveX控件与包容器通信中的作用
控件类对基类COleControl的OnDraw()函数进行了重载,向导生成了如下缺省代码,其作用是在控件的客户区绘制
图3 插入ActiveX控件
图4 插入的待测试控件
对向导生成的代码进行编译后,将产生扩展名为ocx的ActiveX控件。ActiveX控件并不能独立运行,只能在中所有注册的ActiveX控件,选中要测试的控件并将其插入到测试程序即可通过\菜单下的各菜单项对控件的方法、属性以及事件等进行测试。在位于下方的分割视图中将跟踪显示出调试记录(参见图4)。 属性、方法以及事件的添加
图6 方法的添加
对ActiveX控件属性、方法和事件的添加均有库存和自定义两种。其中对属性和方法的添加在MFC ClassWizard对话框的Automation页中通过按钮\…\和\Method…\弹出如图5和图6所示的添加属性和添加方法的对话框来完成。对于库存属性和方法,可以直接从External name组合框的下拉列表中选取,Implementation项将自动设置为Stock。对于自定义属性和方法的添加与在自动化对象中为接口添加属性和方法的过程一样,ClassWizard将在.odl文件和控件类生成相应的代码,下面给出的是在控件类中实现的部分分发映射代码:
……
// Dispatch maps
//{{AFX_DISPATCH(CSample68Ctrl) CString m_message;
afx_msg void OnMessageChanged(); afx_msg short GetXPos();
afx_msg void SetXPos(short nNewValue); afx_msg short GetYPos();
afx_msg void SetYPos(short nNewValue); afx_msg short MessageLen(); //}}AFX_DISPATCH
DECLARE_DISPATCH_MAP() // Dispatch and event IDs public: enum {
//{{AFX_DISP_ID(CSample68Ctrl) dispidMessage = 1L, dispidXPos = 2L, dispidYPos = 3L,
dispidMessageLen = 4L, //}}AFX_DISP_ID }; ……
VT_I2, VTS_NONE)
DISP_STOCKPROP_BACKCOLOR() DISP_STOCKPROP_CAPTION() DISP_STOCKPROP_FORECOLOR() //}}AFX_DISPATCH_MAP END_DISPATCH_MAP() ……
在这里共添加了一个自定义方法MessageLen()和三种库存属性BackColor、Caption和ForeColor(分别表示控件的背景色、标题和前台色)、两个以Get/Set方式获取的自定义属性XP
对于以成员变量方式创建的属性Message,向导还为其生成了一个消息响应函数: void CSample68Ctrl::OnMessageChanged() { SetModifiedFlag(); }
只要该属性的值被更改,OnMessageChanged()函数即会被调用。
为了使上述属性设置如背景色、前景色等能够与控件实际联系起来,需要替换控件类OnDraw()函数中由向导生成的那部分代码。例如,下面这段代码即以前面添加的属性设置作为参数值,在控件中
为了使属性设置更改后,其效果能够立即在控件上显示出来,应当在与属性设置相关的函数实现中调用InvalidateControl()以更新控件的显示。
可以编译程序并在ActiveX Control Test Container工具中对其进行测试。在插入控件后,通过\Methods…\菜单项弹出如图7所示的对话框。在Method Name组合框中可以选择要测试
共分享92篇相关文档