MFC中可以bat 中设置环境变量两个OpenGL环境吗

MFC下的OpenGL编程[基础篇]
MFC下的OpenGL编程
MFC是微软件提供的一个C++编程框架,它提供了大量的类库,以更强的封装来简化C++的编程。当然,它与普通的Win32编程有些差别。
在MFC下进行OpenGL编程的步骤如下:
1. 在工程中包含OGL函数库
法1. “工程”—“设置”—“连接”—“对象/库模块”中输入glaux.lib, opengl32.lib,
glu32.lib。
法2. 在StdAfx.h中加入:
#pragma comment(lib,"glaux.lib")
#pragma comment(lib,"opengl32.lib")
#pragma comment(lib,"glu32.lib")
2. 在stdafx.h加入OGL头文件。这样做的好处是不需要在其它的头文件重复包含OGL的这些头文件。
&gl/glu.h&
&gl/glaux.h&
#include &gl/glut.h&
3. 初始化OGL场景
BOOL CGLTestView::InitializeOpenGL(CDC *pDc)
& m_pDc=pDc;&
SetupPixelFormat();&&&&&&&&&&&&&&&&&&&&&&&&&&
// 设置像素点格式
m_hRc=::wglCreateContext(pDc-&GetSafeHdc());&&
// 生成绘制描述表
::wglMakeCurrent(m_pDc-&GetSafeHdc(),m_hRc);&
// 置当前绘制描述表
&& return TRUE;
4. 设置像素点格式
BOOL CGLTestView::SetupPixelFormat()
PIXELFORMATDESCRIPTOR pdf={
sizeof(PIXELFORMATDESCRIPTOR),&&&
// pfd结构的大小
&&&&&&&&&&&&&&
1,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&
PFD_DRAW_TO_WINDOW
|&&&&&&&&&&&&&
// 支持在窗口中绘图
&&&&&&&&&&&&&&
PFD_SUPPORT_OPENGL
|&&&&&&&&&&&&&
// 支持 OpenGL
&&&&&&&&&&&&&&
PFD_DOUBLEBUFFER,&&&&&&&
&&&&&&&&&//
双缓存模式
&&&&&&&&&&&&&&
PFD_TYPE_RGBA,&&&&&&&&&&&&&&&&&&&
// RGBA 颜色模式
&&&&&&&&&&&&&&
24,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 24 位颜色深度
&&&&&&&&&&&&&&
0, 0, 0, 0, 0,
0,&&&&&&&&&&&&&&&&
// 忽略颜色位
&&&&&&&&&&&&&&
0,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 没有非透明度缓存
&&&&&&&&&&&&&&
0,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 忽略移位位
&&&&&&&&&&&&&&
0,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 无累加缓存
&&&&&&&&&&&&&&
0,&&&&&&&&&&&&&&&&&&&&&&
// 忽略累加位
&&&&&&&&&&&&&&
32,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
位深度缓存&&&&
&&&&&&&&&&&&&&
0,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 无模板缓存
&&&&&&&&&&&&&&
0,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 无辅助缓存
&&&&&&&&&&&&&&
PFD_MAIN_PLANE,&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&
0,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&
0&&&&&&&&&&&&&&&&&&&&&&&&&&
// 忽略层,可见性和损毁掩模
pixedformat=::ChoosePixelFormat(m_pDc-&GetSafeHdc(),&pdf);
::SetPixelFormat(m_pDc-&GetSafeHdc(),pixedformat,&pdf);&&&
// 设置像素格式
if(pdf.dwFlags & PFD_NEED_PALETTE)
SetLogicalPalette();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 设置逻辑调色板
return TRUE;
3. 在View类中,声明变量和函数
class CGLTestView : public CView
protected: // create from serialization only
CGLTestView();
DECLARE_DYNCREATE(CGLTestView)
// Attributes
CGLTestDoc* GetDocument();
// Operations
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CGLTestView)
virtual void OnDraw(CDC* pDC);& // overridden to
draw this view
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
//}}AFX_VIRTUAL
// Implementation
virtual ~CGLTestView();
#ifdef _DEBUG
virtual void AssertValid()
virtual void Dump(CDumpContext& dc)
CDC *m_pDc;
HGLRC m_hRc;
HPALETTE m_hP
GLfloat& fA
GLuint SelectBuff[512];
//int z_motion,
BOOL InitializeOpenGL(CDC *pDc);
BOOL SetupPixelFormat(void);
SetLogicalPalette(void);
BOOL RenderScene(void);
void Init(GLvoid);
void ProcessSelection(int xPos, int yPos);
CString ProcessPlanet(GLuint *pSelectBuff);
//两个全局变量,z_motion用来控制物体远近
//rotate用来控制物体旋转
protected:
// Generated message map functions
protected:
//{{AFX_MSG(CGLTestView)
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnDestroy();
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnTimer(UINT nIDEvent);
&&& afx_msg
void OnLButtonDown(UINT nFlags, CPoint
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
5. Init()函数
void CGLTestView::Init(GLvoid)
GLfloat &whiteLight[] = { 0.35f, 0.35f, 0.35f,
GLfloat &sourceLight[] = { 0.65f, 0.65f, 0.65f,
GLfloat&&&
lightPos[] = { 0.0f, 0.0f, 0.0f, 1.0f };
glEnable(GL_DEPTH_TEST);&&&&&
glFrontFace(GL_CCW);&&&&&&&
glEnable(GL_CULL_FACE);&
glEnable(GL_LIGHTING);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,whiteLight);
glLightfv(GL_LIGHT0,GL_DIFFUSE,sourceLight);
glLightfv(GL_LIGHT0,GL_POSITION,lightPos);
glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
glClearColor(0.60f, 0.60f, 0.60f, 1.0f );
6. 在View类的OnDraw中绘制
// CGLTestView drawing
void CGLTestView::OnDraw(CDC* pDC)
CGLTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
RenderScene();
7. 场影绘制
BOOL CGLTestView::RenderScene(void)
glRenderMode(GL_SELECT);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清一下当前屏幕
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
&&&&&&&&&&&&&
//根据z_motion rotate两个参数确定变换的具体数值:
//z_motion改变时,物体从原Z坐标-25,平移z_motion个单位
glTranslatef(0.0,0.0,-30.0+z_motion);
//rotate改变时,物体延Y轴(上下方向)旋转5*rotate度
glRotatef(rotate*5.0,0.0,0.0,1.0);
glTranslatef(0.0+x_motion,0.0,0.0);
glTranslatef(0.0,0.0+y_motion,0.0);
glMatrixMode(GL_SELECT);
//& glMatrixMode(GL_PROJECTION);
glInitNames();
glPushName(0);
glPushMatrix();
glRGB(120,120,250);
glTranslatef(-6.0f,-5.0f,-20.0f);
glLoadName(1);
auxSolidSphere(3.0f);
glTranslatef(15.0f,-5.0f,-20.0f);
glLoadName(2);
auxWireTeapot(4.0f);
glPopName();
glPopMatrix();
// && glTranslatef(0,0,-20);
// && int&
x=(int)(40*2);
// && glBegin(GL_LINE_LOOP);
&&&for(int i=-x;
i&x; i+=4)
&glVertex3i(-x,i,0);
&glVertex3i(x,i,0);
&glVertex3i(i,x,0);
&glVertex3i(i,-x,0);
// glBegin(GL_POLYGON);
//&& glVertex2f(0.0,0.0);
//&& glVertex2f(0.0,3.0);
//&& glVertex2f(3.0,0.0);
//&& glVertex2f(3.0,3.0);
//&& glEnd();
// && glPushMatrix();
glTranslatef(0.f,-5.0f,-40.0f);
glBegin(GL_TRIANGLE_STRIP);//画连续填充的多个三角
&&&&&&&&&&&&
glColor3f(1.0,0.0,0.0);
&&&&&&&&&&&&
glVertex3f(15.0,0.0,0.0);
&&&&&&&&&&&&
glColor3f(0.0,1.0,0.0);
&&&&&&&&&&&&
glVertex3f(-15.0,0.0,0.0);
&&&&&&&&&&&&
glColor3f(0.0,0.0,1.0);
&&&&&&&&&&&&
glVertex3f(0.0,15.0,15.0);
//第一个三角
&&&&&&&&&&&&
glColor3f(0.0,1.0,1.0);
glVertex3f(10.0,15.0,-15.0);
//第二个三角
&&&&&&&&&&&&
glColor3f(1.0,1.0,0.0);
&&&&&&&&&&&&
glVertex3f(15.0,0.0,0.0);
& //第三个三角
// && glPopMatrix();
glPopMatrix();&&&&&&
glFlush();
::SwapBuffers(m_pDc-&GetSafeHdc());&&&&&&&&&&&&
//交互缓冲区
return TRUE;
8. 设置逻辑调色板
void CGLTestView::SetLogicalPalette()
WORD NumberOfE
PALETTEENTRY aEntries[256];
logicalPalette = { 0x300, 256 };
BYTE reds[] = {0, 36, 72, 109, 145, 182, 218, 255};
BYTE greens[] = {0, 36, 72, 109, 145, 182, 218, 255};
BYTE blues[] = {0, 85, 170, 255};
&&& for (int
colorNum=0; colorNum&256; ++colorNum)
logicalPalette.aEntries[colorNum].peRed = reds[colorNum
&logicalPalette.aEntries[colorNum].peGreen
=greens[(colorNum && 0x03)
logicalPalette.aEntries[colorNum].peBlue = blues[(colorNum
&& 0x06) & 0x03];
logicalPalette.aEntries[colorNum].peFlags = 0;
m_hPalette = CreatePalette
((LOGPALETTE*)&logicalPalette);
9. 建立窗口时
int CGLTestView::OnCreate(LPCREATESTRUCT lpCreateStruct)
if (CView::OnCreate(lpCreateStruct) == -1)
&&&&&&&&&&&&&
return -1;
// TODO: Add your specialized creation code here
// 初始化OGL和设置定时器
&z_motion=0;
x_motion=0;
y_motion=0;
m_pDc = new CClientDC(this);
SetTimer(1,20,NULL);&&&&&&&&&&&&&&&&&&&&
// 事件ID为1,& 20毫秒间距
InitializeOpenGL(m_pDc);&&&&&&&&&&&&&&&&
// 初始化场境
Init();&&&&&
10. 适应窗口
// CGLTestView message handlers
// 在OnSize中定义当前视区,投影模型和物体模型,光源
void CGLTestView::OnSize(UINT nType, int cx, int cy)
CView::OnSize(nType, cx, cy);
//添加窗口缩放时的图形变换函数
glViewport(0,0,cx,cy);&&&&&&&&&&&&
按目标窗口设置,视口设置
(GLfloat)cx/(GLfloat)&&&&&&&&&
// 窗口尺寸比率,为GLfloat型
glMatrixMode(GL_PROJECTION);
&&&&&&&&//
设置投影模式
glLoadIdentity();&&&&&&&&&&&&&&&
&&&&&&&&//
重置当前指定的矩阵为单位矩阵
gluPerspective(45.0f, fAspect, 1.0, 425.0);
&&&// 透视图,
视角,比例,zNear, zFar
glMatrixMode(GL_MODELVIEW);&&&&&&&
&// 模型视图模式
glLoadIdentity();&&&
11. 关闭窗口时
void CGLTestView::OnDestroy()
CView::OnDestroy();
//删除调色板和渲染上下文、定时器
::wglMakeCurrent(0,0);
::wglDeleteContext(m_hRc);&
&// 删除 绘制描述表
if (m_hPalette)
&&&&&&&&&&&&&
DeleteObject(m_hPalette);& // 删除对象“调色板”
if (m_pDc)
&&&&&&&&&&&&&
delete m_pDc;&
&&// 删除DC
KillTimer(1);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&& & 郑州大学 任国彪
2011.8整理
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)1196人阅读
OpenGL(1)
这里以MFC单文档程序为例。框架的代码是基于NEHE的OPenGL教程的,应该放在负责视图的View.cpp中,笔者的项目名叫迷宫,故类名为C迷宫View,下面是主要步骤:
一. 在MFC中的View.cpp中添加函数BOOL
SetupPixelFormat(void)来设置像素格式:
BOOL C迷宫View::SetupPixelFormat(void)
static PIXELFORMATDESCRIPTOR pfd =
sizeof(PIXELFORMATDESCRIPTOR),
// pfd结构的大小
PFD_DRAW_TO_WINDOW |
// 支持在窗口中绘图
PFD_SUPPORT_OPENGL |
// 支持 OpenGL
PFD_DOUBLEBUFFER,
// 双缓存模式
PFD_TYPE_RGBA,
// RGBA 颜色模式
// 24 位颜色深度
0, 0, 0, 0, 0, 0,
// 忽略颜色位
// 没有非透明度缓存
// 忽略移位位
// 无累计缓存
0, 0, 0, 0,
// 忽略累计位
// 32 位深度缓存
// 无模板缓存
// 无辅助缓存
PFD_MAIN_PLANE,
// 忽略层,可见性和损毁掩模
int pixelF
// 为设备描述表得到最匹配的像素格式
if((pixelFormat = ChoosePixelFormat(m_pDC-&GetSafeHdc(), &pfd)) == 0)
MessageBox( _T("ChoosePixelFormat failed") );
return FALSE;
// 设置最匹配的像素格式为当前的像素格式
if(SetPixelFormat(m_pDC-&GetSafeHdc(), pixelFormat, &pfd) == FALSE)
MessageBox( _T("SetPixelFormat failed") );
return FALSE;
return TRUE;
二.添加函数BOOL InitializeOpenGL(void)函数初始化OpenGL环境,InitializeOpenGL()中调用了SetupPixelFormat():
BOOL C迷宫View::InitializeOpenGL(void)
PIXELFORMATDESCRIPTOR
m_pDC=new CClientDC(this);
ASSERT(m_pDC != NULL);
// 设置当前的绘图像素格式
if(!SetupPixelFormat())
return FALSE;
n=::GetPixelFormat(m_pDC-&GetSafeHdc());
::DescribePixelFormat(m_pDC-&GetSafeHdc(), n,sizeof(pfd),&pfd);
// 创建绘图描述表
m_hRC=wglCreateContext(m_pDC-&GetSafeHdc());
if(m_hRC == NULL)
MessageBox( _T("创建RC失败") );
return FALSE;
// 使绘图描述表为当前调用现程的当前绘图描述表
if( wglMakeCurrent(m_pDC-&GetSafeHdc(),m_hRC) == FALSE)
MessageBox( _T("使绘图描述表为当前调用现程的当前绘图描述表失败") );
return FALSE;
if (!LoadGLTextures())
// 调用纹理载入子例程
return FALSE;
// 如果未能载入,返回FALSE
glEnable(GL_TEXTURE_2D);// 启用纹理映射
glShadeModel(GL_SMOOTH);// 启用阴影平滑
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);// 黑色背景
glClearDepth(1.0f);// 设置深度缓存
glEnable(GL_DEPTH_TEST);// 启用深度测试
glDepthFunc(GL_LEQUAL);// 所作深度测试的类型
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);// 告诉系统对透视进行修正
return TRUE;
三.重载MFC中的WM_CRATE消息响应函数int OnCreate(LPCREATESTRUCT lpCreateStruct):
int C迷宫View::OnCreate(LPCREATESTRUCT lpCreateStruct)
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
在此添加您专用的创建代码
InitializeOpenGL(); //初始化OpenGL环境
}四.重载MFC中的WM_SIZE消息响应函数void OnSize(UINTnType,int
cy),设置显示尺寸:void C迷宫View::OnSize(UINT nType, int cx, int cy)
CView::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
//m_width为在C迷宫View类中添加的表示视口宽度的成员变量
m_height =
//m_height为在C迷宫View类中添加的表示视口高度的成员变量
if (m_height==0)
// 防止被零除
m_height=1;
// 将Height设为1
glViewport(0, 0, m_width, m_height);
// 重置当前的视口
glMatrixMode(GL_PROJECTION);
// 选择投影矩阵
glLoadIdentity();
// 重置投影矩阵
// 设置视口的大小
gluPerspective(45.0f,(GLfloat)m_width/(GLfloat)m_height,0.1f,200.0f);
glMatrixMode(GL_MODELVIEW);
// 选择模型观察矩阵
glLoadIdentity();
// 重置模型观察矩阵
五.添加void RenderScene(void)作为绘图主函数,绘制场景的代码都写在这里,之后重载MFC中的WM_TIMER消息响应函数void OnTimer(UINT_PTRnIDEvent)实时刷新画面:
void C迷宫View::OnTimer(UINT_PTR nIDEvent)
// TODO: 在此添加消息处理程序代码和/或调用默认值
RenderScene();
//重新绘制
CView::OnTimer(nIDEvent);
在需要开始OpenGL显示时开启定时器即可:SetTimer(1,1,NULL);
六.人机交互代码需要重载MFC的WM_KEYDOWN消息响应函数void OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)函数,在里边分按键处理,例如:
void C迷宫View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
// TODO: 在此添加消息处理程序代码和/或调用默认值
switch(nChar)
//对按下的符号进行判断
//上方向键处理
case VK_UP:{
//下方向键处理
case VK_DOWN:{
//左方向键处理
case VK_LEFT:{
//右方向键处理
case VK_RIGHT:{
//PageUp键处理
case VK_PRIOR:{
//PageDown键处理
case VK_NEXT:{
}七.重载MFC的voidC迷宫View::OnDestroy()作为窗口销毁后的后续处理:
oid C迷宫View::OnDestroy()
CView::OnDestroy();
// TODO: 在此处添加消息处理程序代码
if (m_hRC)
// 我们拥有OpenGL渲染描述表吗?
if (!wglMakeCurrent(NULL,NULL))
// 我们能否释放DC和RC描述表?
MessageBox(NULL,_T("释放DC或RC失败。"));
if (!wglDeleteContext(m_hRC))
// 我们能否删除RC?
MessageBox(NULL,_T("释放RC失败。"));
m_hRC=NULL;
// 将RC设为 NULL
if (m_pDC && !ReleaseDC(m_pDC))
// 我们能否释放 DC?
MessageBox(NULL,_T("释放DC失败。"));
m_pDC=NULL;
// 将 DC 设为 NULL
KillTimer(1);
//关闭定时器
}注:在VS2012中,添加MFC消息响应函数十分方便,只需点击项目-》类向导,点击对话框中间的消息,选择添加到View类并选择消息添加处理程序即可,如图:MFC单文档程序中搭建OpenGL框架
我的图书馆
MFC单文档程序中搭建OpenGL框架
本博客计算机图形学系列文章索引:
Windows GDI是通过设备句柄(Device Context(设备描述表)以下简称"DC")来绘图,而OpenGL则需要绘制环境(Rendering Context(着色描述表),以下简称"RC")。每一个GDI命令需要传给它一个DC,但与GDI不同,OpenGL使用当前绘制环境(RC)。但是RC并不能直接完成绘图,只能与特定的DC联系起来,从而完成具体的绘图工作。一旦在一个线程中指定了一个当前RC,在此线程中其后所有的OpenGL命令都使用相同的当前RC。虽然在单一窗口中可以使用多个RC,但在单一线程中只有一个当前RC。下面我将首先产生一个OpenGL RC并使之成为当前RC。这将分为三个步骤:
1、设置窗口像素格式;
2、产生RC;
3、设置为当前RC。
用一个图表示如下所示,图中介绍了需要在各个函数中设置的信息:
二、搭建MFC中的OpenGL基本框架
本文以一个单文档程序为例。新建一个单文档名字为VCOpenGL2 其他的默认。
1、添加链接库。
打开菜单栏下的项目-&属性-&配置属性-&链接器-&输入-&附加依赖项里加入OpenGL32.lib GLu32.lib GLaux.lib,如图
如果不用这种方法添加链接库的话,可以写上下列代码,也能达到同样的效果:
#pragma&comment(&lib,&"opengl32.lib"&)&&& &&
#pragma&comment(&lib,&"glu32.lib"&)&&&&& &&
#pragma&comment(&lib,&"glut32.lib"&) &&
#pragma&comment(&lib,&"glaux.lib"&)&&
2、 包含头文件。
在stdafx里面添加opengl的头文件(当然也可以在其他文件中添加,比如绘图一般都是在视图中的,可以在xxxView.cpp文件中包含头文件)。如下代码所示:#include &GL\glaux.h&
#include &GL\glut.h&
有几点说明:
2.1、包含glut.h的同时就把gl.h和glu.h都包括了。因为打开glut.h你可以看到如下图所示的,已经包含了gl.h和glu.h。
2.2、关于这OpenGL中的这几个库的介绍,看一看我的另一篇文章,地址如下:
3、设置窗口显示风格。
窗口创建之前我们必须设置窗口风格包含
WS_CLIPCHILDREN(创建父窗口使用的Windows风格,用于重绘时裁剪子窗口所覆盖的区域)和WS_CLIPSIBLINGS(创建子窗口使用的Windows风格,用于重绘时剪裁其他子窗口所覆盖的区域),
从而避免OpenGL绘制到其他窗口中去。这些应该放在PreCreateWindow()中。代码如下:
4、设置窗口像素格式
首先向VCOpenGL2View类中添加几个保护的成员变量和公共的成员函数。如下:
HGLRC&m_hRC;&&&&//Rendering&Context着色描述表 &&
CClientDC*&m_pDC;&&&&&&&&//Device&Context设备描述表 &&
BOOL&InitializeOpenGL();&&&&//初始化&OpenGL &&
BOOL&SetupPixelFormat();&&&&//设置像素格式 &&
void&RenderScene();&&&&&&&&&//绘制场景&&
&别忘了在VCOpenGL2View的构造函数中设置 m_hRC = NULL; m_pDC = NULL;
产生一个RC的第一步是定义窗口的像素格式。像素格式决定窗口着所显示的图形在内存中是如何表示的。由像素格式控制的参数包括:颜色深度、缓冲模式和所支持的绘画接口。在下面将在SetupPixelFormat()函数中对这些参数的设置。代码如下:
BOOL&CVCOpenGL2View::SetupPixelFormat(void)&&
&static&PIXELFORMATDESCRIPTOR&pfd&=&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&sizeof(PIXELFORMATDESCRIPTOR),&&//&pfd结构的大小& &&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&1,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&版本号& &&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&PFD_DRAW_TO_WINDOW&|&&&&&&&&&&&&//&支持在窗口中绘图& &&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&PFD_SUPPORT_OPENGL&|&&&&&&&&&&&&//&支持&OpenGL& &&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&PFD_DOUBLEBUFFER,&&&&&&&&&&&&&&&//&双缓存模式& &&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&PFD_TYPE_RGBA,&&&&&&&&&&&&&&&&&&//&RGBA&颜色模式& &&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&24,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&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&&&&&&&&&&&&&&&&&&&&&&&&&//&忽略层,可见性和损毁掩模& &&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&};&&
&&&&int&pixelF&&
&&&&//&为设备描述表得到最匹配的像素格式& &&
&&&&if((pixelFormat&=&ChoosePixelFormat(m_pDC-&GetSafeHdc(),&&pfd))&==&0)&&
&&&&&&&&MessageBox(&_T("ChoosePixelFormat&failed")&);&&
&&&&&&&&return&FALSE;&&
&&&&//&设置最匹配的像素格式为当前的像素格式& &&
&&&&if(SetPixelFormat(m_pDC-&GetSafeHdc(),&pixelFormat,&&pfd)&==&FALSE)&&
&&&&&&&&MessageBox(&_T("SetPixelFormat&failed")&);&&
&&&&&&&&return&FALSE;&&
&&&&return&TRUE;&&
5、产生RC,设置为当前RC。  
现在像素格式已经设定,我们下一步工作是产生绘制环境(RC)并使之成为当前绘制环境,即编写InitializeOpenGL()函数。代码如下:
BOOL&CVCOpenGL2View::InitializeOpenGL(void)&&
&&&&PIXELFORMATDESCRIPTOR&&&
&&&&int&n;&&
&&&&m_pDC=new&CClientDC(this);&&
&&&&ASSERT(m_pDC&!=&NULL);&&
&&&&//&设置当前的绘图像素格式 &&
&&&&if(!SetupPixelFormat())&&
&&&&&&&&return&FALSE;&&
&&&&n=::GetPixelFormat(m_pDC-&GetSafeHdc());&&
&&&&::DescribePixelFormat(m_pDC-&GetSafeHdc(),&n,sizeof(pfd),&pfd);&&
&&&&&//&创建绘图描述表 &&
&&&&m_hRC=wglCreateContext(m_pDC-&GetSafeHdc());&&
&&&&if(m_hRC&==&NULL)&&
&&&&&&&&return&FALSE;&&
&&&&//&使绘图描述表为当前调用现程的当前绘图描述表 &&
&&&&if(&wglMakeCurrent(m_pDC-&GetSafeHdc(),m_hRC)&==&FALSE)&&
&&&&&&&&return&FALSE;&&
&&&&glClearDepth(1.0f);&&
&&&&glEnable(GL_DEPTH_TEST);&&
&&&&return&TRUE;&&
别忘了再OnCreate()函数中调用 InitializeOpenGL()函数。如下所示:
int&CVCOpenGL2View::OnCreate(LPCREATESTRUCT&lpCreateStruct)&&
&&&&if&(CView::OnCreate(lpCreateStruct)&==&-1)&&
&&&&&&&&return&-1;&&
&&&&//&TODO:&&在此添加您专用的创建代码 &&
&&&&if&(&InitializeOpenGL())&&
&&&&&&&&return&0;&&
&&&&return&0;&&
6、设置视口
在OnSize()中一般用来设置视口和视锥,因为这些是和窗口大小相关的。代码如下:
void&CVCOpenGL2View::OnSize(UINT&nType,&int&cx,&int&cy)&&
&&&&CView::OnSize(nType,&cx,&cy);&&
&&&&//&TODO:&在此处添加消息处理程序代码 &&
&&&&m_wide&=&&&&&//m_wide为在CVCOpenGL2View类中添加的表示视口宽度的成员变量 &&
&&&&m_heigth&=&&&//m_height为在CVCOpenGL2View类中添加的表示视口高度的成员变量 &&
&&&&//避免除数为0 &&
&&&&if(m_heigth==0)&&
&&&&&&&&m_heigth=1;&&
&&&&//设置视口与窗口的大小 &&
&&&&glViewport(0,0,m_wide,m_heigth);&&
7、绘制场景(用OpenGL绘图相关的代码都在这里哦!!)
本文以一个三维正方体为例,代码如下:
void&CVCOpenGL2View::RenderScene(void)&&
&&&&//设置清屏颜色为黑色 &&
&&&&glClearColor(0.0f,0.0f,0.0f,0.0f);&&
&&&&//清除颜色缓冲区和深度缓冲区 &&
&&&&glClear(GL_COLOR_BUFFER_BIT&|&GL_DEPTH_BUFFER_BIT);&&
&&&&//建立正交变换下的剪切体&
&&&&if(w&h)&
&&&&&&&&glOrtho(-nRange,nRange,-nRange*h/w,nRange*h/w,-nRange,nRange);&
&&&&&&&&glOrtho(-nRange*w/h,nRange*w/h,-nRange,nRange,-nRange,nRange);&
&&&&//透视投影变换 &&
&&&&glMatrixMode(GL_PROJECTION);&&
&&&&glLoadIdentity();&&
&&&&gluPerspective(m_tFovy,&(double)m_wide/(double)m_heigth,m_zNear,m_zFar);&&
&&&&//视角变换 &&
&&&&glMatrixMode(GL_MODELVIEW);&&
&&&&glLoadIdentity();&&
&&&&gluLookAt(10,10,10,0,0,0,0,1,0);&&
&&&&//矩阵堆栈函数,和glPopMatrix()相对应 &&
&&&&glPushMatrix();&&
&&&&glBegin(&GL_LINES&);&&
&&&&glColor3d(1.0,&0.0,&0.0);&&&//&X轴&红色 &&
&&&&glVertex3d(0.0,&0.0,&0.0);&&&
&&&&glVertex3d(2.0,&0.0,&0.0);&&
&&&&glColor3d(0.0,&1.0,&0.0);&&&//&Y轴&绿色 &&
&&&&glVertex3d(0.0,&0.0,&0.0);&&
&&&&glVertex3d(0.0,&2.0,&0.0);&&
&&&&glColor3d(0.0,&0.0,&1.0);&&&//&Z轴&蓝色 &&
&&&&glVertex3d(0.0,&0.0,&0.0);&&&
&&&&glVertex3d(0.0,&0.0,&2.0);&&
&&&&glEnd();&&
&&&&glColor3f(1.0,&1.0,&1.0);&&
&&&&  glutWireCube(0.5);&&
&&&&glPopMatrix();&&
&&&&glFinish();&&
&&&&SwapBuffers(wglGetCurrentDC());&&
}&&别忘了,在OnDraw()函数中调用哦!!!!!如下:
void&CVCOpenGL2View::OnDraw(CDC*&/*pDC*/)&&
&&&&CVCOpenGL2Doc*&pDoc&=&GetDocument();&&
&&&&ASSERT_VALID(pDoc);&&
&&&&if&(!pDoc)&&
&&&&&&&&return;&&
&&&&//&TODO:&在此处为本机数据添加绘制代码 &&
&&&&RenderScene();&&
8、一些收尾工作。
8.1 为了使改变窗口大小时严重的闪烁,在OnEraseBkgnd()里做一些操作,避免windows自己的窗口刷新闪烁。OnEraseBkgnd()函数需要重写。如下:
BOOL&CVCOpenGL2View::OnEraseBkgnd(CDC*&pDC)&&
&&&&//&TODO:&在此添加消息处理程序代码和/或调用默认值 &&
&&&&return&TRUE;&&
//&&return&CView::OnEraseBkgnd(pDC); &&
}&&8.2 为了避免内存泄露,OnDestroy()函数中加一些代码,如下:
void&CVCOpenGL2View::OnDestroy()&&
&&&&CView::OnDestroy();&&
&&&&//&TODO:&在此处添加消息处理程序代码 &&
&&&&m_hRC&=&::wglGetCurrentContext();&&
&&&&  if(::wglMakeCurrent&(0,0)&==&FALSE)&&
&&&&  {&&
&&& &  &&&&MessageBox(_T("Could&not&make&RC&non-current"));&&
&&&  &}&&
&&&&if(m_hRC)&&
&&&&&&&&if(::wglDeleteContext(m_hRC)==FALSE)&&
&&&&&&&&{&&
&&&&&&&&&&&&MessageBox(_T("Could&not&delete&RC"));&&
&&&&&&&&}&&
&&&&if(m_pDC)&&
&&&&&&&&delete&m_pDC;&&
&&&&m_pDC&=&NULL;&&
至此一个单文档的框架就弄好了。下面贴出所画的立方体,如下图:
TA的最新馆藏[转]&
喜欢该文的人也喜欢

我要回帖

更多关于 python中设置环境变量 的文章

 

随机推荐