Показать сообщение отдельно
  #1  
Старый 13.07.2011, 18:44
virtustilus virtustilus вне форума
Прохожий
 
Регистрация: 13.07.2011
Сообщения: 4
Репутация: 10
По умолчанию OpenGL Delphi 7 и удаление окна

Работаю над проектом на Delphi, недавно решил прикрутить OpenGL. Для упрощения решил использовать библиотеку dglOpenGL. Всё работает отлично почти до самого конца. Т.е. при закрытии приложения прога вылетает с какой-нибудь ошибкой, обычно в работе с окнами.

Сначала я использовал вывод в дочернее окно TPanel.
Кода в проекте много, даже самого OpenGL, приведу основное:

инициализация:

Код:
  dc:=GetDC(HandleW);
  if not InitOpenGL then begin
     Halt;
  end;

  hrc:=CreateRenderingContext(dc,[opDoubleBuffered],16,16,0,0,0,5);
  ActivateRenderingContext(dc,hrc);

  glClearColor(c_r,c_g,c_b,0.0);
  glEnable(GL_DEPTH_TEST);
  glEnable(GL_CULL_FACE);

А при закрытии окна (OnClose):


Код:
  
  DeactivateRenderingContext; //внутри wglMakeCurrent(0, 0);
  DestroyRenderingContext(hrc); //внутри wglDeleteContext(HRC);
также пробовал после этого добавлять вот это:
Код:
  
  ReleaseDC(handleW,dc)
  DeleteDC(dc)
, но они обе завершаются с ошибкой (проверял условиями).

При этом после закрытия окна программа вылетает с различными ошибками модулей работы с окнами.

Далее я подумал, что это проблема делфи и решил сделать отдельный класс, который будет создавать своё дочернее окно в конструкторе:

Код:
  
  window.cbSize := sizeof (window);
  window.style := CS_HREDRAW or CS_VREDRAW;
  window.lpfnWndProc := @WindowProc;
  window.cbClsExtra := 0;
  window.cbWndExtra := 0;
  window.hInstance := HInstance;
  window.hIcon := LoadIcon (0,IDI_APPLICATION);
  window.hCursor := LoadCursor (0,IDC_ARROW);
  window.hbrBackground:=Color_BtnFace+12;
  window.lpszMenuName := nil;
  window.lpszClassName := pchar(s);
  RegisterClassEx(window);

  Mwindow:=CreateWindowEx(WS_EX_NOPARENTNOTIFY,pchar(s),pchar(Name), WS_CHILDWINDOW ,x,y,w,h,parentw,0,Hinstance,nil);

а в деструкторе класса сделал удаление окна:

Код:
DestroyWindow(Mwindow);

Но после первого же закрытия такого окна и работе с другими окнами опять вылетает в каком-либо месте ошибка.

Далее я решил попробовать отключить сам OpenGL (для него я сделал отдельный класс). Сделал константу и наставил условий, которыми отключил все функции OpenGL.
В итоге программа стала работать нормально. Т.е. выходит ошибка удаления самого OpenGL окна.

Ну и как вариант, остается не удалять OpenGL-окно и работать до самого конца, просто скрывая их или показывая, но в конце работы приложения всё равно вывалится ошибка...

Например при попытке показать другое окно, после закрытия этого произошел останов по Int3. Приложил CallStack.

Синим выделена моя процедура, там идет Show другой формы.

Что еще пробовал: отключить DestroyRenderingContext(hrc) - никакой разницы;
создавать окно не Child, а отдельное - такой же результат уничтожения.

Единственное, что срабатывает, так это замена уничтожения окна на скрытие:
Код:
  //DestroyWindow(window1);
  ShowWindow(window1,SW_HIDE);
Тогда всё работает, до закрытия программы, когда эти окна всё-таки будут уничтожены.


Может кто знает, может сталкивался с такой проблемой или хорошо разбирается в работе WINAPI с окнами, что это может быть?

P.S. Если кто-то хочет спросить "зачем WS_EX_NOPARENTNOTIFY?", пишу сразу что без него эффект не меняется...
Ответить с цитированием