`

WEB开发下面DIV层被OCX控件拦住问题的解决思想,以及结合EXTJS的解决方法

 
阅读更多
公司开发的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我还以为是两端间隙,没想到是一个遮挡层。

所谓有现成的方法不用,就是傻蛋啊
分享到:
评论

相关推荐

    C#开发OCX控件,已经ASP.net调用OCX

    - 学习这个示例,你可以了解每个步骤的具体实现,包括代码结构、配置设置以及如何将OCX控件集成到实际的Web应用中。 - 按照项目中的指南运行和调试,将有助于加深理解并提供实践经验。 总的来说,这个教程为...

    基于MFC的OCX控件开发教程及示例源代码

    **基于MFC的OCX控件开发教程及示例源代码** OCX(OLE Control Extension)控件,也称为ActiveX控件,是...在实践中,开发者还需要关注安全性、兼容性以及性能优化等方面的问题,以确保OCX控件的稳定性和用户体验。

    神器ocx控件方法查看器.

    总的来说,"神器ocx控件方法查看器"是一个强大的开发辅助工具,它简化了OCX控件的探索过程,是Windows应用开发者的得力助手。通过深入理解和使用这个工具,开发者可以更好地利用OCX控件的潜力,提高软件的开发质量和...

    ocx控件方法函数查看器

    了解并熟练使用"ocx控件方法函数查看器"能极大地提升OCX控件的开发效率,减少因不熟悉控件功能而产生的错误。它可以帮助开发者快速定位所需的方法,避免盲目地翻阅API文档,节省了大量的时间和精力。 在进行OCX控件...

    ocx控件方法查看器

    "ocx控件方法查看器"正是为了解决这个问题而诞生的。该工具允许用户通过简单的步骤选择目标OCX文件,然后它会自动分析并列出该控件的所有可用方法和属性,极大地提高了开发效率。用户不再需要在大量的API文档中查找...

    OCX控件查看工具

    OCX控件查看工具是一款专门用于探索和理解OCX控件特性的实用程序,对于OCX控件的二次开发至关重要。 首先,我们来深入了解一下OCX控件。OCX控件是由Visual Basic、VC++、Delphi等编程环境创建的,它们可以像按钮、...

    关于ocx控件开发

    在本文中,我们将深入探讨OCX控件的开发过程,以及如何在Internet Explorer(IE)中使用它们,以及如何通过JavaScript进行交互。 ### 1. OCX控件开发基础 - **组件模型**:OCX控件基于COM(Component Object Model...

    使用C++制作ocx控件

    在 VS2010 中开发和使用 OCX 控件需要遵循一定的步骤,本文将详细介绍如何在 VS2010 中开发和使用 OCX 控件,并说明 JavaScript 如何调用 OCX 控件方法。 一、OCX 简介 OCX 控件是一种 ActiveX 控件,能够在多种...

    Winform上嵌入Unity Web Player OCX控件及示例工程

    尽管Unity Web Player已经在现代浏览器中逐渐被淘汰,但在这个示例中,我们依然可以通过OCX控件在WinForm环境中使用它。 总之,通过这个示例工程,开发者可以学习到如何在WinForm应用中集成Unity Web Player,从而...

    神器ocx控件方法查看器

    ocx控件方法查看器,可以查看封装好的ocx控件里的方法。不可以查看dll、exe等其他文件,亲测对ocx控件可以有效查看其方法。

    海康威视摄像头OCX控件

    在"NetVideoActiveX23开发包V2.3.23.9"中,我们可以预见到包含了海康威视摄像头OCX控件的最新版本,可能还包括相关的示例代码、库文件以及可能的开发工具。开发人员需要将这个包解压后,参照提供的文档来集成和调试...

    大华摄像头OCX控件和web端页面中使用例子(超详细,亲测可用)

    本文将详细介绍如何在Web端利用大华提供的OCX控件实现网络摄像机的视频播放、停止、录制以及单帧抓取等功能。OCX(Object Control eXtension)控件是一种ActiveX技术,它允许开发者在应用程序中嵌入和使用特定的功能...

    用VS2013开发OCX控件demo

    在本文中,我们将深入探讨如何使用Visual Studio 2013(VS2013)开发OCX(OLE自定义控件)控件,并通过一个实际的“demo”项目进行演示。OCX控件是微软在ActiveX技术框架下创建的一种可重用组件,它可以在各种应用...

    c#调用ocx控件的方法

    ### C#调用OCX控件的方法 在C#中调用OCX控件是一种常见的技术,尤其是在需要利用已有组件功能的时候。本文将详细介绍如何在C#中注册、导入并使用OCX控件。 #### 一、注册OCX控件 在使用OCX控件之前,首先需要将其...

    weboffice ocx 控件

    【标题】"weboffice ocx 控件"是一个专门设计用于在线处理Word文档的组件,它被广泛应用于办公自动化(OA)系统中,以实现高效便捷的远程文档操作功能。这种控件允许用户在Web浏览器环境中直接查看、编辑和创建Word...

    海康OCX控件.zip

    总的来说,"海康OCX控件.zip"包含了实现基于Windows的视频监控解决方案的关键组件。无论是对于开发人员还是系统集成商,这个控件都提供了丰富的功能,简化了与海康威视设备的交互。通过深入研究提供的注册指南、示例...

    dsoframer.ocx控件以及使用方法

    3. dsoframer.ocx控件可能存在版本兼容性问题,确保使用与开发环境和目标操作系统相匹配的版本。 **六、常见问题与解决方案** 1. **控件注册失败**:可能是因为缺少系统权限或文件损坏,尝试重新下载控件并以管理...

    简单的Web调用OCX控件

    【标题】"简单的Web调用OCX控件"涉及到的核心技术是将ActiveX(OCX)控件嵌入到Web页面中,以便于在浏览器环境中实现特定的功能或交互。这通常在早期的Web开发中常见,尤其是在Windows平台下,因为ActiveX是微软推出...

Global site tag (gtag.js) - Google Analytics