MFC_AtiveX_开发过程_Step By Step

ActiveX学习

新发现:

msdn中刚刚找到了资料(主题) ActiveX Controls.一下子又明白了很多.原来ActiveX是利用了COM技术的.ActiveX利用的技术还真的多:

COM, Connectable objects可连接对象 ,Uniform data transfer统一数据传输 ,Compound documents 复合文档,Property pages 属性页,OLE automation 就是对象链接与嵌入,Persistent storage持久存储 ,Font and picture objects两个系统对象.

这也可以大概看得见个究竟了.怪不得别人问我懂不懂ATL编程,原来一问就知道我水平在哪里了.

不过还是那个观点:复合文档àOLEàCOMàActiveXàMFC_ActiveXATL_ActiveX(查了msdn,就这两种开发ActiveX的方式(MFCATL,而不是ActiveX分为这两种!) COMàCOM+,后来又有了.NET(实在找不到权威的说法哈!)

ActiveX提供了三种与容器应用程序集成的机制:属性事件和方法.就这句话暗含了什么??多着啊.明显的有复合文档,属性页,OLE,Font and picture object这些技术.

属性:控件的属性,在二次开发的时候与程序员交互的.VC环境下的那个属性页啊,每个控件的属性都不一样,就是从这来的.

方法:控件提供的函数.就是控件中的类提供的函数.

事件(Events,点中控件,右键然后有个Events菜单选项;选中了就可以添加消息处理函数了):控件发生的情况,如用户单击控件.

创建MFC ActiveX项目:

新建MFC ActiveX ControlWizard项目,输入名字MFCActiveX_05_12_16

在剩下的步骤中,最主要的是选择两大项:控件类和属性页类两个的类名,类型名和类型ID.vc6.0vc7.0中都是这样的.

生成的几个类的介绍:

CMFCActiveX_05_12_16PropPage派生于COlePropertyPage,而后者由CDialog派生的.在开发者的属性页中可以显示它的威力.当然可以和ActiveX控件交互,然后就能得到很好的开发效果了.想开发控件卖个好价钱?这里可是不能忽视的地方哦.

 CMFCActiveX_05_12_16Ctrl派生于COleControl,而后者派生于CWnd派生的,是真正的和用户(开发者开发的程序的使用者)交互的地方.它从CWnd派生而来,注定了其可以处理很多的命令消息和非命令消息.而且注意哈,比如用户鼠标左键点击控件,可以在COleControl这个类种进行消息处理的哈,记住,是和最终用户交互的. 它是你发挥才华,实现你的ActiveX控件功能的主要地方之一.

 CMFCActiveX_05_12_16App派生于COleControlModule,而后者派生于CWinApp派生的.而且有一个全部变量the_App,但不能在别的地方引用,MFC基础知识哈,可以看出控件本身就是一个包含完整应用程序框架的ocx文件,所以可以添加消息处理函数等.COleControlModule的派生类只有初始化(整个win32应用程序的框架都被封装了)和退出的作用.

MFC开发的ActiveX控件编程,主要的工作是基于四个方面的:定制控件(不好定义),定义属性,方法,属性页和事件.基本都要用到ClassWizard类向导来完成的.

定制控件:

1:我们从资源文件中装载一个位图并把它显示出来.
在资源文件中insertnew一个位图文件,ID:IDB_BITMAP1;
指针和变量的操作是用区别的.指针一定要指向一个实际存在的内存地址;基本知识哈.
用变量

CMFCActiveX_05_12_16Ctrl添加一个成员变量:CBitmap  m_Bitmap;

在构造函数中加载入位图资源: m_Bitmap. LoadBitmap(IDB_BITMAP1);;

CMFCActiveX_05_12_16Ctrl::OnDraw()中去掉画椭圆的函数.

然后在该函数最后添加代码:

      BITMAP BM;//数据结构

      

       //现在内存中装载入位图,为后来的BitBlt()转换位置提供资源.

       CDC MemDC;//

       MemDC.CreateCompatibleDC(NULL);//创建一个内存设备上下文.

       MemDC.SelectObject(m_Bitmap);

       m_Bitmap.GetObject(sizeof(BM),&BM);

 

       //利用BitBlt()从内存设备向窗口设备转移位图

       pdc->BitBlt((rcBounds.right-BM.bmWidth)/2,

              (rcBounds.bottom-BM.bmHeight)/2,

              BM.bmWidth,BM.bmHeight,

              &MemDC,

              0,0,SRCCOPY);

用指针:

CMFCActiveX_05_12_16Ctrl添加一个成员变量:CBitmap  m_Bitmap;

在构造函数中加载入位图资源: m_Bitmap. LoadBitmap(IDB_BITMAP1);;

CMFCActiveX_05_12_16Ctrl::OnDraw()中去掉画椭圆的函数.

然后在该函数最后添加代码:

      BITMAP BM;//数据结构

      

       //现在内存中装载入位图,为后来的BitBlt()转换位置提供资源.

       CDC MemDC;//

       MemDC.CreateCompatibleDC(NULL);//创建一个内存设备上下文.

       MemDC.SelectObject(m_Bitmap);

       m_Bitmap.GetObject(sizeof(BM),&BM);

 

       //利用BitBlt()从内存设备向窗口设备转移位图

       pdc->BitBlt((rcBounds.right-BM.bmWidth)/2,

              (rcBounds.bottom-BM.bmHeight)/2,

              BM.bmWidth,BM.bmHeight,

              &MemDC,

              0,0,SRCCOPY);

2:添加消息处理:
在类向导中选中Message maps,类选CMFCActiveX_05_12_16Ctrl(当然可以选CMFCActiveX_05_12_16PropPage,但那样是为属性页添加消息处理.最终是和二次开发者交互的).Object IDsCMFCActiveX_05_12_16Ctrl;最后选一个你想和最终用户交互的消息来处理就好了.
3:其它的处理:这里是最主要的了,不过没想到要做个什么功能的控件,所以就没例子.这是控件的核心;其他的是为了交互的,这里才是处理的核心!

定义属性:

要很好的交互,必须要添加自定义属性,如添加BackColor,Caption,Font等固有属性,和其他的自定义属性. 不管是自定义还是固有的属性,最终都会显示在VC的控件对应的属性页中,和二次开发人员进行友好的交互.
固有属性:
首先了解什么是固有属性:MFC存放和初始化的共用属性(应该在CWnd类中吧),BackColor,Font,Caption
添加很简单,就是用类向导,然后选中CMFCActiveX_05_12_16Ctrl,选中Automation选项卡,右边有一个Add Property按钮.点击后选一个External name,然后选下面的一个Stock单选按钮就好了.其他的含义自己理解哈.
自定义属性:同上.External name中输入一个名字,选择类型,选中Menber variable;这样生成了名为:ShowFrame;数据类型为:BOOL的自定义属性.
但是要写代码实现的!
首先在CMFCActiveX_05_12_16Ctrl::DoPropExchange(CPropExchange* pPX)中添加PX_Bool(pPX,_T(“ShowFrame”),m_showFrame,FALSE);意思明确,ShowFrame和变量m_showFrame初始化为FALSE.
再在OnShowFrameChanged()(这个函数是添加了ShowFrame自定义属性后向导自动添加的,用来对自定义属性进行消息处理)中添加函数:InvalidateControl();该函数强制调用重绘控件.
下面自然的是处理OnDraw()函数了.想怎么响应ShowFrame就怎么响应.
上面的逻辑是这样的:当容器应用程序改变了m_showFrame变量的值后,调用OnShowFrameChanged()函数,然后就可以调用OnDraw()函数进行重绘了.

比如:

CBrush Brush(TranslateColor(GetBakcColor()));

Pdc->FillRect(rcBounds,&Brush);

       if(m_showFrame)

       {

              CBrush* pOldBrush=(CBrush*)pdc->SelectStockObject(NULL_BRUSH);

              CPen Pen(PS_SOLID|PS_INSIDEFRAME,10,RGB(0,0,0));

              CPen* pOldPen=(CPen*)pdc->SelectObject(&Pen);

 

              pdc->Rectangle(rcBounds);

 

              pdc->SelectObject(pOldBrush);

              pdc->SelectObject(pOldPen);

 

       }

注意:添加了固有的或自定义的属性后,采用成员变量Member variableStockGet/Set Method来实现的区别:
Stock:顾名思义,是固有的,实现用固有的,什么意思?肯定是用MFC中类的方法来维护的.
Member variable:就是在开发ActiveX的时候可以用这个变量名来处理.本例就是这样的.用的是m_showFrame变量来编写代码.
Get/Set Method:向导为你添加了两个函数,一个Getxxx(),一个Setxxx();这可是很好的习惯哦.推荐.其实Stock也是用这个方式的,只不过其中的属性是固有的而已.
还想补充一点,在调用这个控件的地方,不管是自定义或固有属性,添加了控件的变量(也是用向导完成的),都只能通过Getxxx()Setxxx()来访问控件中的属性.

方法:

这里的方法,是二次开发人员可以调用的函数.当二次开发人员定义了一个该类(导入到二次开发人员的项目中的那个类,然后用向导添加类的对象.还有,向导不会帮你生成添加头文件的操作,自己来哈.)的对象后,可以调用的方法(简单点说就是为派生类添加成员函数).有三种方式:
Stock:也是用MFC的那个默认成员函数的意思.
自定义Custom:允许你定义一个函数名.
而如果你在Extenal name中填入一个名字而不是选择,则所有都由你自己定义了.
上面三种情况,最后你都要写代码完成功能的哈!!这是你和二次开发人员交互的绝好地方.想想,总不能让二次开发人员在属性页中完成很多操作吧.也默认的函数总是不能满足个性和功能要求的.默认的一个方法是AboutBox(),用于弹出一个关于对话框.

属性页:

有一个属性页对话框资源,还有一个控制这个资源的类CMFCActiveX_05_12_16PropPage.和一般的基于对话框的编程没有什么区别.关键的是这个对话框是显示在编程环境的属性页中的.

事件: 这个嘛,呵呵,也不难.

你添加了一个事件,向导会相应添加一个dispinterface自动化接口.最终在二次开发人员那里的体现是:
在你选择了这个ActiveX控件后,右键弹出的菜单中有一个Events选项.
在类向导里选上ActiveX控件的ID,这样就可以添加消息处理函数了.
补充:上面两者是完全等价的.添加事件是为了容器应用程序接收来自ActiveX控件(服务器应用程序)发出的消息处理并添加处理函数而设置的.简单的说,记的在对话框中添加一个普通的按钮吗?添加了后就可以为按钮添加单击和双击的事件发出的消息添加消息处理函数了.

下次再写点如何在VC中调用MFC编写的ActiveX控件

其它

本文写的是MFC_ActiveX(现在知道的唯一用途是添加到开发环境中当成一个新的控件,当然功能可以是非常强大的).想想,MFC ActiveX,是不是只用于开发MFC应用程序的??????????????????????

编译链接就可以生成一个ActiveX_05_12_14.ocx文件.(自动帮你注册了,多方便.但要用在其他的计算机怎么办?? regsvr32.exe D:/编程类学习/毕业论文/ActiveX_05_12_14/Debug/ActiveX_05_12_14.ocx就这样简单了.因为其中有全局函数DllRegisterServerDllUnregisterServer以及两个全局变量IID,开发环境自动生成的.)你可以很容易的使用它.

控件的名字不能用数字开头哈

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值