OpenGL在MFC对话框中的配置与开发

OpenGL在MFC对话框中的使用方法:

环境配置:

使用的是PIC Control控件

首先在菜单中选择“工程”——》选择“设置”——》选择选项卡“LINK”——》“对象和库模块”的编辑款中添加如下命令:opengl32.lib glu32.lib glut.lib glaux.lib ,中间都有空格哟。然后确定就好了。

首先在对话框的源文件中添加如下头文件:

#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glaux.h>

#include <gl\glut.h>
#include <afxcmn.h>

 

1.在对话框头文件中加入如下代码:

HDC hrenderDC; //DC
HGLRC hrenderRC; //RC
float m_yRotate; //转速
float m_xPos,m_yPos,m_zPos; //视角位置
int PixelFormat;

2.为对话框类添加如下成员函数:

BOOL CHelloOpenGLDlg::CreateViewGLContext(HDC hDC)
{
hrenderRC = wglCreateContext(hDC);
if(hrenderRC==NULL)
return FALSE;
if(wglMakeCurrent(hDC,hrenderRC)==FALSE)
return FALSE;
return TRUE;
}

3.为对话框类添加如下成员函数:

BOOL CHelloOpenGLDlg::SetWindowPixelFormat(HDC hDC)
{
PIXELFORMATDESCRIPTOR pixelDesc;
pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pixelDesc.nVersion = 1;
pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW |
PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER |
PFD_TYPE_RGBA;
pixelDesc.iPixelType = PFD_TYPE_RGBA;
pixelDesc.cColorBits = 32;
pixelDesc.cRedBits = 0;
pixelDesc.cRedShift = 0;
pixelDesc.cGreenBits = 0;
pixelDesc.cGreenShift = 0;
pixelDesc.cBlueBits = 0;
pixelDesc.cBlueShift = 0;
pixelDesc.cAlphaBits = 0;
pixelDesc.cAlphaShift = 0;
pixelDesc.cAccumBits = 0;
pixelDesc.cAccumRedBits = 0;
pixelDesc.cAccumGreenBits = 0;
pixelDesc.cAccumBlueBits = 0;
pixelDesc.cAccumAlphaBits = 0;
pixelDesc.cDepthBits = 0;
pixelDesc.cStencilBits = 1;
pixelDesc.cAuxBuffers = 0;
pixelDesc.iLayerType = PFD_MAIN_PLANE;
pixelDesc.bReserved = 0;
pixelDesc.dwLayerMask = 0;
pixelDesc.dwVisibleMask = 0;
pixelDesc.dwDamageMask = 0;
PixelFormat = ChoosePixelFormat(hDC,&pixelDesc);
if(PixelFormat==0) // Choose default
{
PixelFormat = 1;
if(DescribePixelFormat(hDC,PixelFormat,
sizeof(PIXELFORMATDESCRIPTOR),&pixelDesc)==0)
{
return FALSE;
}
}
if(SetPixelFormat(hDC,PixelFormat,&pixelDesc)==FALSE)
{
return FALSE;
}
return TRUE;
}

4.在对话框初始化函数中添加如下代码:

CWnd *wnd=GetDlgItem(IDC_RENDER);
hrenderDC=::GetDC(wnd->m_hWnd);
if(SetWindowPixelFormat(hrenderDC)==FALSE)
return 0;

5.在对话框类的构造函数中添加如下初始代码:

PixelFormat=0;
m_yRotate = 0;
m_xPos=0.0;
m_yPos=0.0;
m_zPos=-7.0;

5.5  .  注意:下面这段代码是放置在windlg 的初始化函数中的。
if(CreateViewGLContext(hrenderDC)==FALSE)
return 0;
glPolygonMode(GL_FRONT,GL_FILL);
glPolygonMode(GL_BACK,GL_FILL);
///
glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH);
glViewport(0,0,800,800);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45,1,0.1,100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glShadeModel(GL_SMOOTH); // Enable Smooth Shading
glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black Background
glClearDepth(1.0f); // Depth Buffer Setup
glEnable(GL_DEPTH_TEST); // Enables Depth Testing
glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do
/
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
SetTimer(1,10,0);

 

6.为对话框类添加如下成员函数:

void CHelloOpenGLDlg::RenderScene()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glLoadIdentity();
//glTranslatef(0.0f,0.0f,-6.0f); // Move Left 1.5 Units And Into The Screen 6.0
glTranslatef(m_xPos,m_yPos,m_zPos);
glRotated(m_yRotate, 0.0, 0.0, 0.0);
glBegin(GL_TRIANGLES); // Drawing Using Triangles

glVertex3f( 0.0f, 1.0f, 0.0f); // Top
glVertex3f(-1.0f,-1.0f, 0.0f); // Bottom Left
glVertex3f( 1.0f,-1.0f, 0.0f); // Bottom Right
glEnd(); // Finished Drawing The Triangle
SwapBuffers(hrenderDC);
}

7.添加对话框类的计时器函数如下:

RenderScene();
m_yRotate +=3;
CDialog::OnTimer(nIDEvent);

 

8.为对话框添加RenderScene函数,如下:

void CHelloOpenGLDlg::RenderScene()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glLoadIdentity();
//glTranslatef(0.0f,0.0f,-6.0f); // Move Left 1.5 Units And Into The Screen 6.0
glTranslatef(m_xPos,m_yPos,m_zPos);
glRotated(m_yRotate, 0.0, 0.0, 0.0);
glBegin(GL_TRIANGLES); // Drawing Using Triangles

glVertex3f( 0.0f, 1.0f, 0.0f); // Top
glVertex3f(-1.0f,-1.0f, 0.0f); // Bottom Left
glVertex3f( 1.0f,-1.0f, 0.0f); // Bottom Right
glEnd(); // Finished Drawing The Triangle
SwapBuffers(hrenderDC);
}

8.为对话框类的PreTranslateMessage添加处理函数:

BOOL CHelloOpenGLDlg::PreTranslateMessage(MSG* pMsg) 
{
// TODO: Add your specialized code here and/or call the base class
switch(pMsg->message) //注意这里的参数设置。
{
case WM_KEYDOWN: 
switch(pMsg->wParam) 
{
case VK_F2:
m_zPos+=0.2;
break;
case VK_F3:
m_zPos-=0.2;
break;
case VK_F4:
m_xPos-=0.2;
break;
case VK_F5:
m_xPos+=0.2;
break;
case VK_F6:
m_yPos+=0.2;
break;
case VK_F7:
m_yPos-=0.2;
break;
default:
break;
}
}
return CDialog::PreTranslateMessage(pMsg);
}

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值