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

7
我有一个库,使用GDI+ API在给定的HDC上进行绘制。 我想在WPF应用程序中使用它。我尝试从WindowInteropHelper类获取句柄,并将其传递给执行绘图的库方法。但是它失败了,因为它无法从该句柄创建Gdi+ Graphics。
然后,我尝试在WindowsFormsHost控件中使用WinForm元素,并在WinForm控件的paint事件中使用可用的HDC,这样做可以正常工作。 我想知道的是,是否可以直接在WPF控件\窗口上实现相同的事情? 是否有其他方法可以从WPF元素中获取HDC,以便使用GDI绘图API?
1个回答

8
如果您拥有WPF窗口的窗口句柄(HWND),通常是使用 WindowInteropHelper 类获得的,那么您可以轻松地获取该窗口的设备上下文(HDC)句柄。有两种方法可以获取它,尽管两者最终都会做相同的事情。第一种方法是P / Invoke必要的GDI + API函数,但我们可以很快排除这个方法,因为它太浪费时间了。请记住,.NET框架已经在WinForms开发中用System.Drawing命名空间包装了所有这些东西,特别是Graphics类。因此,您所需要做的就是将对 System.Drawing 的引用添加到WPF应用程序中,然后您将免费获得所有这些包装功能。您感兴趣的部分是 Graphics.FromHwnd 方法,它从指定的窗口句柄( HWND )创建一个新的 Graphics 对象。一旦获得了它,您可以通过调用Graphics.GetHdc方法来获取一个设备上下文(HDC)句柄,它会返回正是您需要的 IntPtr 值,表示设备上下文的句柄。请记住,在完成使用 Graphics 对象后,您需要调用Dispose方法来释放与其关联的资源。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接