第乙個基於MFC的OpenGL應用程式

2021-05-23 06:10:17 字數 4746 閱讀 9443

第乙個基於mfcopengl應用程式

開發環境:

vc6.0

1, glut

標頭檔案,dll

和lib

: glutdlls37beta.zip

(149 kilobytes),

解壓縮後把

gltu.h

放到"vc98/include/gl"

下,把glut.lib

和glut32.lib

放到"vc9/lib" 下

,glut32.dll

和glut.dll

放到你建立的應用程式的執行目錄下

2, 建立乙個

mfc sdi

應用程式,在專案屬性中加入所需要鏈結的庫檔案

1, 在

stdafx.h

中加入下列語句:

2, 開啟

classwizard,

選擇ccy457openglview

類,為下述訊息加入訊息處理函式:wm_create (for oncreate), wm_destroy (for ondestroy), wm_size (for onsize), wm_erasebackground (for onerasebkground). //

opengl headers

#include 

<

gl/gl.h>

#include 

<

gl/glu.h>

#include 

<

gl/glut.h>

#include 

<

gl/glaux.h>

3,在視窗建立之前我們必須設定視窗風格包含ws_clipchildren

ws_clipsiblings,從而避免

opengl

繪製到其他視窗中去。這些應該放在precreatewindow()中。

bool ccy457openglview::precreatewindow(createstruct

& cs)

4, 在ccy457openglview.h

中加入如下語句:

hglrc m_hrc;    

//rendering context

cdc*m_pdc;        

//device context

bool initializeopengl();    

//initialize opengl

bool setuppixelformat();    

//set up the pixel format

void

renderscene();            

//render the scene

5,在oncreate中我們將通過建立畫素格式和繪製上下文來初始化

opengl.

在initializeopengl()

中會建立乙個裝置上下文

(dc)

,為這個

dc選擇乙個畫素格式,建立和這個

dc相關的繪製上下文(rc)

,然後選擇這個

rc.這個函式會呼叫

setuppixelformat()

來建立畫素格式。

intccy457openglview::oncreate(lpcreatestruct lpcreatestruct) 

bool ccy457openglview::initializeopengl()

//failure to set the pixel format

if(!

setuppixelformat())

//create rendering context

m_hrc 

=::wglcreatecontext (m_pdc

->

getsafehdc ());

//failure to create rendering context

if(m_hrc ==0

)//make the rc current

if(::wglmakecurrent (m_pdc

->

getsafehdc (), m_hrc)

== false)

//specify black as the clear color

::glclearcolor(

0.0f

,0.0f

,0.0f

,0.0f

);//specify the back of the buffer as clear depth

::glcleardepth(

1.0f

);//enable depth testing

::glenable(gl_depth_test);

return

true;}//

setup pixel format

/////

bool ccy457openglview::setuppixelformat()

;int

m_npixelformat 

=::choosepixelformat(m_pdc

->

getsafehdc(), 

& pfd);

if( m_npixelformat ==0

)if( ::setpixelformat(m_pdc

->

getsafehdc(), m_npixelformat, 

&pfd) 

== false)

return

true;}

6, 在

onsize()

中一般用來設定視口和

視錐,因為這些是和視窗大小相關的。基本操作包括設定視口,選擇投影矩陣,設定模型檢視矩陣。

void

ccy457openglview::onsize(uint ntype, 

intcx, 

int cy) 

//select the full client area

::glviewport(0, 

0 , cx, cy);

// compute the aspect ratio

//this will keep all dimension scales equal

aspect_ratio 

=(gldouble)cx

/ (gldouble)cy;

//select the projection matrix and clear it

::glmatrixmode(gl_projection);

::glloadidentity();

//select the viewing volume

::gluperspective(

45.0f

, aspect_ratio, .01f, 

200.0f

);//switch back to the modelview matrix and clear it

::glmatrixmode(gl_modelview);

::glloadidentity();}

7,在繪製場景時,一般包括如下步驟:

1)清空快取。

2)繪製場景。3)

flush

掉渲染流水線。

4)若設定了雙緩衝,則交換前後臺緩衝區。

void

ccy457openglview::ondraw(cdc

* pdc)

void

ccy457openglview::renderscene () 8

,試試改變視窗的大小,你會看到很嚴重的閃爍,並且關閉程式後會報告記憶體洩露,因此我們這就來解決這兩個問題吧。

發生閃爍的原因是

windows

先繪製背景,然後再是

opengl

繪製,因為我們已經讓

opengl

負責清空背景色,因此我們不需要

windows

去清空背景了

bool ccy457openglview::onerasebkgnd(cdc

* pdc) 

記憶體洩露的原因是我們在setuppixelformat()中使用了

new運算子來為cclientdc物件分配記憶體,因此需要顯示

delete掉。

void

ccy457openglview::ondestroy() 

//delete the rendering context

if(::wgldeletecontext (m_hrc)

== false)

//delete the dc

if(m_pdc)

//set it to null

m_pdc 

= null;

}

第乙個MFC程式

1.mfc使用c 語言把windows sdk api函式包裝成了幾百個類 2.最重要的兩個mfc類 2 cframewnd 3.兩種方法 1 乙個繼承 2 兩個繼承 4.具體實現 4.0vs設定 1 正常建立控制台程式 2 設定專案屬性 在常規中 a.將mfc的使用改為 在靜態庫中使用mfc 動態...

OpenGL系統設計 2 第乙個OpenGL應用

圖1 8顯示出來的實際上是乙個標準的windows視窗,和opengl好像沒有關係,儘管我們已經建立了opengl的rc。這是因為我們自己的三個主要的opengl函式glinit glmain glshutdown 都是空函式。為了真正實現opengl的功能,我們還需要將這三個函式進行填充。實際上,...

我的第乙個OPEN GL程式

我使用的是ubuntu 14.04版本的 具體安裝過程如下 sudo apt get install build essential 安裝opengl library 接下來要把我們會用到的 library 裝上去,首先安裝 opengl library sudo apt get install l...