(在线等待)OpenGL之设备描述表建立问题 (75分)

  • 主题发起人 主题发起人 wantsinewy
  • 开始时间 开始时间
W

wantsinewy

Unregistered / Unconfirmed
GUEST, unregistred user!
我一般都是这样建设备描述表的 DC:=GetDC(panel1.Handle);
现在要用PageControl分页显示三维图形,可能不止一个Panel,应怎样建立设备描述表?
还有,是否一个显示程序只能有一个设备描述表(device context),而怎样建立多个rendering context?
请各位不吝赐教。
 
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;

是不是这个?
 
接受答案了.
 
后退
顶部