2011-09-30 3 views
2

J'ai une bibliothèque native (aucune source disponible) enveloppée dans le code C#.Comment appeler le code natif qui dessine dans WPF Image à partir du code C#?

La déclaration suivante C# existe:

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

Je dois appeler cette fonction de mon projet WPF C#.

J'ai un exemple de code de travail pour les Windows Forms:

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

Et je n'ai pas trouvé comment faire avec WPF System.Windows.Controls.Image au lieu de System.Windows.Forms.PictureBox - il n'y a pas Handle propriété ou quelque chose de similaire.

De plus, je trouve dans "WPF and Win32 Interoperation" la déclaration suivante: « Lorsque vous créez une fenêtre WPF, WPF crée un haut niveau HWND, et utilise un HwndSource pour mettre la fenêtre et son contenu WPF à l'intérieur du HWND Le reste. votre contenu WPF dans l'application partage ce HWND singulier. ". Il semble que la poignée HWND n'existe pas du tout pour Image. Comment appeler le code natif qui dessine WPF Image à partir du code C#?

Répondre

3

Les contrôles WPF n'ont pas de handles comme dans WinForms. Seulement principale poignée de fenêtre est accessible:

Par exemple, dans la classe principale de la fenêtre (ou utilisez Application.Current.MainWindow):

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

semble donc que vous avez à envisager une autre approche au lieu des appels natifs.

BTW, pourquoi vous avez besoin d'une telle fonctionnalité de dessin de bas niveau? Je peux juste supposer que vous voulez simplement réutiliser celui déjà implémenté pour WinForms. Peut-être que vous pouvez réaliser la même chose en utilisant des fonctionnalités WPF intégrées.

+0

Ma bibliothèque native est le pilote de la caméra. Et il y a des exemples C# de fournisseur-wrapper autour du code natif, mais l'exemple utilise WindowsForms. Et mon application utilise WPF. – sergtk

+1

Je crois que j'ai eu l'idée, vous voulez essentiellement écrire vos propres wrappers pour le WPF. Malheureusement WPF est complètement un autre cadre de présentation et l'une des différences les plus significatives que vous avez déjà observées - il n'y a pas HWND/Window pour chaque contrôle comme dans WinForms – sll

+1

@sergdev - La solution serait de placer un System.Controls.Image dans un formulaire Win32 et placez le formulaire dans une fenêtre. Une alternative à cette solution est de contacter le vendeur et demander de l'aide. –

Questions connexes