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 }