一种使 ActiveX 元素与 HTML 元素重叠的解决方法






3.57/5 (2投票s)
此解决方法允许您在 ActiveX 元素(`
引言
每个 HTML 编写者都知道一个关于下拉列表(`<SELECT>` 标签)和 ActiveX 重叠的问题。任何尝试将 `DIV` 或任何 HTML 元素置于 ActiveX 之上的努力都没有效果。即使 ActiveX 的 z-index 比 HTML 元素高,它也始终位于最顶层。原因是 Explorer 渲染内容的方式。参见 http://support.microsoft.com/default.aspx?scid=kb;en-us;177378。
控件有两种类型:窗口化元素和无窗口元素,它们在不同的平面上渲染。所有窗口化元素都会绘制在所有无窗口元素之上,而不管其容器的意愿如何。但是,窗口化元素彼此之间会遵循 z-index 属性,就像无窗口元素彼此之间遵循 z-index 属性一样。
所有无窗口元素都在同一个 MSHTML 平面上渲染,而窗口化元素则在单独的 MSHTML 平面上绘制。您可以使用 z-index 来操作同一平面上的元素,但不能与不同平面上的元素混合匹配。您可以重新排列每个平面上的元素的 z-index,但窗口化平面始终绘制在无窗口平面之上。
在大多数情况下,`<OBJECT>` 标签是窗口化的。这就是为什么它总是位于顶层的原因。
解决方法
我的解决方法很简单,甚至有点愚蠢。当您想在 ActiveX 上方显示一个 HTML 元素(例如 `<DIV>`)时,您可以创建一个 ActiveX 的屏幕截图,将其保存到临时文件夹,然后用此图像替换 ActiveX。最后,您可以撤消这些更改,隐藏图像并显示 ActiveX。
实现
我使用了 Microsoft 文章《如何捕获和打印屏幕、窗体或任何窗口》( http://support.microsoft.com/default.aspx?scid=kb;en-us;Q161299 ) 中的捕获例程。然后我使用内存流将其保存到文件。所有这些都在 VB6 中实现,但它可以很容易地移植到 C++,因为大部分功能都在 Windows API 调用中。ActiveX 的公共函数 `GetImageFileName()` 负责创建屏幕截图并返回已创建文件的完整名称。
绑定到复选框的 JavaScript 操作替换过程。
安装和演示
在 Zip 文件中,您将找到以下内容:
- ActiveX 的 VB6 项目:OverlapDemoControl.vbp。
- 已编译的 ActiveX:OverlapDemoControl.ocx。
- 包含 `<OBJECT>` 标签、`<DIV>` 标签和相应 JavaScript 的 HTML:OverlapActiveX.htm。
要从 Visual Basic 运行示例,您只需打开并编译项目即可。否则,您可以使用 `regsvr32` 注册 OverlapDemoControl.ocx。要进行测试,只需单击复选框即可。