现在的位置: 首页 > 综合 > 正文

vc6.0 调用ocx控件

2018年02月12日 ⁄ 综合 ⁄ 共 5573字 ⁄ 字号 评论关闭

1.       ActiveX控件简介

         ActiveX是Microsoft对于一系列策略性面向对象程序技术和工具的称呼,其中主要的技术是组件对象模型(COM)。在有目录和其它支持的网络中,COM变成了分布式COM(DCOM)。在创建包括ActiveX程序时,主要的工作就是组件,一个可以自足的在ActiveX网络(现在的网络主要包括Windows和Mac)中任意运行的程序。这个组件就是ActiveX近控件。ActiveX是Microsoft为抗衡Sun Microsystems的JAVA技术而提出的,此控件的功能和JAVA
applet功能类似。

  如果您使用的是Windows操作系统,您或许会注意到一些以OCX结尾的文件。OCX代表“对象链接与嵌入控件”(OLE),这个技术是Microsoft提出的程序技术,用于处理桌面文件的混合使用。现在COM的概念已经取代OLE的一部分,Microsoft也使用ActiveX控件代表组件对象。

组件的一大优点就是可以被大多数应用程序再使用(这些应用程序称为组件容器)。一个COM组件(ActiveX控件)可由不同语言的开发工具开发,包括C++和Visual Basic或PowerBuilder,甚至一些技术性语言如VBScript

简单点说COM是一种技术规范,是抽象的.而ActiveX组件是遵循这种规范的一种对象类型

2.       ActiveX控件使用方法

一般步骤如下:

(1)       使用AppWizard生成支持ActiveX控件的容器应用程序,即在AppWizard向导的框架生成步骤中记得勾选“ActiveX Control”选项即可(不同的框架,在不同的位置,仔细看)

注:如果你在生成框架时忘了勾选“ActiveX Control”选项,你也可以通过手动添加来使程序支持ActiveX控件,具体做法是:在App类中的InitInstance()函数中添加下面这行代码:AfxEnableControlContainer();同时在stdafx.h中加入#include<afxdisp.h>即可

(2)       搜索需要的ActiveX控件,将ActiveX控件登记到Windows注册表中。

如果你需要的控件已经注册,那么无需这一步,已注册的控件可以通过Project->Add to project->Components and Controls选项来查看,如下图:

上面的两个文件夹里面都是已注册的控件,找到你要的控件选择Insert即可,这个下面会要说到

对于还没有注册的控件,例如自己开发出来的控件,可以借助regsvr32.exe注册,具体做法是:开始菜单->运行->regsvr32.exe 控件文件名.ocx(或者是控件文件名.dll),注意控件文件名处需要用绝对路径,例如regsvr32.exe C:/progrm files/myActiveXControl.ocx;你也可以卸载已注册的控件(也即反注册),命令格式如下:regsvr32.exe/u 控件文件名.ocx(或者是控件文件名.dll),

(3)       将已注册的控件添加到应用程序当中

如步骤二所说的,你可以打开Project->Add to project->Components and Controls选项,从中选取你需要的控件然后选择Insert即可,选择Insert后会弹出一个窗口让你选择要添加ActiveX控件的类以及类名称等,一般选择默认即可

(4)       使用ActiveX控件

通过第三步之后你就会在类视图中发现ActiveX控件的类实现已经添加进了项目中。这时你要做的是为控件分配资源标识(resource.h文件)并关联控件类成员变量,然后通过这个变量来调用空控件类提供的各种方法。为了实现控件和容器的双向交互,还需要为ActiveX控件进行事件映射,编写相应的控制函数,以对话框为例:具体做法是:在对话框头文件中添加语句:DECLARE_EVENTSINK_MAP();

在对话框的实现文件中添加以下句子:

BEGIN_EVENTSINK_MAP(CMyDlg, CDialog)

    //{{AFX_EVENTSINK_MAP(CMyDlg)

         ON_EVENT(………)

         //}}AFX_EVENTSINK_MAP

END_EVENTSINK_MAP()

这个跟消息映射原理一个样,实现函数的声明格式也和消息映射相同

(5)       运行程序,测试控件的运行效果

 

3.       例子ActiveX控件例子

上面我们已经讲解了使用ActiveX控件的一般步骤,那么我们就通过一个实例来加强对ActiveX使用的理解,下面的例子在基于对话框的程序中使用ActiveX控件中的日期控件。

(1)       生成ActiveX控件容器的应用程序

 

     

 

 

 

 

其他的选择默认即可,点击finish生成框架

(2)       添加控件到程序中

打开Project->Add to project->Components and Controls选项,选择Registered ActiveX Controls文件并双击,找到Microsoft MonthView Control 6.0 (SP6),单击选择它,然后点击Insert按钮。如下图

 

 

 

 

点击了Insert之后会弹出关于这个控件的类供用户选择,一般这些都选择默认即可,如下,选择OK按钮:

 

当插入控件之后我们来看看类视图有什么变化:

 

 

         插入日期控件前                                              插入日期控件后          

到此为止我们已经完成了日期控件的添加,下面让我们来看看如何使用这个日期控件

(3)       使用Activex控件

首先,我们注意到控件面板上多了一个新图标,那就是日期控件对应的图标:

 

 

接下来使用这个控件,ActiveX中的日期控件和其他控件,可以通过鼠标拖放来将控件添加到对话资源模板中,用鼠标调整它的大小和位置。如下图:

 

而日期控件的属性设置也和其他控件的属性设置一样,选择日期控件,点击右键选择Properties,弹出属性设置对话框,可以根据自己的需要设置不同的属性:

 

            

              再添加一个编辑框和静态文本,整体效果图如下:

           

 

 

为日期控件和编辑框添加关联变量:

      

(4)       添加ActiveX控件事件映射

为了让控件能响应对于的事件,需要将事件和对应的映射函数关联起来,这和映射windows控件消息一样。本例中我们实现的是将选择的日期显示在编辑框中。

我们先在在对话框头文件中添加事件映射声明的宏:DECLARE_EVENTSINK_MAP(),

再在对话框头文件中添加我们这个例子中需要的选择日期改变的控制函数,为:

afx_msg void OnSelChangeMonthview(DATE StartDate, DATE EndDate, BOOL FAR* Cancel);

然后在对话框的实现文件中添加事件映射的实现,为以下句子:

BEGIN_EVENTSINK_MAP(CActiveXExampleDlg, CDialog)

    //{{AFX_EVENTSINK_MAP(CActiveXExampleDlg)

       ON_EVENT(CActiveXExampleDlg, IDC_MONTHVIEW1, 4 /* SelChange */, OnSelChangeMonthview, VTS_DATE VTS_DATE VTS_PBOOL)

       //}}AFX_EVENTSINK_MAP

END_EVENTSINK_MAP()

剩下的工作就是写日期选择改变的OnSelChangeMonthview函数的实现了,如下:

void CActiveXExampleDlg::OnSelChangeMonthview(DATE StartDate, DATE EndDate, BOOL FAR* Cancel)

{

       //注意以下句子,调用ActiveX控件的函数,和自己写的类一样的调用方式

int year = m_MonthView.GetYear();

       int month = m_MonthView.GetMonth();

       int day = m_MonthView.GetDay();

       m_Edit.Format("%d 年%d 月%d日",year,month,day);

       UpdateData(false);

}

好了,我们的工作已经做完了,让我们来看看运行结果:

 

如我们预想的一样,成功啦。

 

最后面我想说的是:使用ActiveX控件并不难,关键在于你对这个控件提供的函数、成员变量了解多少以及能响应的事件等,能灵活应用。

关于Active控件的开发另见其他文章。

 
 
今天做了一下ActiveX的使用测试,总结一下:
首先使用MFC创建一个activeX的控件譬如ActiveXTest,编译成ocx并注册,然后另外编写一个测试程序来调用该控件,发现有几种方式:
 
1:使用project-->Add to Project-->Components and Controls, 然后选择要加入的ocx或者dll,系统会自动生成.cpp和.h文件.并自动加入AfxEnableControlContainer(),这样就可以使用了.
 
2:由于activeX一般都有界面,所以可以在dialog里面插入控件的方式来使用,该方式是最简单的一种。创建一个dialog,然后点击右键选择Insert ActiveX Control,在控件库里面找到刚才注册的控件,这时在Controls(按钮栏)里面会出现一个ocx的按钮,可以直接拖进去使用。这时MFC会自动产生一个类,就是包含该控件的类(CActiveXTest),同时在InitInstance()方法里面添加控件初始化函数AfxEnableControlContainer();这样就可以直接在dialog使用控件的方法了。譬如定义ocx按钮的名字为actx,则直接调用
     actx->ShowHello();
 
3:利用上述方法产生包含该控件的类(CActiveXTest),不使用dialog,这时必需手工添加包含该控件的窗体。方法是调用控件类的Create()方法。
CAcitveXText*  actx = new CAcitveXText;
if(!actx->Create("NN", WS_CHILD|WS_VISIBLE, CRect(0,0,0,0), this, IDC_ACITVEXTEXTCTRL, NULL, FALSE, NULL))
{
  TRACE0("Failed to create the FPWT Control\n");
  return;      // fail to create 
}
actx->ShowHello();
 
4:利用class wizard添加该控件时,相对比较麻烦一些。这时要在InitInstance()里面添加初始化函数AfxOleInit();
然后在使用时要调用CreateDispatch()来创建控件,然后调用。
 
 wchar_t progid[] = L"ACITVEXTEXT.AcitveXTextCtrl.1";
 CLSID clsid;
 CLSIDFromProgID(progid, &clsid);
 COleException *e = new COleException;
 _DAcitveXText dac;   //产生的类名是_DAcitveXText
 if(dac.CreateDispatch(clsid), e)
   dac.ShowHello();
 else
   throw e;
 
但是由于这时是将控件当作normal automation server来使用,必需要重载一下IsInvokeAllowed(),让它直接返回true,否则将不成功,被告之是灾难性失败,错误是编号是:8000ffff。该函数在生成ActiveX的时候重载。(不是在测试程序中)In order
to use an OLE control only as an automation server, you need to override COleControl::IsInvokeAllowed()and return TRUE.If any of the control's properties and methods should not be accessed when invoked as a normal automation server, then
that automation function could be bypassed and/or an error code can be returned when COleControl::m_bInitialized is FALSE.
 
BOOL IsInvokeAllowed (DISPID)
{
// You can check to see if COleControl::m_bInitialized is FALSE
// in your automation functions to limit access.
   return TRUE;
}
 

抱歉!评论已关闭.