2011-04-21 5 views
2

Windows Form 내에 glut window를 표시하는 방법은 무엇입니까?C# 폼의 OpenGL 뷰

glutCreateWindow ("예"), HWND가 C에서 # 내 메인 창 형성하는 핸들

glutCreateSubWindow (HWND, 0, 0, 100, 100), 다른 형태를 만들고 난 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# 코드 : 당신은 WPF의 형태는 Win32 개체를 호스팅하는 것처럼

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에 추가해보십시오. 2./당신이 모든 3 요소 (GLUT 라이브러리, C++ 코드 및 C# 코드)의 64 비트 버전을 사용하고 있는지 확인하십시오. –

+0

코드에 서명 불일치가있어 64 비트 운영 체제에서 충돌이 발생합니다. C++ 측에서는 hwnd가'int' (포인터 크기가 잘못되어 있습니다)라고 기대하고 있습니다. C#은'IntPtr' (올바른 것이지만 C++이 기대하는 것은 아닙니다)로 전달합니다. – ChrisV

답변

1

보인다. 예, 해결 방법이 필요합니다.

MSDN에서 WPF 및 Win32 Interoperation 가이드를 보았습니까?

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

당신은 역시 HwndHost 클래스를 확인해야합니다 :

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

+0

이것은 정확히 Win32 개체가 아닙니다. 예를 들어,이 자습서 (http://www.lighthouse3d.com/tutorials/glut-tutorial/initialization/)에서 간단한 glut 응용 프로그램을 만듭니다. 이것은 glutCreateWindow 함수의 도움으로 glut 창을 만드는 Win32 콘솔 응용 프로그램입니다. DLL로 변경하고 WPF에서 함수를 호출합니다. – EthanHunt

+0

GLUT는 WPF가 아니기 때문에 아마도 WPF에 의해 Win32 개체로 간주됩니다. – djdanlib