在使用WPF打印时,是否有一种轻量级的方法来包含GDI呈现的内容?

在使用WPF打印时,是否有一种轻量级的方法来包含GDI呈现的内容?,wpf,printing,interop,gdi,Wpf,Printing,Interop,Gdi,我工作的一个项目有一些预先存在的报告,这些报告通过MFC的打印支持打印,并通过GDI或多或少地直接呈现给打印机DC。我们已经开始通过WPF/XAML编写一些新的(不相关的)报告,因为我们正在将新的UI转换为WPF,使用它进行布局会更好 另一只鞋终于掉了,我需要在现有的打印报告中添加一些新功能,而新功能实际上要求使用WPF实现。我们现有的WPF报告是通过XpsDocumentWriter发送到XpsDocument(内存中,而不是磁盘上)的XAML页面实现的。我希望能够继续使用这种策略,并采用编写

我工作的一个项目有一些预先存在的报告,这些报告通过MFC的打印支持打印,并通过GDI或多或少地直接呈现给打印机DC。我们已经开始通过WPF/XAML编写一些新的(不相关的)报告,因为我们正在将新的UI转换为WPF,使用它进行布局会更好

另一只鞋终于掉了,我需要在现有的打印报告中添加一些新功能,而新功能实际上要求使用WPF实现。我们现有的WPF报告是通过XpsDocumentWriter发送到XpsDocument(内存中,而不是磁盘上)的XAML页面实现的。我希望能够继续使用这种策略,并采用编写WPF/XAML报告的方法,这些报告碰巧有一些页面是通过GDI呈现的

我第一次天真的尝试是在XpsDocumentWriter中呈现的UIElement中嵌入HwndHost,但这似乎不起作用。这并不奇怪,但值得一试

下一个显而易见的解决方案,IMO,是将GDI图形呈现为适当大小和比例的位图,并将该位图呈现为XpsDocument中的页面。这是可行的,但页面大小的位图(尤其是内存位图)似乎会导致内存使用率高,在速度较慢的计算机上性能差

理想情况下,我希望将GDI内容呈现为图元文件或其他矢量格式,然后将其转换为XPS。但这必须是一个自动过程,每次都能正常工作,因为它只是一个文档打印功能。OTOH这是一个面向内部用户的应用程序,所以我们可以忍受一些性能下降

WPF开发不是我的主要任务,所以我将自己描述为一个新手,对底层细节没有太多详细的了解。我只是想在恢复使用位图作为传输介质之前确保我没有遗漏任何明显的东西,尽管到目前为止我还没有在搜索中找到任何其他合适的选项


我应该研究的任何内容?

一种方法是在WPF中创建一个可写位图,并将GDI绘制的图像直接导入其中,以便在XPS文档中呈现。第一步可以是从GDIDC直接执行blit(获取指向GDIDC的指针、指向WriteableBitmap的指针,并使用平台调用调用memcpy)。以后的工作可能涉及将MFC GDI绘图转换为香草WPF(使用具有类似GDI绘图方法的WriteableBitmapEx库)


尽管上面的第一种方法将涉及两个位图,但这是我目前所能想到的最好的方法,无需大量重写。第二种方法可能是现成的,也可能不是现成的,因为WriteableBitmaps的绘图支持没有GDI那样扩展。我刚刚想到的最后一种方法是通过平台调用使用GDI,并直接在WriteableBitmap图面上绘制。这将允许一个无需大量重写的端口,并将为您提供所需的性能,同时使代码保持熟悉

一种方法是在WPF中创建一个可写的位图,并将GDI绘制的图像直接导入其中,以便在XPS文档中呈现。第一步可以是从GDIDC直接执行blit(获取指向GDIDC的指针、指向WriteableBitmap的指针,并使用平台调用调用memcpy)。以后的工作可能涉及将MFC GDI绘图转换为香草WPF(使用具有类似GDI绘图方法的WriteableBitmapEx库)


尽管上面的第一种方法将涉及两个位图,但这是我目前所能想到的最好的方法,无需大量重写。第二种方法可能是现成的,也可能不是现成的,因为WriteableBitmaps的绘图支持没有GDI那样扩展。我刚刚想到的最后一种方法是通过平台调用使用GDI,并直接在WriteableBitmap图面上绘制。这将允许一个无需大量重写的端口,并将为您提供所需的性能,同时使代码保持熟悉

谢谢。我曾希望避免通过位图进行手动光栅化(主要是因为处理打印时像素分辨率问题),但这似乎是唯一可行的方法。我想这就是我的问题“否”的答案。恐怕是这样,wpf和gdi中的渲染引擎是完全不同的。让我问一下,如果你已经在GDI中有一个解决方案(它在打印中看起来不错吗?),那么你不能把这个代码打包成C++ DLL,并修改以应付不同的分辨率吗?将宽度、高度、dpi传递给它。然后从c#调用它,在用户每次更改dpi或渲染目标大小时绘制并执行blit以WrirableBitmap?对于Windows 7,xps打印驱动程序中直接内置了gdi支持。遗憾的是,不是vista或xp:当前的GDI解决方案用于打印,并且已经处理了不同的分辨率。我对位图blit方法的担忧是,您所概述的简单方法所需的位图的大小,考虑到我需要在GDI中呈现完整的页面,而不仅仅是页面的一小部分。这可能不成问题,但600 DPI的完整页面是相当大的,即使是灰度。不过我可能太担心了。谢谢。我曾希望避免通过位图进行手动光栅化(主要是因为处理打印时像素分辨率问题),但这似乎是唯一可行的方法。我想这就是我的问题“否”的答案。恐怕是这样,wpf和gdi中的渲染引擎是完全不同的。让我问一下,如果你已经在GDI中有一个解决方案(它在打印中看起来不错吗?),那么你不能把这个代码打包成C++ DLL,并修改以应付不同的分辨率吗?将宽度、高度、dpi传递给它。然后从c#调用它,在用户每次更改dpi或渲染目标大小时绘制并执行blit以WrirableBitmap?对于Windows 7,xps打印驱动程序中直接内置了gdi支持。s