![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Работаю над проектом на 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?", пишу сразу что без него эффект не меняется... |