創(chuàng)建一個(gè)SDI(單文檔)MFC應(yīng)用程序
這里項(xiàng)目名稱叫做MFCOpenGL,視圖類(lèi)名叫做CMFCOpenGLView
在CMFCOpenGLView類(lèi)的.h文件中,加入OpenGL的運(yùn)行庫(kù)
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>
將opengl32.lib glu32.lib glaux.lib加入到工程中,方法:在Project->Settings->Link->Object/library modules中輸入opengl32.lib glu32.lib glaux.lib,不要忘記空格.
在CMFCOpenGLView類(lèi)中加入成員函數(shù)
//函數(shù)功能:設(shè)置屏幕像素格式
BOOL CMFCOpenGLView::SetupPixelFormat()
{
static PIXELFORMATDESCRIPTOR pfd ={
sizeof(PIXELFORMATDESCRIPTOR), // 結(jié)構(gòu)大小
1, // 版本號(hào)
PFD_DRAW_TO_WINDOW | // 格式支持窗口
PFD_SUPPORT_OPENGL | // 格式必須支持OpenGL
PFD_DOUBLEBUFFER, // 格式支持雙緩沖
PFD_TYPE_RGBA, // 申請(qǐng)RGBA格式
24, // 色彩深度,此處為24位
0, 0, 0, 0, 0, 0, // 忽略的色彩位
0, // 無(wú)Alpha緩存
0, // 忽略Shift位
0, // 無(wú)累加緩存
0, 0, 0, 0, // 忽略聚集位
32, // 32位 Z-緩存(深度緩存)
0, // 無(wú)蒙板緩存
0, // 無(wú)輔助緩存
PFD_MAIN_PLANE, // 主繪圖層
0, // Reserved
0, 0, 0 // 忽略層遮罩
};
int pixelformat;
if ((pixelformat = ChoosePixelFormat(m_pDC->m_hDC, &pfd)) == 0 )
{
MessageBox("ChoosePixelFormat failed");
return FALSE;
}
if (SetPixelFormat(m_pDC->m_hDC, pixelformat, &pfd) == FALSE)
{
MessageBox("SetPixelFormat failed");
return FALSE;
}
return TRUE;
}
//函數(shù)功能:使用客戶區(qū)的DC創(chuàng)建并初始化渲染環(huán)境,渲染環(huán)境創(chuàng)建成功,我們就可以在上面繪畫(huà)了!
void CMFCOpenGLView::InitOpenGL()
{
m_pDC= new CClientDC(this); //創(chuàng)建DC
ASSERT(m_pDC != NULL);
if (!SetupPixelFormat()) //設(shè)定繪圖的位圖格式,函數(shù)下面列出
return;
m_hRC= wglCreateContext(m_pDC->m_hDC);//創(chuàng)建 RC
wglMakeCurrent(m_pDC->m_hDC, m_hRC); //RC 與當(dāng)前 DC 相關(guān)聯(lián)
glShadeModel(GL_SMOOTH);
glClearColor(0.0,0.0,0.0,0.5);
glClearDepth(
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
}
//函數(shù)功能:當(dāng)窗口大小(WM_SIZE消息)發(fā)生改變時(shí)調(diào)用,參數(shù)w,h是改變后的窗口大小
GLvoid CMFCOpenGLView::SceneResizeViewport(GLsizei w, GLsizei h)
{
if(h==0)
h=1;
m_aspect=(GLfloat)w/(GLfloat)h;
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
//函數(shù)功能:釋放、刪除RC,做些清理的工作
void CMFCOpenGLView::DisableOpenGL()
{
wglMakeCurrent(m_pDC->m_hDC,NULL); // 釋放與m_hDC 對(duì)應(yīng)的 RC
wglDeleteContext(m_hRC); // 刪除 RC
if (m_pDC)
delete m_pDC; //刪除當(dāng)前 View 擁有的 DC
}
//函數(shù)功能:繪畫(huà),這里只是創(chuàng)建一個(gè)框架,所以沒(méi)有繪畫(huà)的代碼
void CMFCOpenGLView::DrawScene() //繪畫(huà)場(chǎng)景
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
}
在PreCreateWindow函數(shù)中加入如下語(yǔ)句:
cs.style=cs.style|WS_CLIPSIBLINGS|WS_CLIPCHILDREN;
響應(yīng)WM_CREATE消息的OnCreate函數(shù);
加入如下語(yǔ)句:
InitOpenGL();
SetTimer(1,1,NULL); //設(shè)置時(shí)鐘
響應(yīng)WM_TIMER消息的OnTimer函數(shù);
加入如下語(yǔ)句:
Invalidate();
響應(yīng)WM_SIZE消息的OnSize函數(shù);
加入如下語(yǔ)句:
SceneResizeViewport((GLfloat)cx,(GLfloat)cy);
響應(yīng)WM_ERASEBKGND消息的OnEraseBKgnd函數(shù);
修改如下:
return TRUE;
// return CView::OnEraseBkgnd(pDC); //將這條語(yǔ)句注釋,并直接return TRUE;
響應(yīng)WM_DESTROY消息的OnDestroy函數(shù);
加入如下語(yǔ)句:
DisableOpenGL();
在OnDraw()函數(shù)中
加入如下語(yǔ)句:
DrawScene();
這里我并沒(méi)有給全部的代碼,只是給出所添加的代碼。并且只是一個(gè)MFC框架下的OpenGL環(huán)境,所以代碼并不復(fù)雜,也很容易理解。
聯(lián)系客服