var
PForm: TPForm;
CgDC1, CgDC2: TCGDeviceContext;
a: Integer = 0;
implementation
{$R *.DFM}
procedure TPForm.FormCreate(Sender: TObject);
var
pDC: HDC;
begin
// It's simple, really:
pDC := GetDC(GLPanel1.Handle);
CgDC1 := TCGDeviceContext.Create(pDC);
CgDC1.InitGL;
glEnable(GL_DEPTH_TEST);
// Note that each DC you create has its own OpenGL state variables!
pDC := GetDC(GLPanel2.Handle);
CgDC2 := TCGDeviceContext.Create(pDC);
CgDC2.InitGL;
glEnable(GL_DEPTH_TEST);
end;
procedure TPForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
CgDC1.Free;
CgDC2.Free;
end;
procedure TPForm.FormPaint(Sender: TObject);
begin
// Just draw something...
CgDC1.MakeCurrent;
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glLoadIdentity;
glRotatef(a, 1, 2, 3);
glutWireTorus(0.2, 0.4, 16, 32);
CgDC1.PageFlip;
// And to the second panel as well...
CgDC2.MakeCurrent;
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glLoadIdentity;
glRotatef(-a, 1, 2, 3);
glBegin(GL_TRIANGLES);
glColor3f(1, 0, 0); glVertex2f(-0.5, -0.5);
glColor3f(0, 1, 0); glVertex2f(0.5, -0.5);
glColor3f(0, 0, 1); glVertex2f(0, 0.5);
glEnd;
CgDC2.PageFlip;
end;
procedure TPForm.TimerTimer(Sender: TObject);
begin
a := (a+1) mod 360;
Paint;
end;
procedure TPForm.SplitterMoved(Sender: TObject);
begin
// Resize the viewports. Also called when the form resizes.
{ The splitter is set to rsUpdate, so it repaints whenever you drag it. This
causes a lot of flicker, so set it to rsPattern if you get a migraine. }
CgDC1.MakeCurrent;
glViewport(0, 0, GLPanel1.Width, GLPanel1.Height);
CgDC2.MakeCurrent;
glViewport(0, 0, GLPanel2.Width, GLPanel2.Height);
end;
procedure TPForm.SplitterCanResize(Sender: TObject; var NewSize: Integer;
var Accept: Boolean);
begin
// Keep the splitter from snapping to the left edge of the form.
Accept := not (NewSize <= 31);
end;
是不是这个?