利用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,如图(1)所示。按Next继续,出现 ATL Object Wizard属性对话框,如图(2),在Names选项卡中,我们只需要在Short Name 编辑框输入CircleCtl即可,其它系统就会自动给定,也可以修改,我们这里保持系统给定状态;在Attributes 选项卡中,选择 Support ISupportErrorInfo 和 Support Connection Points 两个复选框,这两项分别支持出错信息和连接点;Miscellaneous选项卡保持默认设置;Stock Properties中我们把FillColor添加到支栏中,确定之后就把该控件加到项目中了。

图1 图2
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中添加如下变量:
然后修改OnDraw函数,在该绘制函数中,使用 Windows API中标准的HDC、HPEN、HBRUSH以及SelectObject、Ellipse等结构和函数来实现绘制的。例如:
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函数部分代码如下:
至此,可以在ActiveX Control Test Container中测试该控件。
网页中使用ActiveX控件
在控件生成时,系统同时生成了一个CircleCtl.htm文件,在VC编辑环境下打开该文件,在和之间加上如下的VBScript:
注意保存。然后在“我的电脑”中打开该htm文件,用鼠标单击圆,半径变大,右击圆半径变小。
结束语
本文介绍了基于ATL技术以及使用该技术实现了一个简单的圆的控件CircleCtl并且介绍了其在网页中的使用。ActiveX控件作为可重用的代码组件,不仅应用广泛,还可节约开发时间。它将大量的实现细节隐藏起来,以简明的接口与用户名交互,易于使用。对ActiveX技术的研究已经成为当今软件业的热点和潮流。进入讨论组讨论。
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,如图(1)所示。按Next继续,出现 ATL Object Wizard属性对话框,如图(2),在Names选项卡中,我们只需要在Short Name 编辑框输入CircleCtl即可,其它系统就会自动给定,也可以修改,我们这里保持系统给定状态;在Attributes 选项卡中,选择 Support ISupportErrorInfo 和 Support Connection Points 两个复选框,这两项分别支持出错信息和连接点;Miscellaneous选项卡保持默认设置;Stock Properties中我们把FillColor添加到支栏中,确定之后就把该控件加到项目中了。

图1 图2
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中标准的HDC、HPEN、HBRUSH以及SelectObject、Ellipse等结构和函数来实现绘制的。例如:
| // 创建画笔和画刷并选中颜色画圆 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技术的研究已经成为当今软件业的热点和潮流。进入讨论组讨论。
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
相关专题
·VC++动态链接库(DLL)编程深入浅出(二) (12257次浏览)
·VC++动态链接库(DLL)编程深入浅出(一) (11493次浏览)
·VC++动态链接库(DLL)编程深入浅出(三) (8377次浏览)
·深入浅出VC++串口编程之基于控件 (3136次浏览)
·深度解析VC中的消息传递机制 (2910次浏览)
·应用MFC开发高级应用程序 (2736次浏览)
·在VC中链接动态链接库的方法简要说明 (1328次浏览)
·用MFC ODBC操作Access数据库 (1228次浏览)
·最常见的20种VC++编译错误信息集合 (1195次浏览)
·制作HTML帮助 (1130次浏览)
·VC++动态链接库(DLL)编程深入浅出(一) (11493次浏览)
·VC++动态链接库(DLL)编程深入浅出(三) (8377次浏览)
·深入浅出VC++串口编程之基于控件 (3136次浏览)
·深度解析VC中的消息传递机制 (2910次浏览)
·应用MFC开发高级应用程序 (2736次浏览)
·在VC中链接动态链接库的方法简要说明 (1328次浏览)
·用MFC ODBC操作Access数据库 (1228次浏览)
·最常见的20种VC++编译错误信息集合 (1195次浏览)
·制作HTML帮助 (1130次浏览)
·属性表标签上的位图在MFC,CB下的实现 10-09
·采用 MFC 编制 MVC 模式之球体演示程序 10-09
·MFC架构下的DirectX8 10-09
·用VC++创建自定义向导程序 10-09
·VC++中的函数调用惯例 10-09
·VC++中的自定义消息 10-09
·一个在MFC环境中使用的 InfoZip打包类 10-09
·VC++中如何使文件夹浏览呈现新界面 10-09
·MFC Activex 录音机控件 10-09
·MFC程序员的WTL指南(1)中文版序言 10-09
·采用 MFC 编制 MVC 模式之球体演示程序 10-09
·MFC架构下的DirectX8 10-09
·用VC++创建自定义向导程序 10-09
·VC++中的函数调用惯例 10-09
·VC++中的自定义消息 10-09
·一个在MFC环境中使用的 InfoZip打包类 10-09
·VC++中如何使文件夹浏览呈现新界面 10-09
·MFC Activex 录音机控件 10-09
·MFC程序员的WTL指南(1)中文版序言 10-09
最新论坛文章
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
站内频道文章精选
百度推荐,商机无限
搜索您感兴趣的内容



