|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#16
|
||||
|
||||
Так... Простейший класс написал. Он инициализирует 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; . . . Когда попытался использовать класс в библиотеке после выполнения FDC:=GetDC(FBHandle); раздаётся матерок что HDC не может быть равно нулю... Что дальше делать? Последний раз редактировалось AXS, 16.04.2008 в 21:05. |
#17
|
||||
|
||||
Попробуй перенести ogl.Initiate(true); из OnCreate в OnShow или OnActivate
Что делать, когда сломался комп: 1. Если вы юзер - делать ноги. 2. Если ремонтник - делать деньги. 3. Если вы программист - делать вид, что так было задумано. |
#18
|
||||
|
||||
Но ведь когда выполняется не в либе, а в самой проге всё ок...
|
#19
|
||||
|
||||
У меня тоже некоторые процедуры отказывались работать в Dll хотя в проге работали. Сам не знаю с чем связано.
Что делать, когда сломался комп: 1. Если вы юзер - делать ноги. 2. Если ремонтник - делать деньги. 3. Если вы программист - делать вид, что так было задумано. |