`
fpwjp
  • 浏览: 45147 次
  • 性别: 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 控件并将其属性、方法和事件公开为生成控件的属性、方法和事件。 如果不包装一下直接用,会出现 灾难性 错误。上面已经说明了原因。 在项目中引用生成的ax开头的dll,在窗体代码中增加:...

    ImageViewer ActiveX控件

    ImageViewer ActiveX控件 是一个ActiveX 控件,您可以利用它在您开发的程序中集成图片浏览功能,支持大部分常见的图片格式,可用于Microsoft Visual Studio,Microsoft Office 和 Borland Delphi。 &lt;br&gt; ...

    ActiveX控件的使用与开发

    ActiveX控件的使用与开发 ActiveX控件的使用与开发 ActiveX控件的使用与开发

    Visual Basic编程晋级:ActiveX控件

    Visual Basic编程晋级:ActiveX控件 ======================================================== Visual Basic编写ActiveX控件最好的一本参考书 可编写 ActiveX控件是 Visual Basic 5.0/6.0或以上版本提供的一个...

    ActiveX控件加载外部dll及html测试Demo

    ActiveX控件加载外部dll及html测试Demo 用VC2010编写,自已测试成功 Test.html为测试ActiveX控件页面 TestDll是dll动态库 Loaddll是测试TestDll的Demo FROMYANTAI为ActiveX控件,加载外部库TestDll,使用VC STL项目

    Panopticum Lens Pro III ActiveX控件

    Panopticum Lens Pro III ActiveX控件 是一个支持Adobe Photoshop 5.x及更高版本的附加模块。它帮助用户创建各式各样的滤镜效果,水晶和玻璃表面。这个模块是众多做玻璃物体和样式效果的集合。调整透镜和水晶的...

    全功能ActiveX控件参考手册

    全功能ActiveX控件参考手册,activeX 控件开发参考

    Excel OCX ActiveX控件

    Excel OCX 是一个功能强大的ActiveX控件,用Visual Basic 6.0编写, (保证最大的兼容性,易用性和高效率),能在Excel 和 Visual Basic之间交换数据,在Excel里创建专业的报告等。在Visual Basic应用程序里使用Excel...

    ActiveX控件注册的几种方法

    ActiveX控件注册的几种方法使用Regsvr32.exe程序 对ActiveX控件进行注册

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

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

    Active Audio Record ActiveX控件

    Active Audio Record ActiveX控件 可以直接录制声音为MP3、WAV、wma 、ogg、au、aiff 和vox格式的音频文件。您可以通过设置内码参量完全控制音像文件的质量。 &lt;br&gt; Active Audio Record ActiveX控件 支持...

    Activex控件签名工具包

    Activex控件签名工具, 微软提供了两套签名工具, 1)signcode.exe, 从1998年开始使用,随.NET Framework SDK发布。 signcode.exe 数字签名工具 makecert.exe 创建数字证书 cert2spc.exe 将数字证书转化为软件...

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

    大华摄像头ActiveX控件

    [001]VC++编写ActiveX控件详解.zip上位机开发VC串口学习资料源码下载

    [001]VC++编写ActiveX控件详解.zip上位机开发VC串口学习资料源码下载[001]VC++编写ActiveX控件详解.zip上位机开发VC串口学习资料源码下载[001]VC++编写ActiveX控件详解.zip上位机开发VC串口学习资料源码下载[001]...

    VB6.0动态加载ActiveX控件漫谈

    VB6.0动态加载ActiveX控件漫谈 深圳 罗汉军 罗德昌 熟悉VB的朋友对使用ActiveX控件一定不会陌生,众多控件极大地方便了编程, 但唯一的缺陷是不能动态加载控件,必须在设计时通过引用,将控件放置在窗体上。 VB6.0...

    注册ActiveX控件方法

    ActiveX控件ActiveX控件

    用C#编写ActiveX控件(二)

    用C#编写ActiveX控件(二)  Homer      在我的上一篇blog中,已经实现了一个最基本的ActiveX控件。当然,我们编写的任务还没有完成。首先,我们先尝试实现和JS的交互能力。    我们在Demo中加入...

    AmWave Pro ActiveX控件

    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控件使用C_开发ActiveX控件

Global site tag (gtag.js) - Google Analytics