
用Javascript捕获ActiveX对象的事件
最近参与了一个项目,我的同事在开发一个ActiveX对象,我帮他编写JS脚本来调用这个对象,其中碰到蛮多问题,最难的就是如何响应由ActiveX对象返回的对象事件。正好,现在一起总结一下。
首先,我来介绍一下COM组件,以便说明js如何响应
COM组件
方法:
void init() //初始化对象
Project createProject() //创建一个Project类型的对象并返回
事件:
onInit( int_code ) //当init成功后触发
Project类的结构:
方法:
void init() //初始化Project对象
事件:
onInit( int_code ) //当init成功后触发
然后,我们在网页里创建一个ActiveX对象
<object id="myobj" classid="CLSID:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"></object>
然后,我们定义全局的变量obj和project,来保存对象的实例,并调用他们的相关方法
var obj = null; //全局对象
var project = null; //Project对象
windowonload = function(){
obj = documentgetElementById('myobj'); //获取对象
objinit(); //初始化对象
project = objcreateProject(); //创建project对象
projectinit(); //调用project对象的方法
};
最常见的对象事件响应方法
最常见的莫过于使用script event for的标签语法来响应对象事件了,Windows Media Player就是这样做的
<script language="Javascript" event="onInit( code )" for="myobj">
if ( code == 0 )
{
//Todo:
}
</script>
for属性指定了这个事件响应的对象是myobj,注意,这里要写object标签的id,不能是js变量
event属性指定了要响应哪个事件,这里是onInit事件。
如何响应ActiveX对象返回的对象事件
现在问题来了,我们调用了createProject方法,得到了一个project对象。这个对象也有事件,那么这时应该如何来响应呢?
显然,用之前的script event for的方法是不行的,因为for属性不能指定js变量的值。网上搜索了一下,找到了一种很特别的方法,就是用双冒号来定义函数名,于是,修改程序如下:
var project = objcreateProject();
function project::onInit( code )
{
if ( code == 0 )
{
//Todo:
}
}
不过,运行后有报错,说project未定义,想起来,js会优先执行function这个函数定义,也就是说先定义函数,然后才执行语句。所以,function必须在project创建成功以后才能定义,因此,修改程序如下:
var project = createProject();
var fn = function(){ //定义一个函数,这个函数内部会定义我们的回调函数
//回调函数
function project::onInit( code )
{
if ( code == 0 )
{
//Todo:
}
}
};
fn(); //执行这个函数,也就是定义回调函数
运行了一下,确实能响应了。
你问的是 ActiveX 吗
ActiveX部件是诸如EXE,DLL或者OCX文档的可执行代码单元,他们为应用提供了符合ActiveX规范的对象。同时也有利于我们把这些可以重用的软件部件组装到应用和服务中去。
或者是 activeform
激活窗体的意思。是跟在form_load后面执行的。只执行一次form_activeform的代码。
没记得有你说的 active事件。
创建了一个未激活控件后,Internet Explorer 使用不同技术防止键盘或鼠标窗口消息到达该控件。如果未激活控件是一个有窗口的控件(如 HTML Help 控件),Internet Explorer 使用 EnableWindow 函数禁用这个未激活控件的窗口。当用户激活一个有窗口的控件时,该函数激活禁用的窗口。如果未激活控件是一个无窗口控件(如 Office Web 组件),则该控件的容器会筛选键盘和鼠标消息。
如果某个控件未激活,它不响应用户输入,但执行与交互无关的 *** 作。例如,如果您打开一个使用 Microsoft Windows 媒体播放器播放音乐文件的 Web 页,该页加载后才会播放音乐。只有该控件的用户界面激活后,您才能与 Windows 媒体播放器交互。
注 虽然未激活控件不响应任何直接的用户交互;但它们响应脚本命令。
要激活一个交互控件,可以单击该控件,也可以使用 Tab 键将焦点设置在该控件上,然后按 SPACEBAR 或 ENTER 键。从外部脚本加载的交互控件无需激活即可立即响应用户交互。
某些有窗口的控件使用 Windows API 函数(如 GetKeyState 和 GetCursorPos)确定键盘和鼠标的状态,然后响应函数结果。仅对于这些控件而言,先出现一个提示,然后才会在 Internet Explorer 中运行控件。要运行控件,用户需要先单击消息窗口中的按钮,然后页面才会加载。加载后,控件不需要激活。目前,以下控件具有该行为,但供应商正在继续研发没有该行为的新控件。
一、填空题
1Visual Basic语言是以结构化Basic语言为基础,以(事件)驱动为运行机制。
2若要将窗体Form1隐藏起来,课可调用其方法(Hide)来实现,具体调用格式为:(Form1Hide)
3数据控件本身不具有数据显示能力,要显示工作表的数据,需借助(treeview)控件来实现。
4Visual Basic对象主要分为(内部控件)和(ActiveX控件)两大类。
5在Visual Basic中若要让某对象获取焦点,则可通过(Setfocus)方法来实现。
6显示快捷菜单的方法是(PopupMenu)。
7调试应用程序时,其处于(break)模式。
8Visual Basic中若要产生以消息框,可用(msgbox)函数来实现。
二、单选
1若要卸除窗体,则实现的语句为___ Dunload
2若要使用命令钮失效,则可设置_Benabled __属性为Flase来实现。
3设置或返回文本框中的文本,可通过文本框对象的_Btext __属性来实现。
4设置定时器控件的定时时间,可通过Ainterval ___属性来设置。
5包含Activex控件的文件的扩展名是_Cocx __。
6下列哪个关键字定义的变量可以由其他模块访问_ Cpublic __
7图像框或框中显示的图形文件,由他们的_Bpicture __属性值决定。
8创建工具栏之前,应选中〖部件〗对话框中的__Cmicrosoft windows common control 60 _复选框才能在工具箱中添加相应的控件按钮。
9Visual Basic中可通过_Ccircle __方法画圆。
10用下面语句定义的数组的元素个数是_ D9__
Dmi M (-5 to 3) AS integer
三、多选
1当用户在窗体上单击鼠标时,触发的事件Aclick Bmousedown Cmouseup
2在运行时,若要以程序代码的方式调整窗体的大小,则改变下列属性或事件中的代码可实现的有_Bwidth _Cheight _
3当窗体被启动,将会发生的事件Aload Bgotfocus Cpaint Dinitialize
4下列控件不具有text属性的是 B标签_C框__
5下列变量名正确的有Acount Cbanna2 ___
四、判断题
1所有的对象都具有caption属性和name属性。(错)
2在VB应用程序之外删除工程中的一个文件时,不能更新此工程文件。(对)
3一个应用程序只能有一个mdi窗体。(错)
4在设计段通过用对话框控件的大小不能改变,用户也无法指定对话框在屏幕上的显示位置。(对)
5数据库中的健必须是唯一的。(对)
五、简答题:
从书上找,略
六、编程题:
1求1到100内所有能被3整除的数。
dim i as integer
for i=1 to 100
if i mod 3=0 then print i;
next i
2随机生成10个50以内的整数,并按递增顺序排序。
dim i as integer ,A(9) as integer,T as integer
for i=0 to 9
randomize
a(i)=int(rnd50)
next i
for i=0 to 8
for j=i+1 to 9
if a(i)>a(j) then
T=a(i):a(i)=a(j):a(j)=T
end if
next j
next i
for i=0 to 9
print a(i);
next i
说明:可能有个别题与答案不符,你最后好好看看书,确认一下,不要一味照搬。
ActiveX是Microsoft提出的一组使用COM(ComponentObjectModel,部件对象模型)使得软件部件在网络环境中进行交互的技术集。它与具体的编程语言无关。作为针对Internet应用开发的技术,ActiveX被广泛应用于WEB服务器以及客户端的各个方面。本文着重介绍以Visual C++ 50为工具,利用系统提供的AppWizard快速构造一个简单的ActiveX控件。
通常VC++50提供两个途径开发ActiveX控制:MFC和ATL(ActiveXTemplateLibrary)。使用MFC,可以不必理会控制接口的细节,把注意力集中在控制本身的功能上,但是生成的控制比较大。而且,客户端如果要运行此ActiveX控制,必须拥有相应版本的MFC类库的DLL,否则,必须同时下载这些巨大的类库;使用ATL,由于不汲及MFC的标准类库,生成的控制相对较小,但开发者必须了解COM、OLE技术的细节。这里,我们主要说明一下使用MFC开发ActiveX控制的方法,因为这种方法相对比较容易。
在Microsoft Developer Studio环境下,按如下的 *** 作步骤可以快速生成一个标准的ActiveX控件。首先,启动系统的AppWizard,用File菜单下的New菜单项创建新的项目。注意:我们选择的是列表框中的MFC ActiveX ControlWizard项。也可以使用ATL COM AppWizard项来产生ActiveX控件,这样实现的控件的最终代码量较小,但由于用这种方法加入的ActiveX控件对象从最基本的COM对象出发,故不能使用MFC类库中的COleControl所提供的强大功能。而用MFC ActiveX ControlWizard项则产生以COleControl为基类的控件对象类,它继承了所有COleControl类中实现的OLE控件的特性,包括窗口对象特性和方法、属性及事件等。接着,按照系统给出的提示信息逐步完成创建工作。用户可根据实际应用的要求定制控件的各项特性。
我们假定项目名为Test。创建工作完成后,打开Workspace文件Testdsw,可以看到系统生成的Test控件框架,主要的类及实现功能描述见下表:
派生类 基类 实现功能
CTestApp COleControlModule 控件实例的初始化和撤消
CTestCtrl COleControl 控件窗口的创建、更新及消息处理
CTestPropPage COlePropertyPage 控件属性页的设置及与实际属性值的交换
编译此项目,生成Testocx。在当前的Developer Studio环境下,这个控件已经被自动注册了。用系统提供的工具ActiveX Control Test Container可以立即进行测试,在已提供的可插入OLE控件列表中,Test Control就是我们生成的控件名。如果想在其它环境下使用它,则必须先对Testocx文件进行注册,具体做法是在命令行方式下键入命令:“regsvr32 …/Testocx”。此后,我们就可在任何支持ActiveX控件的环境中使用它了。注意:ocx文件应该随时更新和注册。
当然,这样生成的控件没有什么实质性的用处,若在任何一个包容器中测试它,则只可见一个矩形框和一个内切椭圆,除了缩放和位置移动功能外不能进行任何 *** 作。
然而,我们希望开发出来的控件就像一个通常的编辑环境一样:用户可以在窗口内进行文本的输入和编辑,而且有工具条来支持各项 *** 作。
1、为控件添加工具条和子窗口
VC++的模板常常是很有用的工具,我们设计一个类CToolbar,为控件类T添加工具条,显示每个按钮及提示信息。我们的控件类CtestCtrl是从这个类派生出来的,从而可为控件加上设计好了的工具条。
以下是实现工具条模板类的定义 (在Toolbarh文件中) :
template
class CToolbar
{
public:
CToolbar();
void CreateToolbar(HWND hParent);// 创建工具条
void AddButtons();// 逐个加入按钮
void DestroyToolbar();// 撤消工具条
LRESULT OnToolbarNeedText(WPARAM, LPNMHDR pnmh, BOOL&);
// 工具条上按钮的提示信息
protected:
HWND m_hwndToolbar;// 工具条的窗口句柄
};
接着,要对TestCtlh和TestCtlcpp作相应的修改。在TestCtlh中要先包含Toolbarh文件,并将控件类定义为:
class CTestCtrl : public COleControl, public CToolbar
然后,再加进消息映射宏:
BEGIN_TOOLBAR_MAP(CTestCtrl)
TOOLBAR_BUTTON(ID_New)
TOOLBAR_SEPARATOR()
TOOLBAR_BUTTON(ID_CUT)
TOOLBAR_SEPARATOR()
END_TOOLBAR_MAP()
以响应定制的工具条上的各个按钮消息。上面的宏在Toolbarh文件中被定义。于是,在CTestCtrl类的成员函数中就可以灵活使用CToolbar类的各项 *** 作了。
另外,我们再为控件设计一个可编辑的子窗口。这实现起来很方便,在控件类定义中直接加入CEdit类的对象作为成员变量m_TestEdit即可。
要想真正生成我们自己的控件窗口,则需重载COleControl::CreateControlWindow函数。控件窗口被创建时,该函数被调用,函数中先调用基类同名函数,再依次调用CreateToolbar和CreateTestEdit 生成控件中的工具条和子窗口。自然,我们不再需要系统缺省调用的画图函数,将CTestCtrl::OnDraw 中画矩形框和椭圆的部分去掉。CreateToolbar在工具条模板类中实现;CreateTestEdit 在控件类中自定义,函数先计算控件窗口的客户区和工具条的窗口大小,得到子窗口的位置,使之填满控件中工具条以外的全部区域,然后调用m_TestEditCreate函数,设置参数使子窗口具有用户所希望的各项风格。
2、调整控件窗口中各个对象的位置
工具条和子窗口已经在控件中生成后,还有一项重要的工作就是当控件位置移动或大小改变时,要相应地调整工具条和子窗口的位置和大校
COleControl类为我们提供了这样的函数:
COleControl::OnSetObjectRects(LPCRECT lpRectPos, LPCRECT lpRectClip);
其中的参数给出了控件的新位置。重载此函数,先按系统提供的功能自动调整工具条,调用:
::SendMessage(m_hwndToolbar, TB_AUTOSIZE, 0L, 0L)
然后,同创建时一样计算控件窗口的客户区(参数lpRectPos已给出),调用GetWindowRect获得工具条的窗口大校为使子窗口填满控件中工具条以外的全部区域,应先计算出相应的矩形位置并调用m_TestEditSetWindowPos来 实现子窗口的位置调整。为了美观起见,也可在子窗口的四边留出少许富余。最后,调用基类的OnSetObjectRects函数。
3、实现对控件内对象的控制
因为有了子窗口,实际上用户的各项功能 *** 作都是由子窗口来控制完成的。我们将焦点的控制权交给子窗口,使用户能进行输入和编辑 *** 作,在CTestCtrl::OnSetFocus中调用m_TestEditSetFocus。同样,当控件对象捕获到工具条上的按钮被按下的消息时,要调用 m_TestEdit 的相应函数以执行用户的命令。
工具条上提示信息的显示也由控件对象来控制。在CTestCtrl::OnNotify函数中加入如下代码:
NMHDR pNMHDR = (NMHDR )lParam;
BOOL tmp;
if (pNMHDR->code == TTN_NEEDTEXT)
return OnToolbarNeedText(wParam, pNMHDR, tmp);
这样,当鼠标移动并停留在工具条的某个按钮上时,控件对象就会调用工具条模板类中的OnToolbarNeedText 函数以获得相应的提示信息。
4、控件窗口及内部对象的撤消
最后需要说明的是,如果我们在控件中创建了新的工具条和子窗口,则也应该及时撤消控件窗口及其内部对象。撤消控件窗口,即是在 CTestEdit::OnDestroy函数中依次调用DestroyToolbar和 m_TestEditDestroyWindow 来清除工具条和子窗口。
遵循以上四个工作步骤就可以很好地创建一个带有工具条和编辑子窗口的ActiveX控件。子窗口可由用户自己定义,象通常的应用程序那样去实现各种各样或简单或复杂的功能。工具条的存在使用户执行各项 *** 作更加方便。此外,在控件中加进其它各种所需的对象并进行控制也是可能的。
分类: 电脑/网络 >> 软件
问题描述:
如题
解析:
根据微软权威的软件开发指南MSDN(Microsoft Developer Neork)的定义,ActiveX插件以前也叫做OLE控件或OCX控件,它是一些软件组件或对象,可以将其插入到WEB网页或其它应用程序中。
在因特网上,ActiveX插件软件的特点是:一般软件需要用户单独下载然后执行安装,而ActiveX插件是当用户浏览到特定的网页时,IE浏览器即可自动下载并提示用户安装。 ActiveX插件安装的一个前提是必须经过用户的同意及确认。
ActiveX插件技术是国际上通用的基于Windows平台的软件技术,除了网络实名插件之外,许多软件均采用此种方式开发,例如Flas 播放插件、Microsoft MediaPlayer插件、CNNIC通用网址插件等。
浏览器如何保证ActiveX插件的安全性?
当通过Inter发行软件时,软件的安全性是一个非常引人注意的问题,IE浏览器通过以下的方式来保证ActiveX插件的安全:
ActiveX使用了两个补充性的策略:安全级别和证明,来追求进一步的软件安全性;
Microsoft提供了一套工具,可以用它来增加ActiveX对象的安全性;
通过Microsoft的验证代码工具,可以对ActiveX控件进行签名,这告诉用户你的确是控件的作者而且没有他人篡改过这个控件;
为了使用验证代码工具对组件进行签名,必须从证书授权机构获得一个数字证书;证书包含表明特定软件程序是正版的信息,这确保了其他程序不能再使用原程序的标识。证书还记录了颁发日期。当您试图下载软件时,Inter Explorer 会验证证书中的信息,以及当前日期是否在证书的截止日期之前。如果在下载时该信息不是最新的和有效的,Inter Explorer 将显示一个警告;
在IE默认的安全级别中,ActiveX控件安装之前,用户可以根据自己对软件发行商和软件本身的信任程度,选择决定是否继续安装和运行此软件。
网络实名插件使用了国际权威安全厂商Verisign所颁发的数字证书进行签名,因此可以确保网络实名插件的真实性和安全性。
以上就是关于怎么接收 ActiveX 的事件全部的内容,包括:怎么接收 ActiveX 的事件、vb中active事件是什么事件、如何激活ActiveX控件等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)