转自:http://lingchuangsong.blog.163.com/blog/static/126932322008631104133309/

一方面,它表示将你联系到Microsoft、Internet和业界的新技术的小型快速的可重用组件。它与开发语言无关,任何支持 ActiveX控件的软件开发平台(如VB、VC++、Access、VFP、Delphi、PowerBuilder等)上,都可以使用ActiveX控件,程序员可以像使用Windows标准控件一样使用不同厂商开发的ActiveX控件。这样就实现了软件开发的工业化,大大地提高了软件的生产效率。   

  另一方面,它代表Internet与应用程序的一种集成策略。用户可以从Internet上下载ActiveX控件,也可以通过网络在本地机上调用远程机上的ActiveX控件,还可以将ActiveX控件加入到Internet主页上。   

  既然ActiveX控件对程序员是如此地重要,那么如何用好ActiveX控件也就成为软件开发者所关心的问题。本文以VC++5.0为开发工具,以一个项目名为Test的应用程序为例,就笔者在控件使用中遇到的一些问题加以讨论。  

  要想在应用程序中使用ActiveX控件,必须使你的应用程序成为ActiveX控件包容器。ActiveX 控件包容器就是完全支持ActiveX控件,并能把控件组合进自己的窗口或对话框的父应用程序。利用MFC的AppWizard,你可以很方便地创建你的包容器程序。事实上,在用AppWizard创建新的应用程序时,你的应用程序就被缺省设置为控件包容器,即在第3步选中支持ActiveX Controls的复选框。如果你在创建过程中没有选择这项技术支持,以后也可以手动地加入这项支持。  

  步骤如下:  

  1. 在项目的应用类的.cpp文件(本例中为test.cpp)的Initinstance函数中加入对函数AfxEnableControlContainer()的调用,如下所示:  

   BOOL CTestApp::InitInstance()

   {   

   AfxEnableControlContainer();

   ...

   }  

  在使用一个已注册的ActiveX控件之前,必须先用组件廊将该控件添加到应用程序中,步骤如下:

  1.从Project菜单选择Add To Project下的Components and Controls。  

  2.在弹出的对话框中双击Registered ActiveX Control子目录,打开此目录。  

  3.选择你需要的控件,点击Insert按钮,弹出Confirm Classes对话框。 

  4.在列出的类名中选择需要的类(缺省为全选中,最好接受缺省设置),点击OK,关闭Confirm Classes对话框。  

  5.点击Close关闭组件廊,该控件的图标即加入到对话框编辑器的控件面板上。  

  这样,我们就可以在对话框中像使用Windows标准控件那样使用该控件了。但在某些应用中,你可能需要在非对话框容器(如应用程序的窗口)中嵌入ActiveX控件。这时没有对话框编辑器,我们应怎样在非对话框容器中使用ActiveX控件呢?  

  当组件廊将ActiveX控件添加到你的应用程序后,组件廊会创建一些包裹类(即在Confirm Classes对话框中列出的那些类)。其中有一个类的基类是CWnd,该类是控件的包裹类,它被用作控件与控件包容器之间的接口,有两个公有的Create成员函数: 

  virtual BOOL Create(LPCTSTR lpszClassName, 

  LPCTSTR lpszWindowName, DWORD dwStyle, 

   const RECT& rect, CWnd* pParentWnd, UINT nID, 

   CCreateContext* pContext = NULL)

  和BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle,

   const RECT& rect, CWnd* pParentWnd, UINT nID,

   CFile* pPersist = NULL, BOOL bStorage = FALSE,

   BSTR bstrLicKey = NULL) 

  我们就可以使用该控件的包裹类的Create函数在非对话框容器中动态地创建此控件的实例。

  步骤如下:(本例中欲加入的控件名为MSFlexGrid ,CMSFlexGrid是控件的包裹类,msflexgrid.h是包裹类的头文件) 

  1.在视类头文件(本例中为TestView.h)中的类定义前加上

  #include “msflexgrid.h”

 2. 在TestView.h中CTestView类定义的protected部分加上控件包裹类类型的成员变量声明:

   class CTestView : public CView

   {

   ...

   protected:

   CMSFlexGrid m_fgrid;

   ...

   }; 

  3. 用ClassWizard为类CTestView 添加消息WM_CREATE的处理函数CTestView::OnCreate,在此函数中,调用控件类CMSFlexGrid的Create函数: 

   int CTestView::OnCreate(LPCREATESTRUCT lpCreateStruct)

   {

   if (CView::OnCreate(lpCreateStruct) == -1)

   return -1;

   // ****** Add your code below this line ********** //

   m_fgrid.Create(NULL, WS_VISIBLE,

   CRect(50,50,100,100), this, 0); //用this指针作为指向父窗口的指针    m_fgrid.SetCols(2);

   m_fgrid.SetRows(10);

   m_fgrid.SetTextMatrix(0,0,"序号");

   m_fgrid.SetTextMatrix(0,1,"姓名");

   // ****** Add your code above this line ********** //

   return 0;

   }

  4.重新链接工程,运行。可以看到当应用程序的视窗生成时,控件也动态地生成了。

  

  5.如果你以后还想改变控件的位置和大小,可以继承CWnd::MoveWindow()函数。例如,若想使控件充满整个窗口,并在父窗口移动和缩放时也随之移动和缩放,可以添加消息WM_SIZE的处理函数OnSize,并加入如下代码:

  void CTestView::OnSize(UINT nType, int cx, int cy)

   {

   CView::OnSize(nType, cx, cy);

   // TODO: Add your message handler code here

   m_fgrid.MoveWindow(0,0,cx,cy);

   }  

     通常情况下,我们可以用两种方法来存取对话框中的控件:1、将控件与对话框的成员变量相关联,通过对话框数据交换DDX来实现控件和对应的成员变量之间的数据交换(详情请参阅VC联机帮助ActiveX Control Containers: Connecting an ActiveX Control to a Member Variable);2、调用函数CWnd::GetDlgItem来取得指向控件的指针。

  有些ActiveX控件没有用户界面,在运行时不可见。如果你在对话框中加入了运行时不可见的ActiveX控件,并想用CWnd::GetDlgItem来存取此控件,此控件将不能正常工作。要得到代表此控件的对象指针,可采取以下两种方法之一: 

  1. 在ClassWizard的成员变量标签中,选择此控件的ID,点击Add Variable,然后输入一个成员变量名,在Category中选择”Control”,在Variable type中选择控件类。 

  2. 声明一个此控件类型的局部变量,并将它作为一个对话框项。加入类似如下所列的代码(其中CmyCtrl是控件类,IDMYCTRL1是控件ID): 

   CMyCtrl myCtrl;

   myCtrl.SubclassDlgItem(IDC_MYCTRL1, this);

   // ... 使用控件myCtrl ...

   myCtrl.UnsubclassWindow(); 

  下面举一个例子加以说明。本例将在对话框中加入一个运行时不可见的计时控件Timer Object。该控件在一个的预定的时间间隔过去之后引发 Timer 事件,该时间间隔储存于该控件的 Interval 属性中,它以千分之一秒为单位指定时间的长度。本例用一个成员变量m_num来计数,每隔Interval时间递增1,当m_num计到10时,重置为0,并将时间间隔m_Interval增加200毫秒,并分别在两个静态框中显示当前的m_num和m_Interval。

  步骤如下: 

  1.用组件廊将Timer控件加入到项目Test中。 

  2.在项目中插入一个新的对话框,类名为CTestDlg。 

  3.在对话框模板中加入控件Timer Object(包裹类为CIeTimer),如图2的右下角。打开属性对话框,设置ID为IDC_TIMER1。再切换至All属性页,设置Interval为200。 

  4.在对话框模板中添加静态控件,Caption为“The current interval is:”。 

  5.添加一个不带Caption的静态控件,打开属性对话框,设置ID为IDC_STATIC1。再切换至Extended Styles属性页,选中Static edge复选框。 

  6.按下Ctrl键的同时双击静态控件IDC_STATIC1,弹出Add Member Variable对话框,第一项中填写变量名m_text1,Category项中选择Control,Variable type项中选择CStatic。 

  7.添加静态控件“The current number is:”。 

  8.重复步骤5到步骤6,添加一个不带Caption的静态控件(ID为IDC_STATIC2),变量名为m_text2。

  

  9.运行ClassWizard并选择Message Map属性页,在Class name 中选择CTestDlg,Object IDs中选择IDC_TIMER1,在Messages中选择Timer,点击Add Function…按钮,加入OnTimerTimer1()处理函数。

  若采用第一种方法,则按前面所述方法用ClassWizard给此控件类添加一个成员变量m_timer,并在OnTimerTimer1函数中添加如下代码: 

  void CTestDlg::OnTimerTimer1()

  {

   // TODO: Add your control notification handler code here

   char buf[10];

   m_num++;

   if(m_num>=10)

   {

   m_num=0;

   m_interval+=200;

   m_timer.SetInterval(m_interval);

   }

   _itoa(m_interval,buf,10);

   m_text1.SetWindowText (buf);

   _itoa(m_num,buf,10);

   m_text2.SetWindowText (buf);

  } 

   若采用第二种方法,不需要添加此控件类的成员变量,只需将加灰显示的语句用下列语句代替即可: 

   CIeTimer m_timer;

   m_timer.SubclassDlgItem(IDC_TIMER1,this);

   m_timer.SetInterval(m_interval);

   m_timer.UnsubclassWindow();  

  

  运行之后可以看到计数的步调越来越慢了(时间间隔越来越大了)

  ActiveX控件大大地简化了开发者的工作,灵活地使用控件能使开发者高效地开发出各种软件。以上是笔者在使用控件的过程中总结出的一些实践经验,希望对大家有所帮助。

VC使用ActiveX控件常见问题相关推荐

  1. 图解VC++开发ActiveX控件C#调用

    1 新建ActiveX控件工程 2 编译,运行 使用下图所示VC++自带测试工具来测试ActiveX控件: 3 测试容器 插入刚做的ActiveXDemo1控件 4 添加属性 添加名为outstr的属 ...

  2. VC++编写ActiveX控件

    前言:ocx是ocx控件的扩展名,OCX 是对象类别扩充组件.如果你用过Visual Basic或者Delphi一类的可视化编程工具,那么对控件这个概念一定不会陌生,就是那些工具条上的小按钮,如Edi ...

  3. vc mysql控件_VC++使用ActiveX控件连接和操作数据库

    VS2008运用ActiveX控件连接和操作数据库关闭时一直有个内存释放的错误,好像使用VC6.0会多生成2个文件,就不会有问题. VC++使用ActiveX控件连接和操作数据库的方法分两种: 1.通 ...

  4. VC ActiveX 控件 开发总结

    VC 制作ActiveX 控件(OCX) http://ileson.iteye.com/blog/1002910 1.vc6下建立一下activeX工程     详见http://hi.baidu. ...

  5. 基于MFC的ActiveX控件开发

    转自:http://www.cnblogs.com/lidabo/archive/2012/12/04/2800921.html ActiveX 控件是基于组件对象模型 (COM) 的可重用软件组件, ...

  6. MFC的ActiveX控件 - 1

    转自:https://blog.csdn.net/babykangaroo/article/details/45795079 本文是入门学习ActiveX的学习笔记,属于系统学习整个框架部分,具体细节 ...

  7. 编写ActiveX控件及其打包方法

    1.ActiveX控件概述 ActiveX控件是基于组件对象模型 (COM) 的可重用软件组件,广泛应用于桌面及Web应用中.在Windows操作系统以OCX结尾的文件,OCX代表"对象链接 ...

  8. ActiveX 控件注册的几种方法 VC++编写

    ActiveX 控件是一个动态链接库,是作为基于COM 服务器进行操作的,并且可以嵌入在包容器宿主应用程序中,ActiveX 控件的前身就是OLE 控件.由于ActiveX 控件与开发平台无关,因此, ...

  9. ActiveX控件和它的容器

    1.COM基础 2.ActiveX控件及实现 3.ActiveX控件容器及实现 4.总结 1.COM基础 COM是一种组件开发技术, 它实际上是一种在二进制层上兼容的软件开发方法的规范. COM技术是 ...

最新文章

  1. OpenAI机械手单手轻松解魔方,背靠强化学习+新技术ADR
  2. php之类,对象(四)加载类及练习题
  3. python 中主线程结束 子线程还在运行么_python 线程之一:线程的创建、启动及运行方式
  4. android指纹fingerprint学习总结
  5. Docker中启动、终止和删除容器命令
  6. JavaScript实现唯一路径问题的动态编程方法的算法(附完整源码)
  7. 2018秋季C语言学习总结
  8. ASP.NET MVC 学习之路-5
  9. Cannot add foreign key constraint 错误
  10. 基于java jsp的铁路售票系统(火车票预订)ssh框架
  11. 模块二、添加Customer 类
  12. 快乐数-判断一个数字是否是快乐数
  13. DDNS - 动态DNS
  14. [Excel]vlookup的内在逻辑以及模糊检索
  15. matplotlib 均值_matplotlib可视化箱线图
  16. Akamai JS _abck sensor_data 源码解读第一天 纵观全文(2)
  17. 微信小程序影视评论交流平台系统毕业设计毕设(2)小程序功能
  18. 无线接入认证服务器,搭建基于AD和IAS的802.1X无线认证系统
  19. substance designer制作眼球法线
  20. 基于北向资金的择时买入卖出策略复现

热门文章

  1. java菜单动态加载功能_Javascript实现动态菜单添加
  2. raymarching算法
  3. 快速创建Angular组件并定义传参、绑定自定义事件的方法
  4. 【人尽其才】颠覆思维☞合理分配工作
  5. 在CentOS 6.3 64bit上安装MySQL for python模块
  6. ATS中开启Refer防盗链功能
  7. 在ATS 5.3.0上开启stats_over_http插件
  8. libcurl+ncurses 分段range批量下载和进度条显示源码实例
  9. 3DsMax渲染插件VRay NEXT完整的视频指南
  10. 帕斯卡三角形与道路问题