【编程框架】
1、在视类中,添加PreCreateWindow事件响应函数:
主要任务=>设置窗口类型,代码如下
cs.style |=WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
2、在视类中,修改OnCreate事件响应函数:
主要任务=>创建OpenGL绘图环境,代码如下
//下面的结构说明绘图设备的像素格式,例如像素的表示方法、各种颜色表示位数等
PIXELFORMATDESCRIPTOR pfd ={
sizeof(PIXELFORMATDESCRIPTOR), //数据结构大小
1, //数据结构版本号
PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA, //缓冲区可以在窗口上绘图,支持 OpenGL绘图
24, //深度颜色缓冲区位数
0,0,0,0,0,0, //忽略颜色位
0,0,0, //没有非透明度缓存,忽略移位位,无累加缓存
0,0,0,0, //忽略累加位
32, //32位深度缓存
0, //无模板缓存
0, //无辅助缓存
PFD_MAIN_PLANE, //主层
0, //保留
0,0,0, //忽略层,可见性和损毁掩模
};
m_hDC=GetDC()->GetSafeHdc(); //得到当前正在使用的绘图设备句柄
//根据设备的特性,选择一个与pfd所指定的格式相匹配的像素格式,存于nPixelFormat中。
int nPixelFormat=::ChoosePixelFormat(m_hDC,&pfd);
//将当前绘图设备的像素格式设为nPixelFormat
::SetPixelFormat(m_hDC,nPixelFormat,&pfd);
//根据当前绘图设备,创建一个像素格式与之相匹配的OpenGL的绘图上下文
m_hRC=::wglCreateContext(m_hDC);
/*指定OpenGL的绘图上下文是m_hRC,并且建立它与当前绘图设备m_hDC间的连接,下列函数执
行后,所有绘图命令的结果都出现在设备m_hDC上*/
::wglMakeCurrent(m_hDC,m_hRC);
3、在视类中,修改OnSize事件响应函数:
主要任务=>重绘窗口时,同步修改视口大小 代码如下
glViewport(50,50,cy,cy); // 定义或修改视口
4、在视类中,修改OnDraw事件响应函数:
主要任务=>利用OpenGL命令,进行图形绘制 代码示例如下
glMatrixMode(GL_PROJECTION); //选择当前矩阵为投影矩阵
glLoadIdentity(); //初始化变换矩阵
if(this->c_mode==0)
glFrustum(-3,5,-3,5,5,20);//透视投影,不裁剪
if(this->c_mode==4)
//glFrustum(-3,5,-3,5,5,20);//透视投影,不裁剪
glFrustum(-3,5,-3,5,6,20);//被观察体近平面裁剪
if(this->c_mode==5)
glOrtho(-7,7,-7,7,2,12);//正交投影
glMatrixMode(GL_MODELVIEW); //选择当前矩阵为模型变换
glLoadIdentity(); //初始化变换矩阵
glShadeModel(GL_FLAT); // 设置明暗效果,GL-FLAT,一个面片的颜色一致, GL-SMOOTH,面片的颜色由插值产生
glClearColor(1.0f,1.0f,1.0f,1.0f); //置窗口底色为白色
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0f,0.0f,0.0f); //设置绘图颜色为黑色
gluLookAt(6,5.5,7,0,0,0,0,0,1); //设视点, (0,0,0)为参考点坐标,
//gluLookAt(-2,0,14,-2,0,0,0,1,0); //观察变换替代平移变换的视点
glColor3f(1,0,0);
draw_coord();
//下面这一函数可以得到当前的模型变换矩阵
//glGetDoublev(GL_MODELVIEW_MATRIX,array);
draw_cuboid(3,3,3); //绘制立方体函数
SwapBuffers(this->m_hDC);//交换缓冲区
glFlush();//执行缓冲区内的OpenGL命令
5、在视类中,修改OnDestroy() 事件响应函数:
主要任务=> 代码如下
::wglMakeCurrent(NULL,NULL);//接触RC和DC的关联
::wglDeleteContext(m_hRC);//删除RC