求助:如何把用OpenGl画的图放置到图形控件上去(100分)

  • 主题发起人 主题发起人 xu_orient
  • 开始时间 开始时间
X

xu_orient

Unregistered / Unconfirmed
GUEST, unregistred user!
求助各路大侠:如何把用OpenGl画的图放置到图形控件上去
//调用OpenGL绘制了一个椭圆,试图将椭圆放置到画图控件的成员XYPlot上去。而画出的椭圆
//要么不显示出来,要么显示在Form窗口上,而不是显示在控件上。另外,当把椭圆的坐标移到
//控件的位置上时,控件会挡住椭圆。
unit TDMain;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,ExtCtrls, StdCtrls,
sgr_def, //控件TSP_xyPlot需要的单元文件
cgtypes,cgtexture,GL,Glut,GLU,cgWindow; //OpenGL绘图可能用到的函数库
type
TForm1 = class(TCGForm)
XYPlot: Tsp_XYPlot; //画图控件,放置在Form窗口上,具有DCanvas画布属性
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
end;

var
Form1: TForm1;
implementation

{$R *.DFM}

procedure setupPixelFormat(DC:HDC); // 设置象素格式
const
pfd:TPIXELFORMATDESCRIPTOR = (
nSize:sizeof(TPIXELFORMATDESCRIPTOR); // 结构大小
nVersion:1; // 版本号
dwFlags:PFD_SUPPORT_OPENGL or PFD_DRAW_TO_WINDOW or
PFD_DOUBLEBUFFER; // 支持双缓存
iPixelType:PFD_TYPE_RGBA; // 颜色类型
cColorBits:24; // 颜色深度
cRedBits:0; cRedShift:0; // 颜色位数)
cGreenBits:0; cGreenShift:0;
cBlueBits:0; cBlueShift:0;
cAlphaBits:0; cAlphaShift:0; // 没有Alpha缓存
cAccumBits: 0;
cAccumRedBits: 0; // 没有积累缓存
cAccumGreenBits: 0;
cAccumBlueBits: 0;
cAccumAlphaBits: 0;
cDepthBits:16; // 深度缓存
cStencilBits:0; // 没有模板缓存
cAuxBuffers:0; // 没有辅助缓存
iLayerType:PFD_MAIN_PLANE; // 主层
bReserved: 0;
dwLayerMask: 0;
dwVisibleMask: 0;
dwDamageMask: 0;
);
var pixelFormat:integer;
begin
pixelFormat := ChoosePixelFormat(DC, @pfd);
if (pixelFormat = 0) then
exit;
if (SetPixelFormat(DC, pixelFormat, @pfd) <> TRUE) then
exit;
end;

procedure GLInit;
begin
// 设置观察投影模式
glMatrixMode(GL_PROJECTION);
glFrustum(-0.1, 0.1, -0.1, 0.1, 0.3, 25.0);
// 观察的位置
glMatrixMode(GL_MODELVIEW);
glEnable(GL_DEPTH_TEST);
end;

procedure TForm1.FormCreate(Sender: TObject);
var DC:HDC;
RC:HGLRC;
const
spec: array [0..3] of GLfloat = (1.0, 1.0, 1.0, 1.0);
begin
//以下5行初始化OpenGL的绘图环境
DC:=XYPlot.DCanvas.handle; //将控件xyPlot的画布句柄交给OpenGL的DC,
//试图调用OpenGL绘图函数在控件上画图
SetupPixelFormat(DC); //设置象素格式
RC:=wglCreateContext(DC); // 创建RC
wglMakeCurrent(DC, RC); // 激活OpenGL 窗口
GLInit; // 初始化OpenGLbegin

InitGL; //OPenGL库中若保留该语句,则画出的椭圆不是显示在控件xyplot上而是在Form窗口上;
//若去掉该语句,则画的椭圆不会显示出来。

glClearColor(0.5, 0.5, 0.5, 1.0);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glMaterialfv(GL_FRONT, GL_SPECULAR, @spec);
glMaterialf(GL_FRONT, GL_SHININESS, 20);
end;

//调用OpenGL画一个椭圆
procedure TForm1.FormPaint(Sender: TObject);
var
q: PGLuQuadricObj;
begin
glClear(GL_COLOR_BUFFER_BIT OR GL_DEPTH_BUFFER_BIT);
glLoadIdentity;
q := gluNewQuadric;
gluSphere(q, 0.6, 32, 16);
gluDeleteQuadric(q);
glfinish;
PageFlip;
end;


end.



 
呵呵。 老兄。怎么可能呢?
 
initGL是需要的 但是不是显示在form上的原因,是因为你的OPENGL没有获得窗口句柄 ,你只要把想画控件的句柄传给OPENGL就可以画了。
 
soniczzz网友,你说的对,后来我把在库文件中把InitGL扩展成了一个新的带有参数的过程
而这个参数就是我的TSP_xyPlot控件对象的句柄xyPlot.handle,终于放上去了。
谢谢你的建议
 
接受答案了.
 
后退
顶部