Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 16.04.2008, 21:00
Аватар для AXS
AXS AXS вне форума
Новичок
 
Регистрация: 26.11.2006
Адрес: РК г. Талдыкорган
Сообщения: 67
Репутация: 15
Восклицание

Так... Простейший класс написал. Он инициализирует OpenGL и завершает его.

Код:
unit MAKEngine;

interface

uses
  dglOpenGL, Windows, SysUtils;

type
  TMEngine = class(TObject)
  private
    FDC: HDC;
    FRC: HGLRC;
    FBW: Integer;
    FBH: Integer;
    FOrtZoom: Integer;
    FBHandle: HWND;
    procedure SetDCPixelFormat;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Initiate(Perspective: Boolean);
    property DC: HDC read FDC write FDC;
    property RC: HGLRC read FRC write FRC;
    property BW: Integer read FBW write FBW;
    property BH: Integer read FBH write FBH;
    property OrtZoom: Integer read FOrtZoom write FOrtZoom;
    property BHandle: HWND read FBHandle write FBHandle;
  end;

implementation

constructor TMEngine.Create;
begin
  inherited;
  FBW:=0;
  FBH:=0;
  FBHandle:=0;
end;

destructor TMEngine.Destroy;
begin
  {--------- NB ----------}
  wglMakeCurrent(0,0);
  DeactivateRenderingContext;
  wglDeleteContext(FRC);
  ReleaseDC(FBHandle,FDC);
  DeleteDC(FDC);
  {-----------------------}
  inherited;
end;

procedure TMEngine.Initiate(Perspective: Boolean);
begin
  if (FBW=0) or (FBH=0) then
    begin
      raise Exception.Create('Не задана ширина или высота рабочей области!');
      Exit;
    end
  else
    if FBHandle = 0 then
      begin
        raise Exception.Create('Не задан хэндл рабочей области!');
      Exit;
    end
      else
        if (FOrtZoom=0) and (not Perspective) then
          begin
            raise Exception.Create('Не задан угол ортогональной проекции!');
            Exit;
          end
        else
        begin
          InitOpenGL;
          FDC:=GetDC(FBHandle);
          SetDCPixelFormat;
          FRC:=wglCreateContext(FDC);
          ActivateRenderingContext(FDC, FRC);
          wglMakeCurrent(FDC,FRC);
          glClearColor(1.0,1.0,1.0,1.0);
          glMatrixMode(GL_PROJECTION);
          glLoadIdentity;
          if Perspective then
            gluPerspective(40.0,FBW/FBH,1,12)
          else
            glOrtho(-FOrtZoom/(FBH/FBW), FOrtZoom/(FBH/FBW),
              -FOrtZoom, FOrtZoom, -4500, 4500);
          glMatrixMode(GL_MODELVIEW);
          glLoadIdentity;
        end;
end;

procedure TMEngine.SetDCPixelFormat;
var
  pfd:TPixelFormatDescriptor;
  nPixelFormat:Integer;
begin
  FillChar(pfd,SizeOf(pfd),0);
  with pfd do
    begin
      nSize := sizeof(pfd);
      nVersion := 1;
      dwFlags := PFD_DRAW_TO_WINDOW or
      PFD_SUPPORT_OPENGL or
      PFD_DOUBLEBUFFER;
      iPixelType:= PFD_TYPE_RGBA;
      cColorBits:= 24;
      cDepthBits:= 64;
      iLayerType:= PFD_MAIN_PLANE;
    end;
  nPixelFormat:=ChoosePixelFormat(FDC,@pfd);
  SetPixelFormat(FDC,nPixelFormat,@pfd);
end;

end.

Добавляю его в uses и работает прекрасно. Примерно так:
Код:
. . .
var
  Form1: TForm1;
  ogl: TMEngine;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  ogl:=TMEngine.Create;
  ogl.BW:=Form1.ClientWidth;
  ogl.BH:=Form1.ClientHeight;
  ogl.BHandle:=Form1.Handle;
  ogl.Initiate(true);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  ogl.Destroy;
end;
. . .
А в обработчике OnPaint рисуем с помощью OpenGL...

Когда попытался использовать класс в библиотеке после выполнения FDC:=GetDC(FBHandle); раздаётся матерок что HDC не может быть равно нулю... Что дальше делать?

Последний раз редактировалось AXS, 16.04.2008 в 21:05.
Ответить с цитированием
  #17  
Старый 17.04.2008, 10:35
Аватар для The Shadow
The Shadow The Shadow вне форума
Продвинутый
 
Регистрация: 11.06.2007
Адрес: Уфа, Россия
Сообщения: 793
Репутация: 35
По умолчанию

Попробуй перенести ogl.Initiate(true); из OnCreate в OnShow или OnActivate
__________________
Что делать, когда сломался комп:
1. Если вы юзер - делать ноги.
2. Если ремонтник - делать деньги.
3. Если вы программист - делать вид, что так было задумано.
Ответить с цитированием
  #18  
Старый 17.04.2008, 20:18
Аватар для AXS
AXS AXS вне форума
Новичок
 
Регистрация: 26.11.2006
Адрес: РК г. Талдыкорган
Сообщения: 67
Репутация: 15
По умолчанию

Но ведь когда выполняется не в либе, а в самой проге всё ок...
Ответить с цитированием
  #19  
Старый 18.04.2008, 12:10
Аватар для The Shadow
The Shadow The Shadow вне форума
Продвинутый
 
Регистрация: 11.06.2007
Адрес: Уфа, Россия
Сообщения: 793
Репутация: 35
По умолчанию

У меня тоже некоторые процедуры отказывались работать в Dll хотя в проге работали. Сам не знаю с чем связано.
__________________
Что делать, когда сломался комп:
1. Если вы юзер - делать ноги.
2. Если ремонтник - делать деньги.
3. Если вы программист - делать вид, что так было задумано.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:45.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter