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

标签 wpf graphics gdi+ gdi

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

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

最佳答案

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

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

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

一旦你得到了它,你可以通过调用 HDC method 来获得设备上下文的句柄(Graphics.GetHdc)。 ,它会返回你所追求的——一个 IntPtr表示设备上下文句柄的值。

请记住,您需要调用 Dispose method在您的 Graphics 上完成后对象以释放其相关资源。

关于wpf - 我可以从 WPF 窗口获取 HDC 以便我可以使用 Gdi+ API 绘制它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8656827/

相关文章:

graphics - 在 Vulkan(或任何其他现代图形 API)中,栅栏应该按队列提交还是按帧等待?

c# - 自定义控件边框不显示是否调用 Update(),但显示是否调用 Refresh()

C#:为什么旋转不可逆矩阵并再次返回使其可逆

c# - 奇怪的 HttpClient 结果

wpf - xaml "local:"是什么?

c# - MVVM Light 中有两种 ViewModel 吗?

c# - 有没有一种简单的方法可以混合两个 System.Drawing.Color 值?

c# - 更高效地将 WinForms 转换为 WPF 或将 WPF 转换为 Winforms

java - AffineTransform.rotate() - 如何同时进行 xlate、旋转和缩放?

image - BlackBerry - 如何调整大小和存储图像?