Показать сообщение отдельно
  #8  
Старый 17.10.2011, 12:03
virtustilus virtustilus вне форума
Прохожий
 
Регистрация: 13.07.2011
Сообщения: 4
Репутация: 10
По умолчанию

Да убрал этот модуль, использую стандартный модуль 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;
Ответить с цитированием