我可以从WPF窗口获取HDC,以便我可以使用Gdi + API绘制它吗?

Nit*_*esh 5 wpf graphics gdi+ hdc

我有一个库,可以使用GDI + apis利用给定的HDC.我想在WPF应用程序中使用它.我尝试从WindowInteropHelper类获取句柄并将其传递给执行绘图的库方法.然而,它失败只是因为它无法从该句柄创建Gdi + Graphics.

然后我尝试在WindowsFormsHost控件中使用WinForm元素并使用WinForm控件的paint事件中提供的HDC,它确实工作正常.我想知道的是,可以直接在WPF控件\窗口上工作吗?有没有其他方法可以从WPF元素中获取HDC,可以使用GDI绘制api?

Cod*_*ray 6

如果您有HWNDWPF窗口的窗口句柄(),可能是使用WindowInteropHelper该类获得的,那么您可以轻松获取HDC该窗口的设备上下文()的句柄.

虽然两者最终都做同样的事情,但有两种方法可以实现.第一个是P/Invoke必要的GDI + API函数,但我们可以很快地将其排除在外,因为它不必要地耗费时间.请记住,.NET Framework已经在System.Drawing命名空间中为WinForms开发包装了所有这些东西,尤其是Graphics.所以你需要做的就是添加System.Drawing对你的WPF应用程序的引用,你将免费获得所有这些包装的功能.

您感兴趣的部分是Graphics.FromHwnd方法,它Graphics从指定的窗口句柄(HWND)创建一个新对象.

一旦你有了这个,你可以HDC通过调用Graphics.GetHdc方法获得设备上下文()的句柄,该方法返回你正在追求的东西 - 一个IntPtr表示设备上下文句柄的值.

请记住,在完成对象后,您需要在对象上调用该Dispose方法Graphics以释放其相关资源.