2011-09-30 55 views
2

我有一个本地库(没有可用的源代码)包装成C#代码。如何调用从C#代码中绘制WPF图像的本机代码?

下面的C#声明存在:

[DllImport(DRIVER_DLL_NAME, 
CallingConvention = CallingConvention.Cdecl, 
EntryPoint = "RenderBitmap")] 
private static extern int RenderBitmap(int hWnd); 

我需要从我的WPF C#项目调用这个函数。

我有一个Windows窗体工作示例代码:

System.Windows.Forms.PictureBox DisplayWindow; 
... 
RenderBitmap(DisplayWindow.Handle.ToInt32()); 

而且我还没有找到如何使用WPF System.Windows.Controls.Image代替System.Windows.Forms.PictureBox这样做 - 没有Handle财产或类似的东西。

而且我在"WPF and Win32 Interoperation"发现下面的语句: “当你创建一个WPF窗口,WPF创建一个顶级HWND,并使用HwndSource把窗口和WPF内容HWND内的其余部分。你的WPF内容在应用程序中共享单一的HWND。“。 似乎HWND手柄根本不存在Image

如何调用从C#代码中绘制WPF图像的本机代码?

回答

3

WPF控件没有类似于WinForms的句柄。只有主窗口句柄是访问:

例如,在主窗口类(或使用Application.Current.MainWindow):

var handle = (new WindowInteropHelper(this)).Handle; 
var hwnd = HwndSource.FromHwnd(handle); 

所以看起来你已经考虑另一种方法,而不是本地调用。

顺便说一句,为什么你需要这样一个低级别的绘图功能?我可以假设你只是想重用已经实现的WinForms。也许你可以使用内置的WPF功能来实现相同的功能。

+0

我的本机库是相机的驱动程序。还有来自供应商的C#示例 - 围绕本机代码封装,但示例使用WindowsForms。我的应用程序使用WPF。 – sergtk

+1

我相信我明白了,你基本上想为WPF编写自己的包装器。不幸的是,WPF完全是另一个表示框架,并且您已经观察到了最显着的差异之一 - 对于每个控件,没有HWND/Window,如WinForms – sll

+1

@sergdev - 解决方案是将System.Controls.Image放入一个Win32窗体并将该窗体放置在一个窗口中。此解决方案的替代方法是联系供应商并寻求支持。 –