我有一个库,可以使用GDI + apis来获取给定的HDC。 我想在WPF应用程序中使用它。我尝试从WindowInteropHelper类获取句柄并将其传递给执行绘图的库方法。然而,它失败的原因仅仅是因为它无法从该句柄创建Gdi + Graphics。
然后我尝试在WindowsFormsHost控件中使用WinForm元素并使用WinForm控件的paint事件中可用的HDC,它确实工作正常。 我想知道的是,可以直接在WPF控件\窗口上工作吗? 还有其他方法可以从WPF元素中获取HDC,可以使用GDI绘制api吗?
答案 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}}才能释放相关资源。