实验八 ActiveX 控件的创建与使用Word文件下载.docx
《实验八 ActiveX 控件的创建与使用Word文件下载.docx》由会员分享,可在线阅读,更多相关《实验八 ActiveX 控件的创建与使用Word文件下载.docx(15页珍藏版)》请在冰豆网上搜索。
_DExample1和_DExample1Events,它们都是接口。
接口是控件与外部程序进行通信的协议。
可以把接口看作是函数的集合,外部程序通过这个接口所暴露出来的方法去访问控件的属性和方法。
实际上,可以把接口看作一个抽象基类,在此接口中定义的所有函数都是虚函数,这些函数的实现在CExample1Ctrl类中完成的。
所以通过接口调用的函数实际上是调用CExample1Ctrl中的函数来实现的。
(2)ActiveX控件不能独立运行,它必须嵌入到一个容器中运行。
编译并运行刚刚创建的工程,可以看到如图所示的对话框:
我们可以单击该对话框上标示了一个向右箭头的按钮,将弹出一个快捷菜单,选择【ActiveXControlTestContainer】菜单项,也就是选择ActiveXControlTestContainer这个应用程序作为Example1控件的容器。
然后单击上图所示对话框的【OK】按钮关闭该对话框。
这时将打开ActiveXControlTestContainer这个应用程序,如下图所示:
于是我们可以加载特定的ActiveX控件了,方法是选择【Edit\InsertNewControl...】菜单项,这时将打开如下图所示的对话框:
选中我们创建的Example1控件,单击对话框上的【OK】按钮关闭对话框,这时,在ActiveXControlTestContainer应用程序中就加载了Example1控件。
这时该控件的代码都是MFC自动生成的。
(3)控件功能的实现。
首先将CExample1Ctrl类中OnDraw函数中自动生成的两行代码注释起来,它们分别用来填充控件的背景和绘制椭圆。
然后为控件添加自定义属性,选择ClassWizard对话框上的Automation选项卡,然后单击【AddProperty】按钮,将弹出属性对话框。
在Externalname中填写属性名称为“SetText”,类型选择为“CString”,变量名被自动的设置为m_setText,而且ClassWizard为该控件增加了一个通知函数:
OnSetTextChanged,当在外部修改属性时,这个函数将被调用。
在添加属性对话框上还有三个单选按钮,保持默认选择的Membervariable,当选择该选项后,ClassWizard会为该属性生成一个成员变量和一个通知函数。
在CExample1Ctrl类的构造函数中对m_setText进行初始化,加入代码:
m_setText="
你好!
"
;
在通知函数OnSetTextChanged中加入代码如下:
Invalidate();
使窗口发生重绘调用OnDraw函数,在OnDraw函数中加入代码如下:
pdc->
TextOut(0,0,m_setText);
(4)为控件增加标准事件。
选择ClassWizard对话框上的ActiveXEvents选项卡,然后单击【AddEvent】按钮,将显示添加事件对话框,在此对话框上有一个名称为Externalname的组合框,当单击其右边向下的箭头时,将会看到列出了一些预先准备好的事件。
在Externalname下拉列表中选择Click,保持默认的Stock选项不变,然后单击【OK】按钮关闭AddEvent对话框,同理增加MouseMove事件,然后单击ClassWizard对话框上的【OK】按钮关闭该对话框。
这时,在ClassView选项卡中可以看到,在_DclockEvents接口下面增加了两个方法,就是刚刚添加的事件。
(5)测试控件的属性和事件。
利用Build命令生成控件,利用ActiveXControlTestContainer来测试该控件。
利用【Edit\InsertNewControl...】菜单项插入该控件后,选中该控件,然后单击【Control\InvokeMethods...】菜单项,这时将显示如下所示的对话框:
在此对话框中有一个方法名称(MethodName)下拉列表,在此列表中列出了当前控件提供的方法,如下图所示:
如果想要得到某个属性值,应该选择PropGet类型的方法;
如果想要设置某个属性的值,则应该选择PropPut类型的方法。
因此应该选择PropPut类型的方法,并在随后出现的对话框的Parameter编辑框中输入:
nihao,单击【SetValue】按钮,再单击【Invoke】按钮使得设置生效,观察运行结果。
当把鼠标放到控件上时,ActiveXControlTestContainer的位于下部的窗口将显示鼠标的位置;
当单击控件的时候,下部的窗口将显示控件被单击的消息。
(6)生成一个发行版本的ActiveX控件。
方法是在VC++开发环境打开Example1工程,然后选择【Build\SetActiveConfiguration...】菜单项,从弹出的对话框中选择“Example1-Win32Release”,单击【OK】按钮,然后重新利用Build命令生成控件。
(7)编写一个ActiveX控件的测试程序。
新建一个基于对话框的工程,命名为:
Example1Test,并删除自动生成的对话框资源上的静态文本控件。
在VC++中插入ActiveX控件的方法是,选择【Project\AddToProject\ComponentsandControl...】菜单项,将显示如下图所示的对话框:
在此对话框中双击“RegisteredActiveXControls”目录,并在此目录下找到Example1控件,然后单击【Insert】按钮,并单击随后显示的确认对话框上的【确认】按钮,这时将弹出如下图所示的对话框:
这时,会在工程中为该控件生成一个类,类名为Example1。
最后单击【OK】按钮关闭该对话框,并单击【Close】按钮关闭插入组件和控件的对话框。
这时,在ClassView选项卡上,可以看到增加了一个类:
Example1,该类提供了一些函数,我们只需要调用这些函数就可以访问Example1这个控件的方法和属性了。
同时,在工具箱上也增加了Example1控件的图标,我们只需要单击该图标,并在对话框资源上拖放在一块合适的区域就可以放置一个Example1控件了。
(8)在程序中动态的产生一个Example1控件,首先为CExample1TestDlg类增加一个成员变量,变量名为m_example1,类型为CExample1。
然后在CExample1TestDlg类的OnInitDialog函数中加入代码如下:
m_example1.Create("
example1"
WS_CHILD|WS_VISIBLE,CRect(0,0,100,50),this,123);
动态产生一个Example1控件,并在Example1Test.h文件中加入代码如下:
#include"
example1.h"
。
然后先在对话框上放置一个静态文本控件,Caputions设置为:
“输入要显示的字符串:
”。
再放置一个编辑框控件,并为编辑框控件关联一个Cstring类型的成员变量m_str。
再放置一个按钮控件,将Caputions设置为:
设置,ID设置为IDC_BUTTON,并为其添加单击消息OnButton。
最后放置一个Example1控件,调整位置如下图所示:
在OnButton函数中添加代码如下:
UpdateData();
m_example1.SetSetText(m_str);
利用编辑框来改变动态产生的Example1控件的显示文本。
编译并运行程序,通过编辑框来输入要显示的字符串,单击设置按钮来完成设置,观察Example1控件的显示文本。
(9)在VC中访问静态增加的Example1控件的事件。
在该控件上单击鼠标右键,从弹出的快捷菜单上选择【ClassWizard...】,将弹出如下图所示的对话框:
可以看到,通过ClassWizard可以为Example1控件增加Click事件和MouseMove事件。
如果要增加某个事件,在此对话框中选中该事件,然后单击【AddFunction...】按钮即可。
通过这种方法为Example1控件增加Click事件和MouseMove事件。
Click事件的消息响应函数为OnClickExample1ctrl2,MouseMove事件的消息响应函数为OnMouseMoveExample1ctrl2。
(10)首先为CExample1TestDlg类增加一个类型为CPoint的公有成员变量m_point,然后在OnClickExample1ctrl2函数中增加代码如下:
CClientDCdc(this);
CStringstr;
str.Format("
x=%d,y=%d"
m_point.x,m_point.y);
dc.TextOut(200,250,str);
完成当鼠标单击控件时,显示鼠标的位置。
鼠标的位置会在OnMouseMoveExample1ctrl2函数中添加,代码如下:
m_point.x=x;
m_point.y=y;
x,y);
dc.TextOut(100,100,str);
完成当鼠标在控件上移动时,显示鼠标的位置。
编辑并运行程序,观察结果。
实验2步骤:
Rectangle.然后单击【OK】进入向导的第一步,直接单击【Finish】按钮保持所有默认设置不变。
(2)控件功能的实现。
首先将CRectangleCtrl类中OnDraw函数中自动生成的两行代码注释起来。
然后为控件添加标准属性,选择ClassWizard对话框上的Automation选项卡,然后单击【AddProperty】按钮,将弹出属性对话框。
在Externalname选项卡中选择ForeColor前景色属性,其它保持默认设置。
为了实现设置前景色的功能,还有在CRectangleCtrl类的OnDraw函数中添加代码如下:
CBrushbrush(TranslateColor(GetForeColor()));
Rectangle(rcBounds);
FillRect(rcBounds,&
brush);
GetForeColor函数用来获得前景色,然后在整个控件区域内绘制一个矩形,最后用前景色来填充整个矩形。
(3)为控件增加标准事件—双击事件。
在Externalname下拉列表中选择DblClick,保持默认的Stock选项不变,然后单击【OK】按钮关闭AddEvent对话框,然后单击ClassWizard对话框上的【OK】按钮关闭该对话框。
(4)利用实验1中的方法来测试控件的属性和事件。
(5)生成一个发行版本的ActiveX控件。
方法是在VC++开发环境打开Rectangle工程,然后选择【Build\SetActiveConfiguration...】菜单项,从弹出的对话框中选择“Rectangle-Win32Release”,单击【OK】按钮,然后重新利用Build命令生成控件。
(6)编写一个ActiveX控件的测试程序。
RectangleTest,并删除自动生成的对话框资源上的静态文本控件。
利用实验1中的方法插入Rectangle控件。
这时,会在工程中为该控件生成一个类,类名为CRectangle。
(7)在程序中动态的产生一个Rectangle控件,首先为CRectangleTestDlg类增加一个成员变量,变量名为m_rectangle,类型为CRectangle。
然后在CRectangleTestDlg类的OnInitDialog函数中加入代码如下:
m_rectangle.Create("
Rectangle"
WS_CHILD|WS_VISIBLE,CRect(100,100,200,150),this,123);
动态产生一个Rectangle控件,并在RectangleTest.h文件中加入代码如下:
rectangle.h"
编译并运行程序,如下图所示:
(8)为动态产生的Rectangle控件增加双击事件的响应。
首先在ResourceView选项卡下,打开主对话框,并在其上静态拖放一个Rectangle控件,将其ID设置为IDC_RECTANGLECTRL1。
在该控件上单击鼠标右键,从弹出的快捷菜单上选择【ClassWizard...】,可以看到,通过ClassWizard可以为Rectangle控件增加DblClick事件。
(9)删除刚刚添加的静态Rectangle控件。
打开FileView选项卡,打开Resource.h文件,并在其中添加代码:
#defineIDC_RECTANGLECTRL1123
此时,即将动态创建的Rectangle控件和静态创建的Rectangle控件的双击事件结合在一起了。
(10)在Rectangle控件的双击事件响应函数OnDblClickRectanglectrl1中添加代码如下:
CColorDialogdlg;
if(IDOK==dlg.DoModal())
{
m_rectangle.SetForeColor(dlg.m_cc.rgbResult);
}
当双击Rectangle控件时,首先创建一个颜色对话框,当做出选择,按下“确定”按钮的时候,DoModal函数返回IDOK,此时,把颜色对话框中保存的结果dlg.m_cc.rgbResult传递给SetForeColor函数来设置控件的前景色。
(11)编辑并运行程序,观察实验结果。
下图为选择绿色为前景色所得结果:
四独立实验
1、创建一个控件,平时显示蓝色,调用“启动(Start)方法”后显示红色,维持一段时间后恢复原底色,方法包括对维持时间的设置,强行停止等,在维持过程中,要定时产生已维持时间信息,当维持时间结束时产生事件结束事件。
测试程序:
在对话窗口放置显示块(即控件),并对显示块进行设置和控制,包括启动、强行结束按钮,维持时间输入,用标准控件显示维持过程。
五技术支持
1
非规则外形的窗口建立方法:
在.H文件中加:
CRectm_rectWnd;
//记录窗口初始矩形
CRgnm_rgn;
//设置窗口所在区域
如果是窗口类,对话框模板的属性(Styles)设置为”popup”、无边界(Border)为none。
在初始化对话窗口函数中添加:
BOOLCmyDlg:
:
OnInitDialog()
{
CDialog:
OnInitDialog();
……………………
GetClientRect(m_rectWnd);
//获得对话窗口的尺寸
m_rgn.CreateEllipticRgn(0,0,m_rectWnd.right,m_rectWnd.bottom);
//创建窗口区域与窗口的关系,即限制窗口区域
SetWindowRgn((HRGN)m_rgn,TRUE);
}
如果希望获得其它形状,可利用CRgn函数,组成其它形状,如多区域的拼接,程序如下:
this->
GetClientRect(m_rect);
m_rgn1.CreateEllipticRgn(m_rect.Width()/2,0,m_rect.Width(),m_rect.Height());
m_rgn2.CreateEllipticRgn(0,0,m_rect.Width()/2,m_rect.Height());
m_rgn3.CreateRectRgn(0,0,50,50);
intnCombineResult=m_rgn3.CombineRgn(&
m_rgn1,&
m_rgn2,RGN_OR);
//ASSERT(nCombineResult!
=ERROR||nCombineResult!
=NULLREGION);
this->
SetWindowRgn((HRGN)m_rgn3,TRUE);
CRgn成员函数:
如果是一般窗口,增加对WM_CREATE消息处理,处理程序类似上面。
在控件中,处理方法与一般窗口类似。
2关于ActiveX
ActiveX控件是可执行的部件,它们被设计为嵌在一个窗口或网页中以完成一些自带的任务。
对用户来说,它们非常类似于Windows系统提供的普通控件。
从应用上看,对ActiveX的使用包括两部分,首先是如何在一个用户的应用程序中使用ActiveX控件,另一个部分就是如何编写ActiveX程序,当然包括调试等。
在MFC中,微软已经将将ActiveX编程方面的许多细节用框架已经解决了,这就大大地减轻了程序设计者的困难,ActiveX应用程序只需要很少或无需过多地了解关于简化了开发过程,可以将注意力集中在程序的设计方面。
名字是新的,而技术却是原来已经成熟的。
ActiveX控件是基于微软早期的OLE技术,OLE过去指的是对象链接与嵌入,但对象嵌入只是OLE功能的一个部分,随着软件技术的发展,它已经从一个为特殊目的而设计的技术,发展成为一个包括ActiveX在内的其它特定技术所依赖的通用体系结构。
OLE为创建和连接不同的程序部件(包括称为OLE自定义控件的服务器模块)定义了一个标准的蓝图。
简而言之,它们过去叫做OLE控件,现在微软将其称为ActiveX控件。
那么什么是ActiveX控件呢?
简单的回答就是:
ActiveX控件是一个动态链接库,它可以作为一个OLE服务器,而且可以被嵌在一个包容器主应用程序中。
ActiveX控件是可移植的软件模块,用于完成一点的任务。
ActiveX控件类类似于按钮和列表框等标准控件,可以在对话窗口和其它窗口中显示和使用。
ActiveX控件可以自己创建,从Internet下载或从其它软件商中获得。
ActiveX控件的优点在于无论应用应用程序使用哪种计算机语言,都可以插入ActiveX控件。
ActiveX控件由容器的概念而来,集成了容器的基本机制:
属性、事件和方法。
关键性的概念:
.ActiveX是由Microsoft公司定义的用于Internet的一种对象链接与嵌入技术(OLE)
.计算模型已经由传统的基于主机的模型发展为现代的ActiveX基于Internet的模型
.可以通过VisualBasic(控件创建版本)、VisualC++、BorlandC++、BorlandDelphi等工具来创建ActiveX控件。
可以通过诸如ActiveXControlPad之类的工具来写ActiveX脚本。
ActiveX文档(ActiveXDocument)是一种非HTML的文档,浏览器可以通过ActiveX技术来显示它
.通过在应用程序中使用Microsoft公司的ActiveX讨论开发工具集(SDK),使应用程序具有讨论的能力。
.通过使用ActiveXServer,可以使Web模型更为智能化.可以使用基于Microsoft组件对象模型(COM)的ActiveX
.Java与ActiveX是互为补充的
定义属性
定义固有属性和自定义属性。
修改属性页
ActiveX控件可以包括一个或几个属性页。
每个属性页可以形成一个对话框,可以包括控件的属性值。
可以用属性页定义属性的初始值。
每个属性页用对话编辑器中Properties对话框的标签
定义方法
在ActiveX控件中,可以定义方法,最常见的方法是AboutBox。
在VC的开发平台上,用户可以为设计的控件增加方法。
增加的方法应有方法名称、返回类型和参数。
用户也可以为ActiveX控件旦定义事件,ActiveX即可调用相关的Fire函数告诉容器程序发生了事件。
调用Fire函数称为产生事件。
同时产生事件可以调用相同的事件处理函数。
和属性与方法一样,事件有固有和自定义两种。
对固有事件,MFC提供了Fire函数和在适当时间调用这个函数的代码。
而对于自定义事件,则由ClassWizard产生新的Fire函数,当然这时需要编写发出事件时调用相应函数的代码。
COM是基本的‘对象模型”,根据COM,ActiveX控件与OLE才可建立。
COM允许对象向其他元件及应用显示其功能。
对于对象如何显示自身及这种显示如何贯穿于过程与网络作了定义。
COM也定义了对象的生命周期。
COM基本有以下内容:
.