2012-03-12 19:33:35|?次阅读|上传:wustguangh【已有?条评论】发表评论
关键词:C/C++, 图形/图像, MFC|来源:唯设编程网
// 初始化OpenGl环境
void COpenGLLib::init(void)
{
PIXELFORMATDESCRIPTOR pfd;
int n;
HGLRC hrc;
if(!initPixelformat())
return;
n=::GetPixelFormat(my_pDC->GetSafeHdc());
::DescribePixelFormat(my_pDC->GetSafeHdc(),n,sizeof(pfd),&pfd);
hrc=wglCreateContext(my_pDC->GetSafeHdc());
wglMakeCurrent(my_pDC->GetSafeHdc(),hrc);
//定义线的宽度
GLfloat fLineWidth[2];
glGetFloatv(GL_LINE_WIDTH_RANGE,fLineWidth);
//循环定义2个逐渐增大的线宽
for(int i=0;i<2;i++)
lWidth[i]=fLineWidth[0]*(i+2);
}
// 初始化定义像素格式
BOOL COpenGLLib::initPixelformat()
{
static PIXELFORMATDESCRIPTOR pfd=
{
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW|
PFD_SUPPORT_OPENGL|
PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
24,
0,0,0,0,0,0,
0,
0,
0,
0,0,0,0,
32,
0,
0,
PFD_MAIN_PLANE,
0,
0,0,0
};
int pixelformat;
if((pixelformat=ChoosePixelFormat(my_pDC->GetSafeHdc(),&pfd))==0)
{
MessageBox(NULL,_T("定义像素格式:ChoosePixelFormat failed!"),_T("错误"),0);
return FALSE;
}
if(SetPixelFormat(my_pDC->GetSafeHdc(),pixelformat,&pfd)==FALSE)
{
MessageBox(NULL,_T("SetPixelFormat failed"),_T("错误"),0);
return FALSE;
}
return TRUE;
}
本实例只对OpenGL的绘制环境进行了常规定义,首先调用initPixelformat函数对像素格式进行了定义,如果定义成功,则将定义的像素格式设置成当前使用的像素格式,否则弹出错误提示。在init函数中然后调用wglCreateContext(my_pDC->GetSafeHdc())创建一个渲染描述表,并调用wglMakeCurrent(my_pDC->GetSafeHdc(),hrc)将当前的渲染描述表设置成新创建的hrc变量,最后调用glGetFloatv(GL_LINE_WIDTH_RANGE,fLineWidth)函数获取设备支持的线宽,并用此值初始化线宽数组。至此,OpenGL绘图环境的初始化工作便完成了。
// 重置画布大小
void COpenGLLib::resetCanvasSize(int cx,int cy){
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
GLdouble size=4.5f;
//不会改变原来的比例
GLfloat xScale=(GLfloat)cx/cy>1.0f?(GLfloat)cx/cy:1.0f;
GLfloat yScale=(GLfloat)cy/cx>1.0f?(GLfloat)cy/cx:1.0f;
glFrustum(-size*xScale,size*xScale,-size*yScale,size*yScale,4.0,10.0); //定义空间范围
//glFrustum(-size,size,-size,size,5.0,8.0); //定义空间范围
glViewport(0,0,cx,cy);
//gluPerspective(45.0f,(GLfloat)cx/(GLfloat)cy,0.1f ,1000.0f);//投影变换和视口变换
//第一个参数是视口角度,一般设为45
//第二个参数是视口宽高比,一般设为屏幕横纵比1048/768.0f
//第三、四个参数决定视点远近裁剪面,即能看到的最近与最远距离。一般分别设置为:0.1f,1000.0f
}