當前位置:編程學習大全網 - 源碼下載 - 如何在mfc中配置opengl

如何在mfc中配置opengl

1:新建壹個MFC的工程,單文檔的工程。

2:工程建好之後,可以先編譯運行壹下。下面就是要把View的窗口初始化為OpenGL的編程環境。當然以下所有的操作都是在View類中進行的。

先在Project->Settings->Link中,加上opengl32.lib

glu32.lib glut.lib glaux.lib,然後在View.h的類定義中加上如下引用。

#include <gl\gl.h>

#include <gl\glu.h>

#include <gl\glaux.h>

3:首先要讓窗口支持OpenGL,那就必須要對PIXELFORMATDESCRIPTOR這個結構有所了解,先在View類中新建壹個函數SetupPixFormat(CDC

*pDC),類型:看下面的函數就知道為BOOL,(方法:在classview中,找到**view類,鼠標右擊,添加函數)公有私有無所謂,如下:

BOOL

CTestGLInitialView::SetupPixFormat(CDC *pDC)

//我建立的工程名叫TestGLInitial{static PIXELFORMATDESCRIPTOR pfd =

//定義像素格式{ sizeof(PIXELFORMATDESCRIPTOR), //

上述格式描述符的大小 1, //

版本號 PFD_DRAW_TO_WINDOW | //

格式支持窗口 PFD_SUPPORT_OPENGL | //

格式必須支持OpenGL PFD_DOUBLEBUFFER, //

必須支持雙緩沖 PFD_TYPE_RGBA, // 申請 RGBA

格式 24, //

24位色彩深度,即1.67千萬的真彩色 0, 0, 0, 0, 0, 0, //

忽略的色彩位 0, //

無Alpha緩存 0, //

忽略Shift Bit 0,

// 無累加緩存 0, 0, 0, 0, //

忽略聚集位 32, // 32位

Z-緩存 (深度緩存) 0,

// 無蒙板緩存 0, //

無輔助緩存 PFD_MAIN_PLANE, //

主繪圖層 0, //

Reserved 0, 0, 0 //

忽略層遮罩};

int nIndex = ChoosePixelFormat(pDC->GetSafeHdc(), &pfd);

//選擇剛剛定義的像素格式if( nIndex == 0 ) return FALSE;return

SetPixelFormat(pDC->GetSafeHdc(), nIndex, &pfd);

//設置像素格式}

這個函數的主要目的就是設置窗口的像素格式,使之支持OpenGL,明白這點就行了。在創建窗口的時候,調用這個函數。

5:剛剛那個函數是用來在創建窗口是調用的,在創建窗口時,還需要對OpenGL的環境做壹些初始化,再定義壹個函數InitialGL(),(方法:在classview中,找到**view類,鼠標右擊,添加函數)公有私有也無所謂,反正是自己調用的,如下:

BOOL

CTestGLInitialView::InitialGL()

{

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;

// 初始化 OK

}

這裏的代碼我都是抄的NeHe教程上面的代碼。

6:現在可以捕獲WM_CREATE消息了(方法:view-->classvizard -->messages

maps:classname

選**view,找到WM_CREATE,添加函數,編輯代碼)。但是,還要先定義壹個CClientDC*的成員,(方法:在classview中,找到**view類,鼠標右擊,添加函數成員變量。類型:CClientDC*,名字:m_pDC)這個成員指向View窗口自己,是用來傳遞給SetupPixFormat(CDC

*pDC)函數的,沒別的意思。

現在,來捕獲WM_CREATE消息(),寫上如下代碼:

int

CTestGLInitialView::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

if

(CView::OnCreate(lpCreateStruct) == -1)

return -1;

//

TODO: Add your specialized creation code here

m_pDC = new

CClientDC(this);

SetupPixFormat(m_pDC);

HGLRC hrc =

wglCreateContext(m_pDC->GetSafeHdc());

wglMakeCurrent(m_pDC->GetSafeHdc(),

hrc);

InitialGL();

return

0;

}

當然,當窗口關閉的時候,還應該要釋放壹些資源。捕獲WM_DESTROY消息,(方法:view-->classvizard

-->messages maps:classname 選**view,找到WM_DESTROY,添加函數,編輯代碼)寫下如下代碼:

void

CTestGLInitialView::OnDestroy()

{

CView::OnDestroy();

// TODO: Add

your message handler code here

HGLRC hrc =

wglGetCurrentContext();

wglMakeCurrent(NULL,

0);

wglDeleteContext(hrc);

delete

m_pDC;

}

現在可以編譯壹下了,沒有錯誤。

7:現在,OpenGL的環境已經初始化差不多了。可以開始做圖了,先定義壹個作圖的函數DrawScene(),寫上如下的代碼:

BOOL

CTestGLInitialView::DrawScene()

{

glClear(GL_COLOR_BUFFER_BIT |

GL_DEPTH_BUFFER_BIT); //

清除屏幕和深度緩存

glLoadIdentity();

//

重置當前的模型觀察矩陣

SwapBuffers(m_pDC->GetSafeHdc());

// 交換緩沖區

return TRUE;

}

然後,要在OnDraw中,調用這個函數:

void

CTestGLInitialView::OnDraw(CDC* pDC)

{

CTestGLInitialDoc* pDoc =

GetDocument();

ASSERT_VALID(pDoc);

// TODO: add draw code for native data

here

DrawScene();

}

8:運行壹下,黑色的背景出來了。

9:這時,可以修改DrawScene()這個作圖函數,作圖。畫出NeHe第3課的那個三角形和正方形來。寫代碼如下:

BOOL

CTestGLInitialView::DrawScene(){glClear(GL_COLOR_BUFFER_BIT |

GL_DEPTH_BUFFER_BIT); //

清除屏幕和深度緩存glLoadIdentity();

// 重置當前的模型觀察矩陣

glTranslatef(-1.5f,0.0f,-6.0f); // 左移

1.5 單位,並移入屏幕

6.0glBegin(GL_TRIANGLES); //

繪制三角形glColor3f(1.0f, 0.0f, 0.0f);glVertex3f( 0.0f, 1.0f,

0.0f); // 上頂點glColor3f(0.0f, 1.0f,

0.0f);glVertex3f(-1.0f,-1.0f, 0.0f); //

左下glColor3f(0.0f, 0.0f, 1.0f);glVertex3f( 1.0f,-1.0f,

0.0f); //

右下glEnd();

//

三角形繪制結束glTranslatef(3.0f,0.0f,0.0f);

// 右移3單位glColor3f(0.0f, 0.0f,

1.0f);glBegin(GL_QUADS);

// 繪制正方形glVertex3f(-1.0f, 1.0f, 0.0f);

// 左上glVertex3f( 1.0f, 1.0f, 0.0f); //

右上glVertex3f( 1.0f,-1.0f, 0.0f); //

左下glVertex3f(-1.0f,-1.0f, 0.0f); //

右下

glEnd();SwapBuffers(m_pDC->GetSafeHdc());

// 交換緩沖區return TRUE;}

運行壹下,發現圖形沒有出現,這個怎麽回事呢。原來是因為還沒有定義投影方式和視口。即用正交投影還是透視投影。定義投影,還要捕獲WM_SIZE消息。寫如下代碼:

void

CTestGLInitialView::OnSize(UINT nType, int cx, int

cy)

{

CView::OnSize(nType, cx, cy);

// TODO: Add your message

handler code here

if (0 ==

cy) //

防止被零除

{

cy =

1; //

將Height設為1

}

glViewport(0, 0, cx, cy);

// 重置當前的視口

glMatrixMode(GL_PROJECTION); //

選擇投影矩陣

glLoadIdentity(); //

重置投影矩陣

//

設置視口的大小

gluPerspective(45.0f,(GLfloat)cx/(GLfloat)cy,0.1f,100.0f);

glMatrixMode(GL_MODELVIEW);

// 選擇模型觀察矩陣

glLoadIdentity(); //

重置模型觀察矩陣

}

再運行壹下,圖形已經出來了。以後,就可以在DrawScene()寫任何畫圖的代碼了,當窗口重繪的時候,都可以自動適應。如果要做壹段可以運動的3D圖畫,可以再捕獲WM_TIMER消息,通過在OnCreate的時候定義壹個時鐘,再配合壹些變量,就可以做簡單的動畫了

  • 上一篇:同批次同品牌的電腦,ghost系統是否會影響電腦系統的正版?
  • 下一篇:如何學習C語言,有什麽方法嗎?
  • copyright 2024編程學習大全網