基于VC++ MFC环境的OpenGL编程入门---第一篇

本文详细介绍了如何在视图类中通过五个步骤实现OpenGL绘图环境的搭建过程,包括设置窗口类型、创建OpenGL绘图环境、修改视口大小、进行图形绘制及销毁绘图资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【编程框架】

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值