Представление OpenGL в форме C #

#c# #c #dll #glut #glutcreatewindow

#c# #c #dll #перенасыщение #glutcreatewindow

Вопрос:

Как отобразить окно переполнения внутри формы Windows?

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

Комментарии:

1. Я не настолько уверен, чтобы публиковать в качестве ответа, но пара идей … 1./ Попробуйте добавить ‘unsafe’ к Window_Loaded и InitGlut в вашем коде C #. 2. / Убедитесь, что вы используете 64-разрядные версии всех 3 элементов (библиотеки GLUT, вашего кода на C и вашего кода на C #).

2. У вас есть несоответствие подписи в вашем коде, которое приведет к сбоям в 64-разрядных операционных системах. Сторона C ожидает, что hwnd будет int (что также неверно — они имеют размер указателя), и C # передает его как IntPtr (правильно, но не то, что ожидает C ).

Ответ №1:

Похоже, вы размещаете объект Win32 в форме WPF. Да, для этого требуются обходные пути.

Вы видели руководство по взаимодействию WPF и Win32 в MSDN?

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

Вам также нужно проверить класс HwndHost:

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

Комментарии:

1. Это не совсем объект Win32. Например, я создаю простое приложение для перенасыщения из этого руководства ( lighthouse3d.com/tutorials/glut-tutorial/initialization ). Это консольное приложение Win32, которое создает окно переполнения с помощью функции glutCreateWindow. Я меняю его на dll и вызываю его функции из моего WPF.

2. WPF, вероятно, считает GLUT объектом Win32, поскольку это не WPF.