`
fpwjp
  • 浏览: 45962 次
  • 性别: Icon_minigender_1
  • 来自: 河北
社区版块
存档分类
最新评论

ActiveX控件

    博客分类:
  • C++
阅读更多

      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
  • 描述: 在HTMl文件中嵌入Clock控件.bmp
  • 大小: 35 KB
  • Clock.rar (2.2 MB)
  • 描述: 创建ActiveX控件的实例
  • 下载次数: 193
分享到:
评论

相关推荐

    ActiveX控件的使用与开发

    ActiveX控件可以看作是小型可执行程序,用户可以在网页中嵌入这些控件来实现特定功能,如播放视频、编辑文档等。 ### 1. ActiveX控件的组成与结构 ActiveX控件是由DLL(Dynamic Link Library)文件组成的,这些...

    使用C#开发ActiveX控件(含示例教程)源码20130626

    使用C#开发ActiveX控件(含示例教程)源码 功能介绍: ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动态处理...

    在MATLAB图形用户界面设计中使用ActiveX控件.pdf

    在MATLAB图形用户界面(GUI)设计中使用ActiveX控件的知识点涵盖了以下几个方面: 1. MATLAB的图形用户界面开发环境(GUIDE):GUIDE是一个集成在MATLAB中的工具,用于设计图形用户界面。它提供了一个可视化的界面设计...

    解决ActiveX控件没有在此计算机上注册的问题

    在IT领域,ActiveX控件是一种由微软开发的技术,它允许开发者创建交互式的网页和应用程序。ActiveX控件是基于COM(Component Object Model)组件模型的,这些控件可以在Internet Explorer浏览器中运行,提供诸如...

    java调用activex控件

    ### Java调用ActiveX控件:深入解析与实践 #### 引言 在Web开发的早期阶段,跨平台兼容性是一大挑战。为了解决这一问题,开发者们探索了多种技术,其中一种便是通过Java调用ActiveX控件。本文将深入探讨如何在Java...

    一个简单的ActiveX控件——详尽教程

    ### 一个简单的ActiveX控件——详尽教程 在深入探讨如何开发一个简单的ActiveX控件之前,让我们先了解ActiveX控件的基本概念。ActiveX控件是一种可以在多个应用程序之间共享的软件组件,它们通常用于扩展Web浏览器...

    海康摄像机ActiveX控件(ocx控件)

    海康摄像机ActiveX控件是一款专为海康威视摄像机设计的OCX(OLE控件)组件,主要用于在Windows操作系统中实现对海康威视设备的远程访问和控制。ActiveX技术是微软推出的一种应用程序接口(API),它允许开发者创建可...

    ActiveX 控件导入程序

    这个生成的控件承载 ActiveX 控件并将其属性、方法和事件公开为生成控件的属性、方法和事件。 如果不包装一下直接用,会出现 灾难性 错误。上面已经说明了原因。 在项目中引用生成的ax开头的dll,在窗体代码中增加:...

    大华摄像头ActiveX控件(ocx).zip

    大华摄像头ActiveX控件是专为视频监控设备,如大华摄像头,设计的一种软件组件。ActiveX技术是由微软公司开发的一种对象链接和嵌入(OLE)技术,它允许开发者创建交互式、可定制的控件,这些控件可以在支持ActiveX的...

    2022年用ATL和MFC来创建ActiveX控件C语言教程.docx

    使用 ATL 和 MFC 创建 ActiveX 控件 C 语言教程 在本文中,我们将讨论如何使用 ATL 和 MFC 创建 ActiveX 控件。ActiveX 控件是基于 COM 对象模型的控件,使得控件能够被客户端代码所调用。在创建 ActiveX 控件时,...

    去掉IE提示:internet explorer 已限制此网页运行脚本或Activex控件

    ### IE提示限制脚本或ActiveX控件运行的解决方案 在使用Internet Explorer浏览器访问某些包含脚本或ActiveX控件的网页时,用户可能会遇到一个警告提示:“Internet Explorer已限制此网页运行脚本或ActiveX控件”,...

    ActiveX控件使用说明

    ActiveX 控件使用说明 ActiveX 控件是嵌入在网页中的应用程序,用户可以在 IE 浏览器中输入设备的 IP 地址,然后通过 ActiveX 控件来控制设备各种操作。下面将详细介绍 ActiveX 控件的安装和使用方法。 一、安装 ...

    activex控件vc++编程

    在IT领域,ActiveX控件和VC++编程是两个重要的概念,它们经常结合在一起用于创建交互式的Windows应用程序。本文将深入探讨这两个主题以及如何在VC++环境中开发和使用ActiveX控件。 首先,ActiveX控件是Microsoft...

    注册ActiveX控件方法

    在计算机编程与系统管理领域中,ActiveX控件是一种重要的组件,它被广泛应用于Microsoft Windows操作系统中,用于提供跨应用的复用功能。ActiveX控件能够封装复杂的代码逻辑,使得不同应用程序之间可以共享功能模块...

    网页中显示带控件的ActiveX控件

    ActiveX控件是微软在Internet Explorer浏览器中引入的一种技术,用于增强网页的交互性和功能。在Web开发的早期,ActiveX被广泛应用于提供多媒体内容、软件下载、在线应用程序以及各种定制的用户界面元素。本文将深入...

    ActiveX控件注册的几种方法

    ActiveX控件可以在多种应用程序之间共享,实现代码重用和功能扩展。为了使ActiveX控件能够在系统中正常工作,必须先对其进行注册。本文将详细介绍几种常用的ActiveX控件注册方法。 #### 1. 使用`Regsvr32.exe`程序...

    excel打开提示:此工作簿已丢失其VBA项目,ActiveX控件

    ### Excel打开提示:“此工作簿已丢失其VBA项目,ActiveX控件”解析与解决方案 #### 一、问题背景及现象 在使用Excel时,可能会遇到一个较为特殊且令人困惑的问题——“此工作簿已丢失其VBA项目,ActiveX控件”。...

    VS2015 MFCActiveX使用对话框调用另外一个ActiveX控件

    在本文中,我们将深入探讨如何在Visual Studio 2015 (VS2015) 中使用MFC ActiveX技术,特别是在一个对话框中嵌入并调用另一个ActiveX控件。MFC(Microsoft Foundation Classes)是微软提供的一套C++类库,用于简化...

    Visual Studio2015打开界面文件时报错:“未在此计算机上注册activex控件.rar

    在使用Visual Studio 2015开发涉及到ActiveX控件的应用程序时,用户可能会遇到一个常见的错误提示:“未在此计算机上注册activex控件”。这个错误通常发生在尝试打开包含ActiveX控件的用户界面文件(如Form或Dialog...

Global site tag (gtag.js) - Google Analytics