Да убрал этот модуль, использую стандартный модуль OpenGL. Много раз все переписывал, пробовал по-разному с окнами работать (и создавать и удалять через WinAPI). Сейчас все работает, но ошибка остается. Я временно сделал вместо удаления окон скрытие. При закрытии программы происходит удаление окон и вылетает ошибка. Если только закоментировать вызовы самих функций openGL, то ошибка пропадает.
Код:
procedure TGLScene.SetDCPixelFormat(dc: HDC);
var
pfd: TPixelFormatDescriptor;
nPixelFormat: Integer;
begin
FillChar (pfd, SizeOf(pfd), 0); //заполняем структуру pfd нулями
//также ты можешь добавить свои элементы как в обычную запись,
//например, pfd.dwFlags := PFD_DOUBLEBUFFER
pfd.dwFlags := PFD_DOUBLEBUFFER;
nPixelFormat := ChoosePixelFormat (dc, @pfd); //определяем оптимальный номер формата
SetPixelFormat (dc, nPixelFormat, @pfd); //устанавливаем формат
end;
Создание окна:
Код:
dc:=GetDC(HandleW);
SetDCPixelFormat(dc);
hrc:=wglCreateContext(dc);
wglMakeCurrent(DC, HRC);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
base0:=glGenLists(96);
font:=CreateFont(-12 //высота фонта
,0 //ширина фонта
,0 //угол отношения
,0 //угол наклона
,FW_NORMAL //FW_DONTCARE - 0, FW_NORMAL - 400, FW_BOLD - 700, и FW_BLACK - 900.
,0 // Курсив
,0 // Подчеркивание
,0 // Перечеркивание
,ANSI_CHARSET, // Идентификатор набора символов
OUT_TT_PRECIS, // Точность вывода
CLIP_DEFAULT_PRECIS, // Точность отсечения
ANTIALIASED_QUALITY, // Качество вывода
FF_DONTCARE or DEFAULT_PITCH, // Семейство и шаг
'Arial'); // Имя шрифта
SelectObject(DC, font); // Выбрать шрифт, созданный нами ( НОВОЕ )
wglUseFontBitmaps(DC, 32, 96, base0); // Построить 96 символов начиная с пробела ( НОВОЕ )
Код:
glClearColor(c_r,c_g,c_b,0.0);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
Каждый рендер начинается с
Код:
wglMakeCurrent(DC, HRC);
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glViewport(x,y,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(perpective_angle,w/h,NearClipping,FarClipping);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
glDisable(GL_CULL_FACE);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable (GL_LINE_SMOOTH);
glEnable(GL_POLYGON_SMOOTH);
glEnable(GL_MULTISAMPLE_ARB);
glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
gluLookAt(cx,cy,cz,ccx,ccy,ccz,ax,ay,az);
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT1, GL_AMBIENT, @LightAmbient);
glLightfv(GL_LIGHT1, GL_DIFFUSE, @LightDiffuse);
glLightfv(GL_LIGHT1, GL_POSITION, @LightPosition);
glEnable(GL_LIGHT1);
glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
Удаление окна:
Код:
glDeleteLists(base3, 96);
glDeleteLists(base2, 96);
glDeleteLists(base1, 96);
glDeleteLists(base0, 96);
wglMakeCurrent(0, 0);
wglDeleteContext(hrc);
if ReleaseDC(handleW,dc)<>0 then begin
ShowMessage('Ошибка ReleaseDC(handleW,dc)');
end;
Уже и через модуль проверки утечек памяти прогонял свой код, вроде все ок. Помогает только выключить вызов всех функций openGL и тогда все работает отлично )) А так, ошибка при удалении окна в Windows.DestroyWindow:
Код:
procedure TWinControl.DestroyWindowHandle;
begin
Include(FControlState, csDestroyingHandle);
try
if not Windows.DestroyWindow(FHandle) then
RaiseLastOSError;
finally
Exclude(FControlState, csDestroyingHandle);
end;
FHandle := 0;
end;
|