**
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 ...