基于VC++中ATL创建ActiveX控件的探讨

翻译|其它|编辑:郝浩|2007-10-08 10:05:03.000|阅读 1327 次

概述:

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

ActiveX  控件是微软公司提供的功能强大的程序设计和开发技术,是  COM  组件开发技术的重要组成部分。它是  OLE  的第三个版本,对原先  OLE  控件的最大扩展是增加了  Internet  功能,它不仅可以在支持  OLE  控件的容器中使用,更可以作为一个Internet控件,直接成为网页的一部分。另外,ActiveX  控件作为一种可重用的组件,相当于一个封装好的代码模块,它是通过其方法、属性、事件来与应用程序进行通信的,此外,ActiveX  控件是与开发语言无关的。用户在使用控件时不必考虑它是  VC  还是用  VB  等其它语言开发的,应用程序都是通过  COM  与控件进行通信的。可见,任何支持  ActiveX  控件的软件平台上都可以使用  ActiveX  控件,它使得不同厂商所开发的控件可以真正地组装在一起,从而令软件的生产过程类似于硬件业的各个插件的装配过程一样,实现了软件的工业化,大大降低了软件的开发成本,极大地提高了软件的生产效率,实现了软件资源的共享。

 

ATL  技术

1)ATL

ATL    ActiveX Template Library  的缩写,它是一套  C++模板库。使用  ATL  能够快速地开发出高效、简洁的代码(Effective and Slim code),同时对  COM  组件的开发提供最大限度的代码自动生成以及可视化支持。从  Microsoft Visual C++ 5.0版本开始,Microsoft    ATL  集成到  Visual C++开发环境中。目前,ATL  已经成为  Microsoft  标准开发工具中的一个重要成员,日益受到  C++开发人员的重视。

  ATL  产生以前,开发  COM  组件的方法主要有两种:一是使用  COM SDK  直接开发  COM  组件,另一种方式是通过  MFC  提供的  COM  支持来实现。

直接使用  COM SDK  开发  COM  组件是最基本也是最灵活的方式。但是,这种开发方式的难度和工作量都很大,一方面,要求开发者对于  COM  的技术原理具有比较深入的了解,另一方面,直接使用  COM SDK  要求开发人员自己去实现  COM  应用的每一个细节,完成大量的重复性工作。

使用  MFC  提供的  COM  支持开发  COM  应用可以说在使用  COM SDK  基础上提高了自动化程度,缩短了开发时间。MFC  采用面向对象的方式将  COM  的基本功能封装在若干  MFC    C++类中,开发者通过继承这些类得到  COM  支持功能。但使用  MFC  开发的  COM  组件,尤其是  ActiveX  控件的开发,会产生相当大的代码冗余,而且必须要依赖于  MFC  的运行时刻库才能正确地运行。

ATL  技术是目前开发  COM  组件的一种比较理想的技术。ATL  中所使用的基本技术包括  COM  技术、C++模板类技术(Template)以及  C++多继承技术(Multi-Inheritance)

 

2) ATL  的基本使用

使用  ATL  开发一个  COM  应用基本可以分为以下几个步骤:

(1)创建一个新的  ATL  工程,并对工程的选项进行适当的配置。

(2)向新创建的工程添加新的  ATL  类,并对该类进行一些初始配置工作。

(3)根据  COM  应用的基本要求向新的  ATL  类加入新的接口定义,并实现相应的接口成员函数。

(4)编译连接工程,注册  COM  应用。

 

利用  ATL  技术创建  ActiveX  控件  CircleCtl

 

1) 创建  ATL  项目

使用  ATL COM AppWizard  创建  ATL  框架为该项目命名为  Circle,按照向导提示向下做,采用默认设置,  Server Type  类型为  Dynamic Link Library(DLL)

 

2)   ATL  项目添加  ActiveX  控件

首先从  Insert  菜单项中选择  New ATL Object…调出  ATL Object Wizard  对话框,然后左边  Category  列表选择  Object,右边相应地选择  Full Control。按  Next  继续,出现  ATL Object Wizard  属性对话框,在  Names  选项卡中,我们只需要在  Short Name  编辑框输入  CircleCtl  即可,其它系统就会自动给定,也可以修改,我们这里保持系统给定状态;  Attributes  选项卡中,选择  Support ISupportErrorInfo    Support Connection Points  两个复选框,这两项分别支持出错信息和连接点;Miscellaneous  选项卡保持默认设置;Stock Properties  中我们把  FillColor  添加到支栏中,确定之后就把该控件加到项目中了。

 

3)  ActiveX  控件添加自定义属性

现在来添加  Circle  控件的一个基本属性——Radius

  Workspace Windows    Class View  状态下,右击  ICircleCtl  接口,选择  Add Property,属性类型为  short,名为  Radius,参数为空。系统会自动生成  get_Radius    put_Radius  两个成员函数。在  CCircleCtl  中添加  m_radius  变量,用来存储半径。在  CCircleCtl  的构造函数中将其初始化为50,并在  get_Radius  函数中添加*pVal=m_radius;   put_Radius  函数中添加  m_radius=newVal; FireViewChange();用来及时更新视图。对于  Radius  的属性,我们通过修改控件的绘制代码来使它起作用。

 

4) 修改  ActiveX  控件的绘制代码实现属性交换

首先,在  CCircleCtl  的构造函数中对绘制圆的填充色进行初始化,将它的初始值设为红色,即m_clrFillColor=RGB(255,0, 0)

接下来,我们需要几个全局变量来保存控件区域的信息,在  CircleCtl.h  中添加如下变量:

  static POINT CenterPt;
  static long RectHt = 0;
  static long RectWd = 0;

然后修改  OnDraw  函数,在该绘制函数中,使用  Windows API  中标准的  HDCHPENHBRUSH  以及  SelectObjectEllipse  等结构和函数来实现绘制的。例如:

  // 创建画笔和画刷并选中颜色画圆
  hPen = (HPEN)GetStockObject(BLACK_PEN);
  hOldPen = (HPEN)SelectObject(hdc, hPen);
  hBrush = (HBRUSH)GetStockObject(WHITE_BRUSH);
  hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);
  hBrush = CreateSolidBrush(colFore);
  SelectObject(hdc, hBrush);
  Ellipse (hdc, (CenterPt.x - m_radius), (CenterPt.y - m_radius), (CenterPt.x +m_radius),(CenterPt.y+ m_radius));

 

5)   ActiveX  控件添加事件

现在将向  ATL  控件中添加  Click    RClick  事件。如果用户在矩形区内点击,则会激发相应事件。现在要向  ICircleCtlEvents  接口添加  Click  方法,首先在“ClassView”中选中“ICircleCtlEvents”右击,选择  Add Method,出现如下对话框,并按下图设置,最后点“OK”按钮就可以添加  Click  事件的实现方法。用同样的方法添加  RClick  事件,参数与  Click  事件一致。接下来我们要为控件实现连接点接口  IConnectionPoint  和连接点容器接口  IConnectionPointContainer。编译好  Circle.idl  文件,生成对应的  Circle.tlb,在“ClassView”中选中“CCircleCtl”,右击,在  Popup  菜单中选择“Implement Connection Point”命令,在弹出的对话框中选中“_ICircleCtlEvents”接口。在类中定义了以两个坐标为参数的  Fire_Click    Fire_RClick  方法,调用这两个方法就可以在控件中激发响应的事件。

最后,添加激发事件的代码,我们分别在鼠标左键和右键按下的消息响应中进行处理,激发响应的事件,例如  OnLButtonDown  函数部分代码如下:

  WORD xPos = LOWORD(lParam); //鼠标水平坐标
  WORD yPos = HIWORD(lParam); // 鼠标垂直坐标
  Fire_Click (xPos, yPos); //执行触发函数

至此,可以在  ActiveX Control Test Container  中测试该控件。

网页中使用  ActiveX  控件

在控件生成时,系统同时生成了一个  CircleCtl.htm  文件,在  VC  编辑环境下打开该文件,在和之间加上如下的  VBScript:

SCRIPT LANGUAGE="VBScript"
!--
Sub CircleCtl_Click(x, y)
 If CircleCtl.Radius 100 Then
  CircleCtl.Radius = CircleCtl.Radius+1 ‘半径加1
 Else
  MsgBox(“Radius must be less than 100!”)
 End If
End Sub
Sub CircleCtl_RClick(x, y)
 If CircleCtl.Radius =1 Then
  CircleCtl.Radius = CircleCtl.Radius-1 ‘半径减1
 Else
  MsgBox(“Radius mustn’t be less than 0!”)
 End If
End Sub
--

/SCRIPT

注意保存。然后在我的电脑中打开该  htm  文件,用鼠标单击圆,半径变大,右击圆半径变小。 

结束语

本文介绍了基于  ATL  技术以及使用该技术实现了一个简单的圆的控件  CircleCtl  并且介绍了其在网页中的使用。ActiveX  控件作为可重用的代码组件,不仅应用广泛,还可节约开发时间。它将大量的实现细节隐藏起来,以简明的接口与用户名交互,易于使用。对  ActiveX  技术的研究已经成为当今软件业的热点和潮流。


标签:

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

文章转载自:CSDN

为你推荐

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


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP