2011-04-21 65 views
2

如何在Windows窗體中顯示過量窗口?關於C#表單的OpenGL視圖

glutCreateWindow( 「實施例」)創建另一種形式中,

glutCreateSubWindow(HWND,0,0,100,100),其中hwnd是處理在C#我的主窗口的形式,我得到一個AccessViolation異常。

Glut程序在C++ DLL中。我的應用程序在C#WPF上。我需要在我的C#形式顯示過剩視圖

C++代碼:

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; 
     } 
    } 

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

我沒有足夠的信心張貼作爲回答,但一對夫婦的想法... 1. /在你的C#代碼中嘗試在Window_Loaded和InitGlut中添加'unsafe'。 2.確保您使用的是全部3個元素(GLUT庫,C++代碼和C#代碼)的64位版本。 – 2011-04-21 20:24:10

+0

您的代碼中存在簽名不匹配,這將導致64位操作系統崩潰。 C++方面希望hwnd是一個'int'(這也是錯誤的 - 它們是指針大小的),C#將它作爲'IntPtr'傳遞(正確,但不是C++期望的)。 – ChrisV 2011-04-21 21:05:33

回答

1

你看上去託管在WPF形式的Win32對象。是的,這需要解決方法。

你見過MSDN上的WPF和Win32互操作指南嗎?

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

你需要檢查出HwndHost類,太:

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

+0

這不完全是Win32對象。例如,我從本教程中創建一個簡單的glut應用程序(http://www.lighthouse3d.com/tutorials/glut-tutorial/initialization/)。這是一個Win32控制檯應用程序,它在glutCreateWindow函數的幫助下創建glut窗口。我將其更改爲dll並從我的WPF調用它的函數。 – EthanHunt 2011-04-22 10:19:42

+0

GLUT可能被WPF視爲一個Win32對象,因爲它不是WPF。 – djdanlib 2011-04-25 14:04:25