《VC++深入详解》学习笔记 第十八章 ActiveX控件

来源:互联网 发布:男鞋推荐学生 知乎 编辑:程序博客网 时间:2024/04/30 09:52

1.可以把ActiveX控件看做是一个极小的服务器应用程序,它不能独立运行,必须嵌入到某容器程序中,与该容器一起运行,容器应用程序可以嵌入或链接对象的应用程序服务器应用程序创建对象并且当对象被双击时,可以被启动的应用程序

1OCXActiveX控件的一种后缀名,ActiveX控件对应的文件也可以是其他后缀名,例如DLL

2)一个典型的ActiveX控件,它具有方法、属性、事件这三种特性

3)一个文件中可以包含多个ActiveX控件

4)将一些常用功能封装到一个ActiveX控件中,然后提供给其他用户使用

5ActiveX来说,它的底层实际上是采用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类中真正实现的函数

3ActiveX控件的注册:所有的ActiveX控件必须在注册后才能使用(regsvr32程序)

     注册:regsvr32 DllRegisterServer in D:\^\Clock.ocx succeeded  (完整路径)

     删除:regsvr32/u DllRegisterServer in D:\^\Clock.ocx succeeded

     VCToolsRegister Control

3.属性

1)标准属性  ClassWizardAutomationAdd Property

     ActiveX控件中有四种属性

     1.Stock:为每个控件提供的标准属性,如字体或颜色(BackColorForeColor等)

     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)自定义属性 ClassWizardAdd Property

     External name:外部名称   Variable name:变量名称  

系统自动添加通知函数OnIntervalChanged,当外部修改该属性时,这个函数被调用

6)在为对话框上的某个控件关联成员变量时,MFC还为我们提供了这样一个选项,让控件在关联一个成员变量的同时,还可以与一个属性进行关联。但应注意,这里关联的名称是属性的外部名称,并不是代码中使用的成员变量的名称

4.方法:ClassWizardAutomationAdd Method

5.事件:标准事件和自定义事件

1)标准事件(Stock ClassWizardAutomationAdd Event

2)源接口:表示控件将使用这个接口来发送通知事件,这个接口不是控制本身实现的接口

3_DClockEvents接口中的方法是由容器实现的

4)自定义事件:必须在某个条件到来时,显示地调用某个函数发出该事件通知

6.属性的持久性

1CClockCtrl类中的DoPropExchange函数,该函数提供了对控件属性持久化的支持,可以在此函数中为每一个具有持久性的自定义属性调用以“PX_”开头的函数,如:PX_Short

    函数原型:BOOL PX_ShortCPropExchange* 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

原创粉丝点击