Так... Простейший класс написал. Он инициализирует 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 не может быть равно нулю...

Что дальше делать?