- 浏览: 45962 次
- 性别:
- 来自: 河北
最新评论
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 2122异常(exception)是指在程序运行过程中发生 ... -
MFC ODBC数据库类
2009-05-20 19:44 74931.ODBC概述 ... -
对话框高级编程---公共控件之四(树视控件)
2009-05-19 21:45 2375树视(tree view)控 ... -
对话框高级编程---公共控件之四(列表视控件)
2009-05-19 14:01 0列表视(list view)控件也称列表控件,属 ... -
对话框高级编程---公共控件之三(图像列表)
2009-05-18 21:22 0图像列表(image list)是一个由一些大小相同 ... -
对话框高级编程---公共控件之二(标签控件和属性表)
2009-05-18 20:33 35561.标签控件 标签(tab)控件也 ... -
对话框高级编程---公共控件之一(旋转按钮、滑块和进度条)
2009-05-18 11:09 01.旋转按钮 ... -
对话框高级编程---通用对话框
2009-05-17 21:17 18201.通用对话框概 ... -
对话框高级编程---非模态对话框
2009-05-16 21:39 0尽管不同对话 ... -
图形处理---位图、图标和光标
2009-05-16 20:33 22121.位图 例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控件可以看作是小型可执行程序,用户可以在网页中嵌入这些控件来实现特定功能,如播放视频、编辑文档等。 ### 1. ActiveX控件的组成与结构 ActiveX控件是由DLL(Dynamic Link Library)文件组成的,这些...
使用C#开发ActiveX控件(含示例教程)源码 功能介绍: ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动态处理...
在MATLAB图形用户界面(GUI)设计中使用ActiveX控件的知识点涵盖了以下几个方面: 1. MATLAB的图形用户界面开发环境(GUIDE):GUIDE是一个集成在MATLAB中的工具,用于设计图形用户界面。它提供了一个可视化的界面设计...
在IT领域,ActiveX控件是一种由微软开发的技术,它允许开发者创建交互式的网页和应用程序。ActiveX控件是基于COM(Component Object Model)组件模型的,这些控件可以在Internet Explorer浏览器中运行,提供诸如...
### Java调用ActiveX控件:深入解析与实践 #### 引言 在Web开发的早期阶段,跨平台兼容性是一大挑战。为了解决这一问题,开发者们探索了多种技术,其中一种便是通过Java调用ActiveX控件。本文将深入探讨如何在Java...
### 一个简单的ActiveX控件——详尽教程 在深入探讨如何开发一个简单的ActiveX控件之前,让我们先了解ActiveX控件的基本概念。ActiveX控件是一种可以在多个应用程序之间共享的软件组件,它们通常用于扩展Web浏览器...
海康摄像机ActiveX控件是一款专为海康威视摄像机设计的OCX(OLE控件)组件,主要用于在Windows操作系统中实现对海康威视设备的远程访问和控制。ActiveX技术是微软推出的一种应用程序接口(API),它允许开发者创建可...
这个生成的控件承载 ActiveX 控件并将其属性、方法和事件公开为生成控件的属性、方法和事件。 如果不包装一下直接用,会出现 灾难性 错误。上面已经说明了原因。 在项目中引用生成的ax开头的dll,在窗体代码中增加:...
大华摄像头ActiveX控件是专为视频监控设备,如大华摄像头,设计的一种软件组件。ActiveX技术是由微软公司开发的一种对象链接和嵌入(OLE)技术,它允许开发者创建交互式、可定制的控件,这些控件可以在支持ActiveX的...
使用 ATL 和 MFC 创建 ActiveX 控件 C 语言教程 在本文中,我们将讨论如何使用 ATL 和 MFC 创建 ActiveX 控件。ActiveX 控件是基于 COM 对象模型的控件,使得控件能够被客户端代码所调用。在创建 ActiveX 控件时,...
### IE提示限制脚本或ActiveX控件运行的解决方案 在使用Internet Explorer浏览器访问某些包含脚本或ActiveX控件的网页时,用户可能会遇到一个警告提示:“Internet Explorer已限制此网页运行脚本或ActiveX控件”,...
ActiveX 控件使用说明 ActiveX 控件是嵌入在网页中的应用程序,用户可以在 IE 浏览器中输入设备的 IP 地址,然后通过 ActiveX 控件来控制设备各种操作。下面将详细介绍 ActiveX 控件的安装和使用方法。 一、安装 ...
在IT领域,ActiveX控件和VC++编程是两个重要的概念,它们经常结合在一起用于创建交互式的Windows应用程序。本文将深入探讨这两个主题以及如何在VC++环境中开发和使用ActiveX控件。 首先,ActiveX控件是Microsoft...
在计算机编程与系统管理领域中,ActiveX控件是一种重要的组件,它被广泛应用于Microsoft Windows操作系统中,用于提供跨应用的复用功能。ActiveX控件能够封装复杂的代码逻辑,使得不同应用程序之间可以共享功能模块...
ActiveX控件是微软在Internet Explorer浏览器中引入的一种技术,用于增强网页的交互性和功能。在Web开发的早期,ActiveX被广泛应用于提供多媒体内容、软件下载、在线应用程序以及各种定制的用户界面元素。本文将深入...
ActiveX控件可以在多种应用程序之间共享,实现代码重用和功能扩展。为了使ActiveX控件能够在系统中正常工作,必须先对其进行注册。本文将详细介绍几种常用的ActiveX控件注册方法。 #### 1. 使用`Regsvr32.exe`程序...
### Excel打开提示:“此工作簿已丢失其VBA项目,ActiveX控件”解析与解决方案 #### 一、问题背景及现象 在使用Excel时,可能会遇到一个较为特殊且令人困惑的问题——“此工作簿已丢失其VBA项目,ActiveX控件”。...
在本文中,我们将深入探讨如何在Visual Studio 2015 (VS2015) 中使用MFC ActiveX技术,特别是在一个对话框中嵌入并调用另一个ActiveX控件。MFC(Microsoft Foundation Classes)是微软提供的一套C++类库,用于简化...
在使用Visual Studio 2015开发涉及到ActiveX控件的应用程序时,用户可能会遇到一个常见的错误提示:“未在此计算机上注册activex控件”。这个错误通常发生在尝试打开包含ActiveX控件的用户界面文件(如Form或Dialog...