代码之家  ›  专栏  ›  技术社区  ›  Mike Caron

有没有方法使用本地C++从WPF窗口捕获位图?

  •  2
  • Mike Caron  · 技术社区  · 16 年前

    想象一下MDI应用程序中的一个文档窗口包含一个子WPF窗口,比如说一个侧边栏。如何获得包含wpf像素和gdi(非wpf)像素的位图?

    我发现当我对Win7任务栏应用图标进行缩略图预览悬停时,预览中WPF像素应该出现的部分会变黑。我当前的方法只是获取文档窗口的位图捕获。然后我得到一个预览的DC,从中生成一个内存DC,并在其中选择位图。然后我做一些大小调整,将内存dc位置为实际dc。我猜想bitblt操作没有考虑到WPF像素是硬件加速的,因此需要从图形硬件中获取。GDI中的所有内容都管理得很好,但是当没有WPF子窗口时,预览图像看起来很好。

    我想知道是否有可能从本地C++获取WPF窗口的位图。然后我可以把它涂到前一个预览的黑色区域。

    2 回复  |  直到 16 年前
        1
  •  0
  •   Andy    16 年前

    也许我没有正确理解你目前的方法,但你能做一个 BitBlt() 从屏幕DC到内存DC?你得把窗户的屏幕弄清楚,但那不应该太糟。

        2
  •  0
  •   Community Mohan Dere    9 年前

    为了解决这个问题,我必须在包含一个虚拟方法的本机代码中创建一个抽象类,以获得在C++/CLI中实现的位图。在托管实现中,我使用了.NET RenderTargetBitmap 类获取WPF窗口的位图捕获,然后填充传入的cBitmap对象(请参见 How to get an BITMAP struct from a RenderTargetBitmap in C++/CLI? )。在非托管调用程序中,我使用虚拟方法获取位图。

    简而言之,没有办法通过简单地使用非托管C++来获得位图,因为WPF和GDI真的不适合于所有的实际用途。