公司开发的WEB程序里面嵌入了一个大控件(ocx)。嵌入控件这种模式自然有它自身的好处,但是却有着一些致命的缺点......我个人认为能不用尽量不用,嵌入控件的WEB程序总觉得点不伦不类。
牢骚发完了,言归正传。
控件分为有窗口控件与无窗口控件,无窗口控件很好办
,如flash控件,可以通过添加wmode属性来解决挡住DIV层这个问题,添加的代码如下:
² 代码1-2 解决无窗口控件挡住DIV
<param name="wmode" value="opaque">
这种情况在使用DIV的网页里的测试如下
测试的代码是:
² 代码1-1 测试DIV与OCX控件
<div
style="position: absolute; left: 120; top: 450; width: 400px; height: 200px; background: red; z-index: 7">
<object classid="CLSID:4B5BEE59-EDD2-4082-A9F7-D65E1CA20FA7"width="100" height="100">
</object>
是第6层
</div>
<div
style="position: absolute; left: 40; top: 500; width: 400px; height: 100px; background: Blue; z-index: 9">
这是第7层
</div>
这是第7层
</div>
这种情况在EXTJS下边的测试情况如下图:
相关测试代码请参考代码1-1
注:如果我们的控件是一个无窗口控件如flash控件,可以通过添加wmode属性来解决挡住DIV层这个问题,添加的代码如下:
² 代码1-2 解决无窗口控件挡住DIV
<param name="wmode" value="opaque">
Ø 如何解决这些问题
值得庆幸的是Html的iframe、frame可以挡住OCX控件——实际上iframe以及frame本身是一个有窗口元素,有窗口元素之间是可以互相遮挡的,而我们的Div又可以与iframe窗口互相遮挡。 现在的问题变成了如何先用iframe挡住OCX窗口再用DIV挡住iframe。
² Code 2-1 用iframe遮挡OCX控件
<div
style="position: absolute; left: 120; top: 450; width: 400px; height: 200px; background: red; z-index: 7">
<object classid="CLSID:4B5BEE59-EDD2-4082-A9F7-D65E1CA20FA7"width="100" height="100">
</object>
是第6层
</div>
<div
style="position: absolute; left: 40; top: 500; width: 400px; height: 100px; background: Blue; z-index: 9">
<iframe id='iframei' src="javascript:false" style="position:absolute; visibility:inherit; top:0px; left:0px; height:'100%';width:'100%'; z-index:-1; filter='progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)';/">
</iframe>;
这是第7层
</div>
其中代码”
<iframe id='iframei' src="javascript:false" style="position:absolute; visibility:inherit; top:0px; left:0px; height:'100%';width:'100%'; z-index:-1; filter='progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)';/"></iframe>;”
就是创建一个与DIV等大的,透明的iframe框架。
实现的效果如下图:
现在我们已经解决了如何用DIV去遮挡OCX这个问题了。接下来我们要做的是如何去改造EXTJS类来让它们也可以挡住OCX控件。
EXTJS中对控件参用了继承的方法来实现扩展,所以我们只许要实现对恰当的父类进行改造就可以了,这里我们选择Panel类。接下我们将会在panel类里面添加一个等大的,透明的iframe窗口。以后在使用创建的panel控件,以及继承自panel的控件(如:window)都可以实现遮挡住OCX控件了。——继承的优势再一次得到的很好的体现。
由于要修改EXTJS的原码,所以我们使用它的Debug版本。
我们也许不想所有的panel以及其子孙下边都藏着一个iframe,所以这里我们添加一个属性来控制是否要添加一个iframe。实现如下
Ext.Panel = Ext.extend(Ext.Container, {
hasIframe: false,
……
下边我们就在实例化一个panel(或者其子孙)时添加一个iframe吧。
我选择了在panel渲染onRender时加入自己的代码:
onRender : function(ct, position) {
Ext.Panel.superclass.onRender.call(this, ct, position);
var el = this.el, d = el.dom;
// el 下边加入我们的iFrame
if (this.hasIframe)
{
var iframeid=this.id+"_iframe"
d.innerHTML+="<iframe id='"+iframeid+"' src=/"javascript:false/" style=/"position:absolute; visibility:inherit; top:0px; left:0px; height:'100%';width:'100%'; z-index:-1; filter='progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)';/"></iframe>";
}
......
}
OK现在在创建panel或者其子孙时我们只要设置一个属性
hasIframe: true,
就可以实现遮挡住OCX控件的功能了。
问题到了这里仿佛已经得到了完美的解决,但是当我们尝试着去拖动,或者拖曳这些窗口时有时你会发现一起很怪的现向,例如窗口扩大后有一部分无法遮挡住OCX控件,无法在OCX控件上面进行拖曳或者移动。
这是为什么呢?
第一个问题:为什么窗口的一部分可以挡住OCX控件呢?我明明把底层的iframe高度设置成了100%了!设置100%的意思是跟它外层的容器(这里是DIV)大小是一样的。 通过方法把最终的代码alert出来后才发现默认情况下它外层容器的高度是不显示出来的——为什么要这样设计,我也不知道。最简单的方法就是明确地给外层容器设置调度,并在拖曳时再给它们设置高度(panel的大小是不可以改变的,它的子类例如window是可以的)。OK那就再费点现设置一下吧。
第一步在panel实例化时设置一下高度
onRender : function(ct, position) {
……
this.el.dom.style.height=this.height; //高度
第二步在 window拖曳时改变一下容器调度
onResize : function(w, h) {
if(this.hasIframe) {
this.el.dom.style.height=h; //拖动的时候重新设置了高度
第二个问题: 在拖动层的过程中发现OCX又冒出来了,而且经过OCX时拖动就失败了。这时为什么呢?EXT拖动层时不是把层里面的所有元件(Elements)一起拖动,它只是拖动了最外层的容器,拖动结束后再在新位置上重新绘制元件——多好的设计呀,可惜在这里遇到了问题。那好吧,在拖动时把我们iframe也一起拖动不就OK了?
我们为
startDrag : function() {
………
if (this.win.hasIframe)
{
var newiframe= Ext.getDom(this.win.id+'_newiframe');
if (newiframe)
{
}
else
{
this.proxy.dom.innerHTML+="<iframe id='"+this.win.id+'_newiframe' +"' src=/"javascript:false/" style=/"position:absolute; visibility:inherit; top:0; left:0; width:100%; height:100%; z-index:-1; filter='progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)';/"></iframe>";
}
}
到这里前算是把拖曳问题解决的差不多了,为什么说是差不多了呢?你在实现使用时就会发现有点问题了。
第三个问题:在拖曳经过OCX时就变的无效了
这里不想说原因,说说解决方法吧。没找到更好的解决方法,现在的做法是在拖曳时让底层的iframe临时扩大的全屏,拖完以后再还原回来。
beforeResize : function() {
……
//拖动之前 把它的底层iframe 扩展到最大
if (this.hasIframe)
{
var divIframe=Ext.getDom(this.id+'_iframe');
divIframe.style.top=-2000;
divIframe.style.left=-2000;
divIframe.style.height=4000;
divIframe.style.width=4000;
}
},
handleResize : function(box) {
……
if(this.hasIframe) {
var divIframe= Ext.getDom(this.id+'_iframe');
divIframe.style.height='100%';
divIframe.style.width='100%';
divIframe.style.top=0;
divIframe.style.left=0;
divIframe.style.position='absolute';
this.el.dom.style.height=box.y; //拖动的时候重新设置了高度
}
},
后记:
1)
使用类似方方法我们可以解决 EXJS里面尽乎所有的DIV被OCX拦住的问题——笔都解决了菜单,面板,窗口,消息框
2)
当然我们可以能过 Ext.DomHelper.append方法把我们的代码写的优雅一点...。。
Ext.DomHelper.append(this.el.dom, {
tag : 'iframe',
id: iframeid,
style : "position:absolute; visibility:inherit; top:0; left:0; width:100%; height:100%; z-index:-1; filter='progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)'",
src : 'javascript:false'
})
如果在EXTJS实现,只需要加上一句全局开关
Ext.useShims =true
在创建各种window的时候加上一句全局开关Ext.useShims=true,给window加上属性shim=true(其实不用加,默认就是true)。
好了,只要一句Ext.useShims=true,就可以遮挡ActiveX了,原来这么简单,layer就是加shim,shadow的,这个shim我还以为是两端间隙,没想到是一个遮挡层。
所谓有现成的方法不用,就是傻蛋啊
分享到:
相关推荐
- 学习这个示例,你可以了解每个步骤的具体实现,包括代码结构、配置设置以及如何将OCX控件集成到实际的Web应用中。 - 按照项目中的指南运行和调试,将有助于加深理解并提供实践经验。 总的来说,这个教程为...
**基于MFC的OCX控件开发教程及示例源代码** OCX(OLE Control Extension)控件,也称为ActiveX控件,是...在实践中,开发者还需要关注安全性、兼容性以及性能优化等方面的问题,以确保OCX控件的稳定性和用户体验。
总的来说,"神器ocx控件方法查看器"是一个强大的开发辅助工具,它简化了OCX控件的探索过程,是Windows应用开发者的得力助手。通过深入理解和使用这个工具,开发者可以更好地利用OCX控件的潜力,提高软件的开发质量和...
了解并熟练使用"ocx控件方法函数查看器"能极大地提升OCX控件的开发效率,减少因不熟悉控件功能而产生的错误。它可以帮助开发者快速定位所需的方法,避免盲目地翻阅API文档,节省了大量的时间和精力。 在进行OCX控件...
"ocx控件方法查看器"正是为了解决这个问题而诞生的。该工具允许用户通过简单的步骤选择目标OCX文件,然后它会自动分析并列出该控件的所有可用方法和属性,极大地提高了开发效率。用户不再需要在大量的API文档中查找...
OCX控件查看工具是一款专门用于探索和理解OCX控件特性的实用程序,对于OCX控件的二次开发至关重要。 首先,我们来深入了解一下OCX控件。OCX控件是由Visual Basic、VC++、Delphi等编程环境创建的,它们可以像按钮、...
在本文中,我们将深入探讨OCX控件的开发过程,以及如何在Internet Explorer(IE)中使用它们,以及如何通过JavaScript进行交互。 ### 1. OCX控件开发基础 - **组件模型**:OCX控件基于COM(Component Object Model...
在 VS2010 中开发和使用 OCX 控件需要遵循一定的步骤,本文将详细介绍如何在 VS2010 中开发和使用 OCX 控件,并说明 JavaScript 如何调用 OCX 控件方法。 一、OCX 简介 OCX 控件是一种 ActiveX 控件,能够在多种...
尽管Unity Web Player已经在现代浏览器中逐渐被淘汰,但在这个示例中,我们依然可以通过OCX控件在WinForm环境中使用它。 总之,通过这个示例工程,开发者可以学习到如何在WinForm应用中集成Unity Web Player,从而...
ocx控件方法查看器,可以查看封装好的ocx控件里的方法。不可以查看dll、exe等其他文件,亲测对ocx控件可以有效查看其方法。
在"NetVideoActiveX23开发包V2.3.23.9"中,我们可以预见到包含了海康威视摄像头OCX控件的最新版本,可能还包括相关的示例代码、库文件以及可能的开发工具。开发人员需要将这个包解压后,参照提供的文档来集成和调试...
本文将详细介绍如何在Web端利用大华提供的OCX控件实现网络摄像机的视频播放、停止、录制以及单帧抓取等功能。OCX(Object Control eXtension)控件是一种ActiveX技术,它允许开发者在应用程序中嵌入和使用特定的功能...
在本文中,我们将深入探讨如何使用Visual Studio 2013(VS2013)开发OCX(OLE自定义控件)控件,并通过一个实际的“demo”项目进行演示。OCX控件是微软在ActiveX技术框架下创建的一种可重用组件,它可以在各种应用...
### C#调用OCX控件的方法 在C#中调用OCX控件是一种常见的技术,尤其是在需要利用已有组件功能的时候。本文将详细介绍如何在C#中注册、导入并使用OCX控件。 #### 一、注册OCX控件 在使用OCX控件之前,首先需要将其...
【标题】"weboffice ocx 控件"是一个专门设计用于在线处理Word文档的组件,它被广泛应用于办公自动化(OA)系统中,以实现高效便捷的远程文档操作功能。这种控件允许用户在Web浏览器环境中直接查看、编辑和创建Word...
总的来说,"海康OCX控件.zip"包含了实现基于Windows的视频监控解决方案的关键组件。无论是对于开发人员还是系统集成商,这个控件都提供了丰富的功能,简化了与海康威视设备的交互。通过深入研究提供的注册指南、示例...
3. dsoframer.ocx控件可能存在版本兼容性问题,确保使用与开发环境和目标操作系统相匹配的版本。 **六、常见问题与解决方案** 1. **控件注册失败**:可能是因为缺少系统权限或文件损坏,尝试重新下载控件并以管理...
【标题】"简单的Web调用OCX控件"涉及到的核心技术是将ActiveX(OCX)控件嵌入到Web页面中,以便于在浏览器环境中实现特定的功能或交互。这通常在早期的Web开发中常见,尤其是在Windows平台下,因为ActiveX是微软推出...