65.9K
CodeProject 正在变化。 阅读更多。
Home

OCX 快照

starIconstarIconstarIconstarIconstarIcon

5.00/5 (5投票s)

2000年2月10日

公共领域
viewsIcon

73147

downloadIcon

2330

如何在不使用 HWND 的情况下获取 OCX 的快照。

  • 下载演示项目 - 33 Kb
  • 下载源代码文件 - 27 Kb
  • Sample Image - ViewObjSnap.jpg

    最近,我实习的公司(Bradley Ward Systems)需要一种方法来在网上显示复杂的数据报告。我们已经有很多自定义 OCX,以图表的形式呈现这些报告。这些 OCX 用于我们的自定义应用程序中——它们从未打算嵌入到网页中。

    由于我们希望使网络报告尽可能轻量级,因此将 OCX 重新调整为也嵌入到网页中根本不可行——我们不想对将用于查看这些报告的计算机施加严格的系统要求。我们决定在网上显示这些报告的最佳方法是获取我们 OCX 的“快照”,并将其写入 JPEG 以在网页上显示。

    因此,我们最大的问题是如何获取 OCX 的图像……我们尝试了各种通过使用 OCX 嵌入到的窗体上的 HWND 来获取图像的方法。这存在两个主要问题:首先,每当我们想要获取 OCX 的图像时,一个可见的窗体必须出现在 Web 服务器的屏幕上;其次,必须有人登录到 Web 服务器才能创建嵌入 OCX 的窗体。我们根本找不到解决这些问题的方法。

    因此,我们没有使用 HWND 来欺骗 OCX 绘制到我们创建的 DC 中,而是深入了一些……

    每个 OCX 都必须实现标准的 IViewObject 接口——其中一个方法是 Draw()。听起来很完美,对吧?几乎——我们还需要确定 OCX 的尺寸,而 IViewObject 接口并没有暴露此功能。我们使用了 IOleObject 接口的 GetExtents() 来实现这一点。我编写了一个小型 ActiveX 控制,该控制执行这些调用,并返回一个 IPicture 对象,以便嵌入到 VB 窗体上的 Picture 控制中。

    我在这里展示的 ActiveX 控制——名为 ViewObjSnap——是我在工作中编写的一个精简版本。它不会将图像写入 JPG 或任何其他格式,因此您需要对其进行一些修改才能在实际情况下使用。它仅旨在演示我们问题的一个有趣的解决方案。

    ViewObjSnap 控制的源代码包含在 ViewObjSnap_src.zip 文件中。源代码和演示 VB 项目,以及为那些没有 VB 的人提供的编译后的 EXE,都包含在 ViewObjSnap_demo.zip 中。

    © . All rights reserved.