使用ActiveX控件的问题

自从Microsoft最早在1996年3月的Internet专业开发人员研讨会上提出ActiveX一词以来,到今天已有无数公司的无数产品中涉及了ActiveX技术,而作为ActiveX技术之一的ActiveX控件,更是得到广大开发者的青睐。那么,到底什么是ActiveX控件呢?
一方面,它表示将你带向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 控件包容器就是完全支持ActiveX控件,并能把控件组合进自己的窗口或对话框的父应用程序。利用MFC的AppWizard,你可以很方便地创建你的包容器程序。事实上,在用AppWizard创建新的应用程序时,你的应用程序就被缺省设置为控件包容器,即使你在创建过程中没有加入ActiveX控件支持,以后也可以手动地进行更改。
1、在项目的应用类的.cpp文件(本例中为test.cpp)的Initinstance函数中加入对函数AfxEnableControlContainer()的调用,如下所示:

BOOL CTestApp::InitInstance()

{

AfxEnableControlContainer();

...

}

2、在项目中的STDAFX.H头文件中加入如下代码:#include <afxdisp.h> 然后重新链接项目即可。
二.在非对话框容器中使用ActiveX控件
在使用一个已注册的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);

三、在对话框中使用运行时不可见的ActiveX控件
通常情况下,我们可以用两种方法来存取对话框中的控件:
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控件大大地简化了开发者的工作,灵活地使用控件能使开发者高效地开发出各种软件。以上是笔者在使用控件的过程中总结出的一些实践经验,希望对大家有所帮助。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值