MFC_AtiveX_开发过程_Step By Step

翻译|其它|编辑:郝浩|2007-09-06 11:04:00.000|阅读 1474 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

  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_ActiveX    ATL_ActiveX(查了  msdn,就这两种开发  ActiveX  的方式(MFC    ATL,而不是  ActiveX  分为这两种!) COMàCOM+,后来又有了.NET(实在找不到权威的说法哈!)

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

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

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

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

创建  MFC ActiveX  项目:

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

在剩下的步骤中,最主要的是选择两大项:控件类和属性页类两个的类名,类型名和类型  ID. vc6.0  vc7.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:我们从资源文件中装载一个位图并把它显示出来.

在资源文件中  insert    new  一个位图文件,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 IDs    CMFCActiveX_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 variable    Stock  Get\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  控件(服务器应用程序)发出的消息处理并添加处理函数而设置的.简单的说,记的在对话框中添加一个普通的按钮吗?添加了后就可以为按钮添加单击和双击的事件发出的消息添加消息处理函数了.

标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:csdn

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP