《VC++深入详解》学习笔记 第十八章 ActiveX控件
来源:互联网 发布:男鞋推荐学生 知乎 编辑:程序博客网 时间:2024/04/30 09:52
1.可以把ActiveX控件看做是一个极小的服务器应用程序,它不能独立运行,必须嵌入到某容器程序中,与该容器一起运行,容器应用程序是可以嵌入或链接对象的应用程序,服务器应用程序是创建对象并且当对象被双击时,可以被启动的应用程序
(1)OCX是ActiveX控件的一种后缀名,ActiveX控件对应的文件也可以是其他后缀名,例如DLL
(2)一个典型的ActiveX控件,它具有方法、属性、事件这三种特性
(3)一个文件中可以包含多个ActiveX控件
(4)将一些常用功能封装到一个ActiveX控件中,然后提供给其他用户使用
(5)对ActiveX来说,它的底层实际上是采用COM技术实现的
2.MFC ActiveX
(1)类:CClockApp;CClockCtrl;CClockPropPage
1. CClockApp(该类实例表示控件程序本身)—COleControlModule类—CWinApp类
2. CClockCtrl(窗口类)—COleControl类—CWnd类
在该文件中不仅提供了消息映射,还提供了一个调度映射和事件映射,其中调度映射是MFC提供的一种映射机制,主要是为了让外部应用程序可以方便地访问控件的属性和方法,而事件映射也是MFC提供的一种映射机制,让控件可以向包含它的容器发送事件通知
3. CClockPropPage(显示控件的属性页)—COlePropertyPage类—CDialog类
(2)接口:接口是控件与外部程序进行通信的协议,可以把接口看作是函数的集合,外部程序通过这个接口所暴露出来的方法区访问控件的属性和方法,实际上,可以把接口看作是一个抽象基类,在此接口中定义的所有函数都是纯虚函数,这些函数的实现是在CClockCtrl类中完成的,MFC通过底层封装,让CClockCtrl类继承自接口:_DCLOCK,所以通过该接口调用的函数实际上调用的是CClockCtrl类中真正实现的函数
(3)ActiveX控件的注册:所有的ActiveX控件必须在注册后才能使用(regsvr32程序)
注册:regsvr32 DllRegisterServer in D:\^\Clock.ocx succeeded (完整路径)
删除:regsvr32/u DllRegisterServer in D:\^\Clock.ocx succeeded
VC—Tools—Register Control
3.属性
(1)标准属性 ClassWizard—Automation—Add Property
ActiveX控件中有四种属性
1.Stock:为每个控件提供的标准属性,如字体或颜色(BackColor和ForeColor等)
2.Ambient:围绕控件的环境属性—已被置入容器的属性,这些属性不能被更改,但控件可以使用它们调整自己的属性
3.Extended:这些是由容器处理的属性,一般包括大小和屏幕上的位置
4.Custom:由控件开发者添加的属性
(2)得到BackColor属性的值:GetBackColor函数
函数原型:OLE_COLOR GetBackColor();
该函数返回值是OLE_COLOR,要转换为我们通常使用的颜色类型:TranslateColor()
函数原型:COLORREF TranslateColor(OLE_COLOR clrColor,HPALETTE hpal = NULL);
(3)将文字背景设置为透明的:SetBkMode();
pdc->SetBkMode(TRANSPARENT);
(4)为属性表单增加属性页(相应地要增加属性页的总量)
在ClockCtl.cpp中,调用PROPPAGEID宏来实现,并且还要使用该属性页的guid,对ActiveX控件,颜色属性页的guid值是CLSID_CColorPropPage,因此在END_PROPPAGEIDS宏之前添加PROPPAGEID(CLSID_CColorPropPage),这时,在Clock控件的属性表单中就添加了一个颜色属性页,但是一定要注意,一定要相应地增加属性页的总数,即增加BEGIN_PRPPAGEIDS宏的第二个参数的值,该参数表示属性表单中当前属性页的个数
BEGIN_PROPPAGEIDS(CClockCtrl,2)
PROPPAGEID(CClockPropPage::guid)
PROPPAGEID(CLSID_CColorPropPage)
END_PROPPAGEIDS(CClockCtrl)
(5)自定义属性 ClassWizard—Add Property
External name:外部名称 Variable name:变量名称
系统自动添加通知函数OnIntervalChanged,当外部修改该属性时,这个函数被调用
(6)在为对话框上的某个控件关联成员变量时,MFC还为我们提供了这样一个选项,让控件在关联一个成员变量的同时,还可以与一个属性进行关联。但应注意,这里关联的名称是属性的外部名称,并不是代码中使用的成员变量的名称
4.方法:ClassWizard—Automation—Add Method
5.事件:标准事件和自定义事件
(1)标准事件(Stock) ClassWizard—Automation—Add Event
(2)源接口:表示控件将使用这个接口来发送通知事件,这个接口不是控制本身实现的接口
(3)_DClockEvents接口中的方法是由容器实现的
(4)自定义事件:必须在某个条件到来时,显示地调用某个函数发出该事件通知
6.属性的持久性
(1)CClockCtrl类中的DoPropExchange函数,该函数提供了对控件属性持久化的支持,可以在此函数中为每一个具有持久性的自定义属性调用以“PX_”开头的函数,如:PX_Short
函数原型:BOOL PX_Short(CPropExchange* pPX,LPCTSTR pszPropName,short& sValue,short sDefault);
// pPX指向一个CPropExchange对象的指针(DoPropExchange函数由一个同样类型的参数,可以直接将该参数传递给PX_Short函数的第一个参数)
// pszPropName提供给外部程序使用的属性的名称
//与属性相关联的类的成员变量
//属性默认值
(2)控件自定义属性的值发生改变后,要通知容器,让容器做出相应的调整
在OnIntervalChanged函数中通知容器:COleControl类成员函数BoundPropertyChanged
该函数将通知容器绑定的属性值已经发生了改变
函数原型:void BoundPropertyChanged(DISPID dispid);
//参数是控件的一个绑定属性的调度ID(在Clock.odl文件中,_DClock接口中所定义的每一个属性前面都有一个id属性,其中括号中的数值就是该属性的调度ID)
7.环境属性
(1)容器中使用ActiveX控件时,分为两种情况:一种是在设计模式下,通过控件自身的属性表单,或者容器提供的接口改变该控件的属性;另一种是在运行模式下,通过调用控件的方法来改变其属性
(2)可以通过一个环境属性:UserMode来判断其当前所处的状态是处于设计模式下还是运行模式下,利用COleControl类的成员函数:AmbientUserMode可以得到该环境变量
函数原型:BOOL AmbientUserMode();//运行模式返回非零值,设计模式返回0值
- 《VC++深入详解》学习笔记 第十八章 ActiveX控件
- 孙鑫VC学习笔记:第十八讲 ActiveX 控件
- 孙鑫VC学习笔记:第十八讲 ActiveX 控件
- 孙鑫VC视频教程笔记之第十八课“ActiveX控件”
- 孙鑫VC学习笔记:ActiveX 控件
- 孙鑫VC学习笔记:ActiveX 控件
- 孙鑫VC学习笔记:ActiveX 控件
- vc++深入详解第二章学习笔记
- VC++深入详解第三章学习笔记
- VC++深入详解第二章学习笔记
- VC 深入详解 学习笔记
- VC++深入详解学习笔记
- VC++深入详解学习笔记
- VC++深入详解学习笔记
- VC++深入详解学习笔记
- 《VC++深入详解》学习笔记
- VC++深入详解学习笔记
- VC++深入详解学习笔记
- 快速排序(一)
- iOS中Quartz2D的画圆弧问题
- WIP模块常用表结构
- UIActionSheet 按钮不响应点击事件的解决方法
- UNDO 表空间使用率过高
- 《VC++深入详解》学习笔记 第十八章 ActiveX控件
- win32和64位操作系统的区别
- Android 中文转换汉语拼音
- javascript面向对象编程构造函数继承
- APEX HTMLDB_APPLICATION与checkbox
- 常用的Struts 2.0的标志(Tag)介绍
- throw(),空异常描述符,中断描述符
- 小宝,小宝,我爱你
- 《VC++深入详解》学习笔记 第十九章 动态链接库