2011-04-21 2 views
2

Comment afficher une fenêtre de sous-fenêtres dans Windows Form?Affichage OpenGL sur le formulaire C#

glutCreateWindow ("exemple") créer une autre forme,

glutCreateSubWindow (hwnd, 0, 0, 100, 100), où hwnd est la poignée à ma principale forme de fenêtre en C#, je reçois une exception AccessViolation.

Le programme Glut est dans une DLL C++. Mon application est sur C# WPF. Je dois afficher la vue GLUT à mon C# Formulaire

C++ Code:

extern "C" 
    { 
     __declspec(dllexport) int InitGlut(int hwnd, int top, int left, int width, int height) 
     { 
      glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); 
      glutInitWindowPosition(top,left); 
      glutInitWindowSize(320,320); 
      //glutCreateWindow("Example"); 
      glutCreateSubWindow(hwnd, top, left, width, height); 
      glutDisplayFunc(renderScene); 
      glutMainLoop(); 
      return 0; 
     } 
    } 

code C#:

const string pathToDll = "../../../Release/MyDLL.dll"; 
[DllImport(pathToDll)] 
public static extern int InitGlut(IntPtr hwnd, int top, int left, int width, int height); 

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    IntPtr hwnd = new WindowInteropHelper(Application.Current.MainWindow).Handle; 
    InitGlut(hwnd, 0, 0, 100, 100); 
} 
+0

Je ne suis pas assez confiant pour poster comme une réponse, mais quelques idées ... 1./Essayez d'ajouter 'non sécurisé' à Window_Loaded et InitGlut dans votre code C#. 2./Assurez-vous que vous utilisez des versions 64 bits des 3 éléments (la bibliothèque GLUT, votre code C++ et votre code C#). –

+0

Vous avez une incohérence de signature dans votre code qui provoquera des plantages sur les systèmes d'exploitation 64 bits. Le côté C++ s'attend à ce que hwnd soit un 'int' (ce qui est également faux - ils sont de la taille d'un pointeur), et C# le transmet comme un' IntPtr' (correct, mais pas ce que C++ attend). – ChrisV

Répondre

1

On dirait que vous hébergez un objet Win32 sous une forme WPF. Oui, cela nécessite des solutions de contournement.

Avez-vous vu le guide d'interopérabilité WPF et Win32 sur MSDN?

http://msdn.microsoft.com/en-us/library/ms742522.aspx

Vous devez vérifier la classe HwndHost aussi:

http://msdn.microsoft.com/en-us/library/system.windows.interop.hwndhost.aspx

+0

Ce n'est pas exactement l'objet Win32. Par exemple, je crée une application de glut simple à partir de ce tutoriel (http://www.lighthouse3d.com/tutorials/glut-tutorial/initialization/). Ceci est une application console Win32, qui crée une fenêtre glut à l'aide de la fonction glutCreateWindow. Je le change en dll et appelle ses fonctions de mon WPF. – EthanHunt

+0

GLUT est probablement considéré comme un objet Win32 par WPF, puisqu'il ne s'agit pas de WPF. – djdanlib