OpenGL在MFC中的實現

2021-06-01 23:21:20 字數 4400 閱讀 7694

**

1、在寫**之前,首先要做好opengl的環境配置。

比如路徑之類,還有新增標頭檔案,標頭檔案新增在stdafx.h中,有位置要求,不能在#include 這句之上

///

/這兩句加在"stdafx.h"裡面的#include

以上就會出現問題,需要加在這一句下面

#include #include

2、修改函式bool copengldemoview::precreatewindow(createstruct& cs)。這句**知識在mdi中必須,如果使用的是單文件,可以不加。

ws_clipchildren(建立父視窗使用的windows風格,用於重繪時裁剪子視窗所覆蓋的區域)

ws_clipsiblings(建立子視窗使用的windows風格,用於重繪時剪裁其他子視窗所覆蓋的區域)

bool copengldemoview::precreatewindow(createstruct& cs)

3、在view中新增成員函式和變數

//

生成的訊息對映函式

protected:

declare_message_map()

bool setwindowpixelformat(hdc hdc);

//建立繪製環境(rc)並使之成為當前繪製環境

bool createviewglcontext(hdc hdc);

//初始化opengl

bool initgl(void);

//繪圖**區

int drawglscene(void);

//>畫素格式的索引值

int m_glpixelindex;

//繪製環境,hglrc是乙個指向rendering context的控制代碼

hglrc m_hglcontext;

4、初始化變數

//

初始化this->m_glpixelindex = 0;

this->m_hglcontext = null;

5、設定畫素格式

bool copengldemoview::setwindowpixelformat(hdc hdc)

; this->m_glpixelindex = choosepixelformat(hdc,&pixeldesc);//

選擇最相近的畫素格式

/*choosepixelformat接受兩個引數:乙個是hdc,另乙個是乙個指向pixelformatdescriptor結構的指標&pixeldesc

該函式返回此畫素格式的索引值,如果返回0則表示失敗。

假如函式失敗,我們只是把索引值設為1並用 describepixelformat得到畫素格式描述。

假如你申請乙個沒得到支援的畫素格式,則choosepixelformat將會返回與你要求的畫素格式最接近的乙個值

一旦我們得到乙個畫素格式的索引值和相應的描述,我們就可以呼叫setpixelformat設定畫素格式,並且只需設定一次。

*/if(this->m_glpixelindex==0)

}if(setpixelformat(hdc,this->m_glpixelindex,&pixeldesc)==false)

return true;

}

6. 建立繪製環境(rc)並使之成為當前繪製環境

bool copengldemoview::createviewglcontext(hdc hdc)

/*wglmakecurrent 函式設定opengl當前執行緒(執行緒相關性)的渲染環境。

以後這個執行緒所有的opengl呼叫都是在這個hdc標識的裝置上繪製。

你也可以使用wglmakecurrent 函式來改變呼叫執行緒的當前渲染環境

使之不再是當前的渲染環境。

*/if(wglmakecurrent(hdc,this->m_hglcontext)==false)

return true;

}

7、在oncreate函式中呼叫上函式

int copengldemoview::oncreate(lpcreatestruct lpcreatestruct)

if(this->createviewglcontext(hdc)==false)

if(!this->initgl())

return

0;}

8、初始化opengl

bool copengldemoview::initgl(void)

9、新增wm_destroy的訊息處理函式ondestroy( ),使之如下所示:

void copengldemoview::ondestroy()

if(this->m_hglcontext!=null)

}

至此,框架都打好。

我們在程式開頭產生了乙個rc,自始自終都使用它。

這與大多數gdi程式不同。在gdi程式中,dc在需要時才產生,並且是畫完立刻釋放掉。

實際上,rc也可以這樣做;但要記住,產生乙個rc需要很多處理器時間。

因此,要想獲得高效能流暢的影象和圖形,最好只產生rc一次,並始終用它,直到程式結束。

createviewglcontex產生rc並使之成為當前rc。

wglcreatecontext返回乙個rc的控制代碼。

在你呼叫 createviewglcontex之前,你必須用setwindowpixelformat(hdc)將與裝置相關的畫素格式設定好.

wglmakecurrent將rc設定成當前rc。傳入此函式的dc不一定就是你產生rc的那個dc,但二者的裝置控制代碼(device context)和畫素格式必須一致。

假如你在呼叫wglmakeforcurrent之前已經有另外乙個rc存在,wglmakeforcurrent 就會把舊的rc沖掉,並將新rc設定為當前rc。

另外你可以用wglmakecurrent(null, null)來消除當前rc。

我們要在ondestroy中把繪製環境刪除掉。

但在刪除rc之前,必須確定它不是當前控制代碼。

我們是通過wglgetcurrentcontext來了 解是否存在乙個當前繪製環境的。

假如存在,那麼用wglmakecurrent(null, null)來把它去掉。然後就可以通過wgldelete-context來刪除rc了。

這時允許視類刪除dc才是安全的。注:一般來說,使用的都是單線 程的程式,產生的rc就是執行緒當前的rc,不需要關注上述這一點。

但如果使用的是多執行緒的程式,那我們就特別需要注意這一點了,否則會出現意想不到的後果。

10、現在實現畫圖功能

用classwizard為copengldemoview新增wmsize的訊息處理函式onsize,**如下:

void copengldemoview::onsize(uint ntype, int cx, int cy)

glviewport(0,0,width,height); //

reset the current viewport

glmatrixmode(gl_projection); //

select the projection matrix

glloadidentity(); //

reset the projection matrix

//calculate the aspect ratio of the window

gluperspective(45.0f,(glfloat)width/(glfloat)height,0.1f,100.0f);//

透視投影

glmatrixmode(gl_modelview); //

select the modelview matrix

glloadidentity(); //

reset the modelview matrix

}

11、用classwizard為copengldemoview新增wm_paint的訊息處理函式onpaint,**如下:

void copengldemoview::onpaint()

這裡最後一句很關鍵,起先我就是因為沒寫他而糾結沒有畫面

12、繪圖**。這裡可以改了

//

繪圖**區

int copengldemoview::drawglscene(void)

MFC 中配置OpenGL環境

mfc為編寫windows應用程式提供了極大的方便,程式設計師在編寫windows應用程式時,只需要幾步就可以把乙個程式的框架建立起來.該類極大的提高了程式設計者的開發效率,是個具有極大實用價值的工具.下面我們編寫mfc 的opengl 應用程式.要搭建乙個opengl基本框架,需要以下幾步 1 新...

解決OpenGL在MFC下的閃爍問題

boolcopenglview onerasebkgnd cdc pdc 我們知道,在視窗中拖動乙個圖形的時候,由於邊畫邊顯示,會出現閃爍的現象。在gdi中解決這個問題較為複雜,通過在記憶體中生成乙個記憶體dc,繪畫時讓畫筆在記憶體dc中畫,畫完後一次用bitblt將記憶體dc 貼 到顯示器上,就可...

在MFC中使用OpenGL相關配置的整理總結

本文參考了 megabyte 的opengl教程 hglrc m hglcontext opengl的rc控制代碼 bool bglewinitialized 初始化glew的判斷標誌 bool initglew hdc 首先初始化glew bool createviewglcontext hdc ...