С PaintBox я пробовал ничего не вышло. Поэтому и спросил. Может код не правильный? Хотя с формой он работает, даже не смотря на то, что наскоро написан и собран из нескольких примеров ....
| Код | unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, OpenGL, ExtCtrls;
type TForm1 = class(TForm) PaintBox1: TPaintBox; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormPaint(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1; Var Window : HWnd; Message : TMsg; dc : HDC; hrc : HGLRC; MyPaint : TPaintStruct; quardObj : GLUquadricObj;
implementation
{$R *.dfm} procedure SetDCPixelFormat (hdc : HDC); var pfd : TPixelFormatDescriptor; // данные формата пикселей nPixelFormat : Integer;
Begin
With pfd do begin nSize := sizeof (TPixelFormatDescriptor); // размер структуры nVersion := 1; // номер версии dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL; // множество битовых флагов, определяющих устройство и интерфейс iPixelType := PFD_TYPE_RGBA; // режим для изображения цветов cColorBits := 16; // число битовых плоскостей в каждом буфере цвета cRedBits := 0; // число битовых плоскостей красного в каждом буфере RGBA cRedShift := 0; // смещение от начала числа битовых плоскостей красного в каждом буфере RGBA cGreenBits := 0; // число битовых плоскостей зелёного в каждом буфере RGBA cGreenShift := 0; // смещение от начала числа битовых плоскостей зелёного в каждом буфере RGBA cBlueBits := 0; // число битовых плоскостей синего в каждом буфере RGBA cBlueShift := 0; // смещение от начала числа битовых плоскостей синего в каждом буфере RGBA cAlphaBits := 0; // число битовых плоскостей альфа в каждом буфере RGBA cAlphaShift := 0; // смещение от начала числа битовых плоскостей альфа в каждом буфере RGBA cAccumBits := 0; // общее число битовых плоскостей в буфере аккумулятора cAccumRedBits := 0; // число битовых плоскостей красного в буфере аккумулятора cAccumGreenBits := 0; // число битовых плоскостей зелёного в буфере аккумулятора cAccumBlueBits := 0; // число битовых плоскостей синего в буфере аккумулятора cAccumAlphaBits := 0; // число битовых плоскостей альфа в буфере аккумулятора cDepthBits := 32; // размер буфера глубины (ось z) cStencilBits := 0; // размер буфера трафарета cAuxBuffers := 0; // число вспомогательных буферов iLayerType := PFD_MAIN_PLANE;// тип плоскости bReserved := 0; // число плоскостей переднего и заднего плана dwLayerMask := 0; // игнорируется dwVisibleMask := 0; // индекс или цвет прозрачности нижней плоскости dwDamageMask := 0; // игнорируется end;
nPixelFormat := ChoosePixelFormat (hdc, @pfd); // запрос системе - поддерживается ли выбранный формат пикселей SetPixelFormat (hdc, nPixelFormat, @pfd); // устанавливаем формат пикселей в контексте устройства End;
procedure TForm1.FormCreate(Sender: TObject); begin DC := GetDC(Form1.PaintBox1.Canvas.Handle); SetDCPixelFormat(Form1.PaintBox1.Canvas.Handle); hrc := wglCreateContext (Form1.PaintBox1.Canvas.Handle); quardObj := gluNewQuadric(); end;
procedure TForm1.FormDestroy(Sender: TObject); begin wglDeleteContext(hrc); end; procedure TForm1.FormPaint(Sender: TObject); begin wglMakeCurrent(Form1.PaintBox1.Canvas.Handle, hrc); glMatrixMode(GL_PROJECTION); glLoadIdentity; glClearColor (1.0, 1.0, 1.0, 1.0); glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); glPointSize(10); glPushMatrix; glEnable(GL_DEPTH_TEST); glRotate(20,1,0,0); glRotate(15,0,1,0); glBegin(GL_LINES); glColor3f(0.0,0.0,0.0); glVertex3f(-1.0,0.0,0.0); glVertex3f(1.0,0.0,0.0);
glColor3f(1.0,0.0,0.0); glVertex3f(0.0,1.0,0.0); glVertex3f(0.0,-1.0,0.0);
glColor3f(0.0,1.0,0.0); glVertex3f(0.0,0.0,1.0); glVertex3f(0.0,0.0,-1.0); glEnd; glColor3f(0.0,0.0,1.0); gluQuadricDrawStyle(quardObj,GLU_LINE); gluSphere(quardObj,1,50,50); glDisable(GL_DEPTH_TEST); glPopMatrix; glFlush; SwapBuffers(DC); wglMakeCurrent(0, 0); end;
end.
|
|