OpenGL在MFC程式中的配置及使用
阿新 • • 發佈:2018-12-03
關於在MFC中使用OpenGL繪圖,我在網上參考了許多教程,感覺很雜很亂,因此走了不少彎路。在此寫下這篇教程,希望能幫助更多像我這樣的新手。
注:你的電腦可不必事先配置好OpenGL環境
建立MFC程式
點選 確定,下一步,選擇單文件,mfc標準,完成。
點選執行專案
專案中新增OpenGL環境
點選
搜尋:nupengl
選擇第二個包,點選安裝
這時,你的專案中就包括OpenGL的所有檔案了,就不必那麼繁瑣的配置OpenGL的開發環境了。當然,你每新建一個專案,就得再執行一遍這個步驟。
在stdafx.h 檔案中引用OpenGL
最終就是這樣
MFC與OpenGL結合
1,在xxxxxView.h裡面新增變數
private:
HGLRC m_hRC;
CClientDC* m_pDC;
2,在xxxxxView.cpp裡面新增自定義函式setPixelFormat(),用於設定畫素格式
點選完成,在函式中加入
bool CMFCOpenGLView::setPixelFormat() { static PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), // 結構的大小 1, // 結構的版本 PFD_DRAW_TO_WINDOW | // 在視窗(而不是點陣圖)中繪圖 PFD_SUPPORT_OPENGL | // 支援在視窗中進行OpenGL呼叫 PFD_DOUBLEBUFFER, // 雙緩衝模式 PFD_TYPE_RGBA, // RGBA顏色模式 32, // 需要32位顏色 0, 0, 0, 0, 0, 0, // 不用於選擇模式 0, 0, // 不用於選擇模式 0, 0, 0, 0, 0, // 不用於選擇模式 16, // 深度緩衝區的大小 0, // 在此不使用 0, // 在此不使用 0, // 在此不使用 0, // 在此不使用 0, 0, 0 // 在此不使用 }; // 選擇一種與pfd所描述的最匹配的畫素格式 // 為裝置環境設定畫素格式 int pixelformat; pixelformat = ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd); if (0 == pixelformat) return false; // 為裝置環境設定畫素格式 return SetPixelFormat(m_pDC->GetSafeHdc(), pixelformat, &pfd); return false; }
3,在xxxxxView.cpp裡面新增OnCreate()函式,建立視窗時呼叫
int CMFCOpenGLView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: 在此新增您專用的建立程式碼 // 建立DC m_pDC = new CClientDC(this); ASSERT(m_pDC != NULL); // 選擇畫素格式 if (!setPixelFormat()) return -1; // 建立渲染環境, 並使它成為當前渲染環境 m_hRC = wglCreateContext(m_pDC->GetSafeHdc()); wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC); return 0; }
4,同理,在xxxxxView.cpp裡面新增OnDestroy()函式
void CMFCOpenGLView::OnDestroy()
{
CView::OnDestroy();
// TODO: 在此處新增訊息處理程式程式碼
wglMakeCurrent(NULL, NULL);
wglDeleteContext(m_hRC);
delete m_pDC;
}
5,新增函式OnInitialUpdate(),類似於OpenGL裡面的OnInit()函式
void CMFCOpenGLView::OnInitialUpdate()
{
CView::OnInitialUpdate();
// TODO: 在此新增專用程式碼和/或呼叫基類
glClearColor(1, 1, 1, 1);
}
5,同方法,新增OnSize()函式,類似於OpenGL裡面的Reshape()函式
void CMFCOpenGLView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
// TODO: 在此處新增訊息處理程式程式碼
glViewport(0, 0, cx, cy);
// 設定投影矩陣(透視投影)
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, (GLfloat)cx / (GLfloat)cy, 1.0, 1000.0);
// 設定模型檢視矩陣
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
// 顯示三維圖形的程式
/*glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 100.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();*/
}
至此框架已經搭建完成。
簡單畫線實驗
右鍵,新增事件處理函式
設定函式名
void CMFCOpenGLView::OnOpenglDrawline()
{
// TODO: 在此新增命令處理程式程式碼
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glColor3f(1.0,0.0,0.0);
glLineWidth(3);
glBegin(GL_LINES);
glVertex2f(-0.5, 0.5);
glVertex2f(-0.5, -0.5);
glEnd();
glPopMatrix();
// 交換緩衝區
SwapBuffers(wglGetCurrentDC());
}
執行結果: