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

时间:2011-12-28 13:57:21

标签: wpf graphics gdi+ hdc

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

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

1 个答案:

答案 0 :(得分:6)

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

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

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

完成后,您可以通过调用Graphics.GetHdc method来获取设备上下文(HDC)的句柄,Dispose method会完全返回您之后的IntPtr表示设备上下文句柄的值。

请记住,完成后,您需要在Graphics对象上调用{{3}}才能释放相关资源。