- 浏览: 45147 次
- 性别:
- 来自: 河北
最新评论
ActiveX是Microsoft提出的使用组件对象模型(component object model,COM)的一种开放式技术。ActiveX与具体编程语言无关,它既包含服务器端技术,也包含客户端技术。作为针对Internet应用开发的技术,ActiveX被广泛用于Web服务器和客户端的各个方面。同时,ActiveX技术也可应用于普通的桌面应用程序设计。
1.组件和ActiveX控件
Visual C++自身提供了很多用于编程的组件(component),如Tips of the Day、Splash Screem和System Info for About Dlg等。打开Project菜单,选择Add To Project|Components And Controls项,随后就可在Components and Controls Gallery对话框看到时Registered ActiveX Controls和Visual C++ Components两个文件夹,文件夹中分别列出了用户可以使用的已注册的ActiveX控件和Visual C++组件。
例1 编写一个使用一般组件的应用程序UseComponent,程序启动时首先显示Tips of the Day(日积月累)对话框。
[编程说明与实现]
(1)利用MFC AppWizard创建一个单文档应用程序UseComponent,在向导第3步确认ActiveX Controls选项。如果在创建应用程序框架时没有选择该项,在程序中要使用ActiveX控件,必须在函数InitInstance()中加入函数AfxEnableControlContainer()的调用语句,并在预编译头文件StdAfx.h中加入语句:#include <Afxdisp.h>。
(2)选择Project|Add to Project|Components and Controls命令,在弹出的对话框中打开Visual C++ Components文件夹,选择Tips of the Day,单击Insert按钮。在随后出现的对话框中,单击OK按钮,并确定生成组件的类名和文件名。此时,就加入了组件Tips of the Day,但其中没有显示内容,需要建立一个名为Tips.txt的文件。
(3)选择Project|Add to Project|New命令,加入文本文件Tips.txt并编辑它。注意,文件Tips.txt的内容要求用回车符区分每一条Tip,每条Tip不能以空格或Tab键开头,且长度不能超过1000个字符。
编译、链接程序,运行程序后将出现Tips of the Day对话框,如图1所示。该对话框的外观属性可通过Visual C++开发环境的对话框编辑器进行修改。
在Visual C++中使用ActiveX控件与标准控件有所不同,与使用组件一样,首先需要通过Project|Add to Project|Registered ActiveX Controls命令将指定的ActiveX控件加入到对话框控件工具栏中。
ActiveX控件由属性(property)、事件(event)和方法(method)三个接口定义。属性是ActiveX控件的特性或特征,如颜色、字体、范围或一些标志等。ActiveX控件的属性主要有三种:环境属性、库存(stock)属性、自定义(custom)属性。事件是ActiveX控件为响应一些如鼠标、键盘等输入时而由控件触发的消息,ActiveX控件把这些输入翻译成事件通知,发送给容器程序。方法是ActiveX控件的成员函数,供容器程序外部调用,应用程序通过调用ActiveX控件的方法操纵控件的外观和状态。ActiveX控件的事件和方法也可以是库存的或自定义的。
ActiveX控件并不仅仅用于与用户的可视交互,它还可以用于其他用途,如访问数据库、监视数据等。ActiveX控件一般以OCX文件的形式出现,每一个ActiveX控件在被使用前都必须在Windows系统中进行注册。
2.创建ActiveX控件
Visual C++提供两个途径开发ActiveX控件:MFC和ALT(active template library)。使用MFC开发ActiveX控件比较容易,不必关心控件接口的细节,只要把注意力集中在控件本身的功能上,但生成的控件比较大。而且,客户端如果运行此ActiveX控件,必须具有相应版本MFC类库的DLL。使用ALT不涉及MFC类库,生成的控件相对较小,但开发者必须了解COM和OLE的技术细节。
在利用MFC ActiveX ControlsWizard向导创建ActieX框架时,向导自动产生三个类:COleControlModule的派生类CMyNameApp,COleControlModule是CWinApp的派生类;COleControl的派生类CMyNameCtrl,COleControl是CWnd的派生类。这里假设MyName是创建的ActiveX控件名。
向导创建的控件框架代码与一般的MFC应用程序框架有些类似,并且也利用ClassWizard添加属性、事件和方法。程序员要做的工作主要体现在CMyNameCtrl类中。编译生成OCX文件后,可以用Visual C++提供的ActiveX Test Container工具测试控件,也可以用OLE/COM Object Viewer浏览此控件的接口信息及类型库。
例2 利用MFC创建一个ActiveX控件Clock,该控件用数字时钟显示当前时间。并且,当用鼠标单击控件时,数字时钟就变成了表盘查模拟钟。
[编程说明与实现]
(1)执行File|New命令,选择Project页,选择MFC ActiveX ControlWizard项目,类型,项目名称为Clock,单击OK按钮。在向导Step of 2设置控件的数目,并选择是否需要口令、注释和帮助文件,本例选择默认值。在向导Step 2 of 2确定控件的类名Clock和文件名,选择控件属性、控件的基类,确定ActiveX高级特性。
(2)控件类CClockCtrl的OnDraw()函数用于绘制控件,但调用OnDraw()函数只能显示一次当前时间。要想使时钟走动起来,需要处理WM_TIMER消息。利用ClassWizard为类CClockCtrl添加WM_TIMER的消息处理函数OnTimer(),在函数中通过不断调用重画控件函数,从而自动调用OnDraw()函数动态显示当前时间。
void CClockCtrl::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default InvalidateControl(); //重画控件 COleControl::OnTimer(nIDEvent); }
(3)在控件窗口创建时建立定时器,利用ClassWizard为类CClockCtrl添加消息WM_CREATE的处理函数CClockCtrl::OnCreate();在控件窗口销毁时删除所建立的定时器,利用ClassWizard为类CClockCtrl添加消息DestroyWindow的处理函数。为类CClockCtrl添加属性为protected、类型为UINT的成员变量m_timer。
int CClockCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (COleControl::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here //建立定时器,时间间隔为m_updateInterval(在第5步添加该成员变量) m_timer=SetTimer(1,(UINT)m_updateInterval,NULL); return 0; }
BOOL CClockCtrl::DestroyWindow() { // TODO: Add your specialized code here and/or call the base class KillTimer(m_timer); //销毁时钟 return COleControl::DestroyWindow(); }
(4)为了在控件窗口响应单击事件,必须添加该控件事件,该事件是ActiveX控件的库存(stock)事件。启动ClassWizard,选择ActiveEvents页面,单击Add Event按钮,在打开对话框Add Event的External name下列框中选择click。库存事件不需要添加代码,ClassWizard自动在ClockCtl.cpp文件中合适位置加入以下事件映射。
EVENT_STOCK_CLICK()
再利用ClassWizard为类CClockCtrl添加单击消息OnClick的处理函数
void CClockCtrl::OnClick(USHORT iButton) { // TODO: Add your specialized code here and/or call the base class //单击控件时,切换钟表的显示方式 m_ifDigitShape=!m_ifDigitShape; //m_ifDigitShape是控件的自定义属性成员变量 InvalidateControl(); COleControl::OnClick(iButton); }
(5)显示时钟需要获取控件的背景颜色,因此为控件添加库存属性BackColor。启动ClassWizard类向导,选择Automation页面,单击Add Property按钮,在打开对话框Add Property的External name下拉框中选择BackColor,单击OK按钮。
Clock控件还需要表示显示间隔和显示方式的两个自定义属性,启动ClassWizard选择Automation页面,单击Add Property按钮,在打开对话框Add Property的External name下拉框中输入UpdateInterval(显示间隔),Type选择Long,Implementation选择Member Variable。向导将自动加入属性变量m_updateInterval和处理属性的成员函数。用同样方法加入自定义属性IfDigitShape(显示方式),其类型为BOOL。
(6)程序员编程使用ActiveX控件时,与标准控件一样,可打开控件属性对话框设置ActiveX控件的属性。ActiveX控件属性对话框包含多个属性页(property page)。利用MFC ActiveX Control Wizard创建ActiveX控件时,已经提供了默认的属性页。在创建的Clock控件中,除子默认的General属性页,还要加入Color属性页。在ClockCtl.cpp中找到说明Property Pages的宏,进行如下修改:
BEGIN_PROPPAGEIDS(CClockCtrl, 2) //2表示共两个属性页 PROPPAGEID(CClockPropPage::guid) PROPPAGEID(CLSID_CColorPropPage) //颜色属性页码 END_PROPPAGEIDS(CClockCtrl)
(7)为了使控件能够保存设置的属性,需向DoProExchange()函数添加如下代码。
void CClockCtrl::DoPropExchange(CPropExchange* pPX) { ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor)); COleControl::DoPropExchange(pPX); PX_Bool(pPX,"IfDigitShape",m_ifDigitShape,TRUE); PX_Long(pPX,"UpdateInterval",m_updateInterval,1000); // TODO: Call PX_ functions for each persistent custom property. }
(8)在ClockCtl类的构造函数中添加代码,初始化控件大小。
CClockCtrl::CClockCtrl() { InitializeIIDs(&IID_DClock, &IID_DClockEvents); //通知控件要用的IIDS的基类 SetInitialSize(150,120); //设置控件在容器中第一次显示时的大小150*120 // TODO: Initialize your control's instance data here. }
(9)OnDraw()函数用于绘制控件,即显示时间。在OnDraw()函数中调用了一些数学函数,因此需在ClockCtl.cpp文件开始位置添加包含文件语句:#include "math.h"。
以下是OnDraw()函数的完整代码。
void CClockCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid) { // TODO: Replace the following code with your own drawing code. //pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH))); //pdc->Ellipse(rcBounds); CRect Rect; ::GetClientRect(this->m_hWnd,&Rect); int nCenterX=Rect.right/2; int nCenterY=Rect.bottom/2; pdc->SetTextColor(TranslateColor(GetForeColor())); pdc->SetBkMode(TRANSPARENT); //将控件背景颜色设置为透明方式 //建立一具刷子,该画刷的颜色为背景所设置的颜色 CBrush* pBrush=new CBrush(TranslateColor(GetBackColor())); pdc->FillRect(&Rect,pBrush); delete pBrush; CFont* pOldFont; pOldFont=SelectStockFont(pdc); //选择库存字体 CTime Time=CTime::GetCurrentTime(); //获取当前时间 if(m_ifDigitShape) //如果是数字时钟,在表盘中以电子表的方式显示当前时间 { CString CurrentTime=Time.Format("%B:%d:%Y %H:%M:%S"); pdc->ExtTextOut(rcBounds.left,rcBounds.top,ETO_CLIPPED,rcBounds,CurrentTime,strlen(CurrentTime),NULL); } else //模拟时钟的方式显示当前时间 { CString strDigits; int i,x,y; CSize size; CPen pen(PS_SOLID,5,RGB(0,0,255)); //创建一支蓝笔来绘制椭圆 CPen* pOldPen=pdc->SelectObject(&pen); //将新笔选入设备描述表 pdc->Ellipse(5,5,Rect.right-5,Rect.bottom-5); //绘制时钟边界 double Radians; pdc->SetTextColor(RGB(255,0,0)); //时钟上的文字选择红色 for(i=1;i<=12;i++) { strDigits.Format("%d",i); //对输出的时钟数字进行格式化 //获得时钟数值的范围,以便计算中心 size=pdc->GetTextExtent(strDigits,strDigits.GetLength()); Radians=(double)i*6.28/12.0; //计算文本输出的位置 x=nCenterX-(size.cx/2)+(int)((double)(nCenterX-20)*sin(Radians)); y=nCenterY-(size.cy/2)+(int)((double)(nCenterY-20)*cos(Radians)); pdc->TextOut(x,y,strDigits); //显示钟表盘上的数字 } Radians=(double)Time.GetHour()+(double)Time.GetMinute()/60.0 +(double)Time.GetSecond()/3600.0; //计算时针半径 Radians*=6.28/12.0; CPen HourPen(PS_SOLID,5,RGB(0,255,0)); //创建绘制时针的画笔 pdc->SelectObject(&HourPen); //将该笔选入设备描述表 pdc->MoveTo(nCenterX,nCenterY); //绘制时针 pdc->LineTo(nCenterX+(int)((double)(nCenterX/3)*sin(Radians)), nCenterY-(int)((double)(nCenterY/3)*cos(Radians))); Radians=(double)Time.GetMinute()+(double)Time.GetSecond()/60.0; //计算分针半径 Radians*=6.28/60.0; CPen MinutePen(PS_SOLID,3,RGB(255,255,0)); //创建绘制分针的画笔 pdc->SelectObject(&MinutePen); //将该笔选设备描术述表 pdc->MoveTo(nCenterX,nCenterY); //绘制分针 pdc->LineTo(nCenterX+(int)((double)((nCenterX*2)/3)*sin(Radians)), nCenterY-(int)((double)((nCenterY*2)/3)*cos(Radians))); Radians=(double)Time.GetSecond(); //计算秒针半径 Radians*=6.28/60.0; CPen SecondPen(PS_SOLID,1,RGB(0,255,255)); //创建绘制秒针的画笔 pdc->SelectObject(&SecondPen); //将该笔选入设备描述表 pdc->MoveTo(nCenterX,nCenterY); //绘制秒针 pdc->LineTo(nCenterX+(int)((double)((nCenterX*4)/5)*sin(Radians)), nCenterY-(int)((double)((nCenterY*4)/5)*cos(Radians))); pdc->SelectObject(pOldPen); //恢复设备描述表中的旧笔 } }
执行Build(F7)编译、链接命令将创建Clock.ocx文件,并自动注册ActiveX控件。简单起见,可以直接利用工具ActiveX Control Test Container测试Clock控件,打开Visual C++主菜单Tools就能找到时测试容器。在测试容器中执行Edit|Insert New Control命令,找到Clock控件并放入容器中。当单击时钟时,时钟就在数字时钟和圆形表盘模拟钟两种方式之间进行变换。利用工具ActiveX Control Test Container还可测试控件的属性、事件和方法使用的效果,如执行Edit|properties命令,打开Clock Control属性对话框,在Color页面选择需要的颜色后单击“确定”按钮就可设置背景颜色。
3.ActiveX控件的使用
在Visual C++中使用ActiveX控件时,首先需要通过Project|Add to Project|Registered ActiveX Controls命令将ActiveX控件加入到控件工具栏中,然后可以像添加普通控件一样将ActiveX控件添加到自已的对话框,并设置ActiveX的属性。区别于Windows普通控件,ActiveX控件可以嵌入到其他的ActiveX控件容器中,如Internet Explorer、Visual Basic、Java和Access等应用程序。
为了使用ActiveX控件,最好将设计好的ActiveX控件重新注册到Windows系统。首先将Clock.ocx文件复制到Windows复制到Windows系统目录System。启动ActiveX Control Test Container,执行File|Register Controls命令,执行File|Register Controls命令,出现阶段Register Controls对话框。单击Register按钮,打开Open对话框,选择刚复制到Windows系统目录System中Clock.ocx文件,单击Open按钮将自动注册Clock控件。在Registerd对话框中将看到时注册成功的Clock.ocx文件。
例4 在Internet Explore中,测试ActiveX控件的使用。
[具体代码]
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>测试ActiveX控件(Clock)</title> </head> <body> <p align="center"> <object classid="clsid:C96973F8-AAE0-4243-9DA8-1BB91EA1768B" id="UpDown1"> <param name="Value" value="0"> <param name="Acceleration" value="0"> <param name="Alignment" value="1"> <param name="AutoBuddy" value="0"> <param name="BuddyDispid" value="-1"> <param name="BuddyIndex" value="-1"> <param name="OrigLeft" value="0"> <param name="OrigTop" value="0"> <param name="OrigRight" value="0"> <param name="OrigBottom" value="0"> <param name="Increment" value="1"> <param name="Max" value="10"> <param name="Min" value="0"> <param name="Orientation" value="0"> <param name="SyncBuddy" value="0"> <param name="Wrap" value="0"> <param name="BuddyProperty" value="-1"> <param name="Enabled" value="1"> <param name="OLEDropMode" value="0"> </object> <br/><br/> <font color="#FF0000">在HTML网页中嵌入ActiveX控件</font> </p> </body> </html>
- UseComponent.rar (1.9 MB)
- 描述: 使用一般组件的实例
- 下载次数: 108
- Clock.rar (2.2 MB)
- 描述: 创建ActiveX控件的实例
- 下载次数: 193
发表评论
-
MFC的打印
2009-05-24 17:05 0虽然Windows通过 ... -
多线程
2009-05-22 18:57 0Windows对CPU的管理的采取时间片分配的方式 ... -
动态链接库DLL
2009-05-22 14:38 0为了提高系统 ... -
异常处理
2009-05-21 19:06 2056异常(exception)是指在程序运行过程中发生 ... -
MFC ODBC数据库类
2009-05-20 19:44 73421.ODBC概述 ... -
对话框高级编程---公共控件之四(树视控件)
2009-05-19 21:45 2343树视(tree view)控 ... -
对话框高级编程---公共控件之四(列表视控件)
2009-05-19 14:01 0列表视(list view)控件也称列表控件,属 ... -
对话框高级编程---公共控件之三(图像列表)
2009-05-18 21:22 0图像列表(image list)是一个由一些大小相同 ... -
对话框高级编程---公共控件之二(标签控件和属性表)
2009-05-18 20:33 35121.标签控件 标签(tab)控件也 ... -
对话框高级编程---公共控件之一(旋转按钮、滑块和进度条)
2009-05-18 11:09 01.旋转按钮 ... -
对话框高级编程---通用对话框
2009-05-17 21:17 17841.通用对话框概 ... -
对话框高级编程---非模态对话框
2009-05-16 21:39 0尽管不同对话 ... -
图形处理---位图、图标和光标
2009-05-16 20:33 21681.位图 例1 编写一个应用程序MyB ... -
图形处理---位图,图标和光标
2009-05-16 20:16 01.位图 例1 编写一个应用程序MyBMP ... -
图形处理---位图、图标和光标
2009-05-16 19:58 01.位图 例1 编写一个应用程序MyBMP ... -
文本与字体
2009-05-16 16:23 01.绘制文本 以图形方式进行文本的输 ... -
图形处理---基本几何图形的绘制
2009-05-15 21:27 0获取设备环境、设置绘图属性和选择GDI绘图对象后,就 ... -
图形处理---画笔和画刷
2009-05-15 17:30 0进行绘图除了需 ... -
图形处理---颜色的设置
2009-05-15 16:08 0在绘制图形时,颜色是一个需要考虑的因素。Window ... -
用CDC绘制简单图形
2009-05-14 20:47 0绘图 1. 几种不同设备环境 MFC的CDC类封装了设 ...
相关推荐
这个生成的控件承载 ActiveX 控件并将其属性、方法和事件公开为生成控件的属性、方法和事件。 如果不包装一下直接用,会出现 灾难性 错误。上面已经说明了原因。 在项目中引用生成的ax开头的dll,在窗体代码中增加:...
ImageViewer ActiveX控件 是一个ActiveX 控件,您可以利用它在您开发的程序中集成图片浏览功能,支持大部分常见的图片格式,可用于Microsoft Visual Studio,Microsoft Office 和 Borland Delphi。 <br> ...
ActiveX控件的使用与开发 ActiveX控件的使用与开发 ActiveX控件的使用与开发
Visual Basic编程晋级:ActiveX控件 ======================================================== Visual Basic编写ActiveX控件最好的一本参考书 可编写 ActiveX控件是 Visual Basic 5.0/6.0或以上版本提供的一个...
ActiveX控件加载外部dll及html测试Demo 用VC2010编写,自已测试成功 Test.html为测试ActiveX控件页面 TestDll是dll动态库 Loaddll是测试TestDll的Demo FROMYANTAI为ActiveX控件,加载外部库TestDll,使用VC STL项目
Panopticum Lens Pro III ActiveX控件 是一个支持Adobe Photoshop 5.x及更高版本的附加模块。它帮助用户创建各式各样的滤镜效果,水晶和玻璃表面。这个模块是众多做玻璃物体和样式效果的集合。调整透镜和水晶的...
全功能ActiveX控件参考手册,activeX 控件开发参考
Excel OCX 是一个功能强大的ActiveX控件,用Visual Basic 6.0编写, (保证最大的兼容性,易用性和高效率),能在Excel 和 Visual Basic之间交换数据,在Excel里创建专业的报告等。在Visual Basic应用程序里使用Excel...
ActiveX控件注册的几种方法使用Regsvr32.exe程序 对ActiveX控件进行注册
一个简单的ActiveX控件——详尽教程
Active Audio Record ActiveX控件 可以直接录制声音为MP3、WAV、wma 、ogg、au、aiff 和vox格式的音频文件。您可以通过设置内码参量完全控制音像文件的质量。 <br> Active Audio Record ActiveX控件 支持...
Activex控件签名工具, 微软提供了两套签名工具, 1)signcode.exe, 从1998年开始使用,随.NET Framework SDK发布。 signcode.exe 数字签名工具 makecert.exe 创建数字证书 cert2spc.exe 将数字证书转化为软件...
大华摄像头ActiveX控件
[001]VC++编写ActiveX控件详解.zip上位机开发VC串口学习资料源码下载[001]VC++编写ActiveX控件详解.zip上位机开发VC串口学习资料源码下载[001]VC++编写ActiveX控件详解.zip上位机开发VC串口学习资料源码下载[001]...
VB6.0动态加载ActiveX控件漫谈 深圳 罗汉军 罗德昌 熟悉VB的朋友对使用ActiveX控件一定不会陌生,众多控件极大地方便了编程, 但唯一的缺陷是不能动态加载控件,必须在设计时通过引用,将控件放置在窗体上。 VB6.0...
ActiveX控件ActiveX控件
用C#编写ActiveX控件(二) Homer 在我的上一篇blog中,已经实现了一个最基本的ActiveX控件。当然,我们编写的任务还没有完成。首先,我们先尝试实现和JS的交互能力。 我们在Demo中加入...
Allen-Martin AmWave Pro ActiveX控件 用于播放和录制音频文件,能播放安装在PC上的与Windows ACM (Audio Compression Manager)相关的所有格式,包括PCM、RIFF-MP3、ADPCM、GSM、CCIT A Law 和Law、 True ...
使用C_开发ActiveX控件使用C_开发ActiveX控件使用C_开发ActiveX控件