我有一个使用 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/