一直想系統的學習MFC,感覺網上的關於這方面的好雜好亂,好多都看不懂(可能由於太菜233.)
看了幾位大神的博客,終於明白了點,記錄一下自己的學習過程吧
一、新建項目
二、選擇多文檔,MFC標准,點擊完成
三、運行結果
四、導入必要的文件
1. 在<stdafx.h >里面加入一些常用的頭文件
#include <gl/gl.h> #include <gl/glu.h> #include <gl/glut.h> #include <stdio.h> #include <math.h>
2.在項目中加入OpenGL的lib庫
選中項目,鼠標右鍵點擊
選中屬性,找到配置屬性/鏈接器/輸入/附加依賴項
寫入需要使用的lib文件
四、在程序里面添加函數和變量
<1>在---View.h里面添加變量
private: HGLRC m_hRC; CClientDC* m_pDC;
<2>在--View.cpp里面添加自定義函數bSetDCPixelFormat(),用於設置像素格式
bool CStudy01View::bSetDCPixelFormat() { 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)在View.cpp里面添加OnCreate()函數,創建窗口時調用
int CStudy01View::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: 在此添加您專用的創建代碼 // 創建DC m_pDC = new CClientDC(this); ASSERT(m_pDC != NULL); // 選擇像素格式 if (!bSetDCPixelFormat()) return -1; // 創建渲染環境, 並使它成為當前渲染環境 m_hRC = wglCreateContext(m_pDC->GetSafeHdc()); wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC); return 0; }
(4)添加OnDestroy() 函數,同OnCreate函數的添加過程
void CStudy01View::OnDestroy() { CView::OnDestroy(); // TODO: 在此處添加消息處理程序代碼 wglMakeCurrent(NULL, NULL); wglDeleteContext(m_hRC); delete m_pDC; }
(5)修改OnDraw()函數,畫圖時調用該函數
void CStudyView::OnDraw(CDC* /*pDC*/) { CStudyDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: 在此處為本機數據添加繪制代碼 // 清除顏色 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 繪制場景 glMatrixMode(GL_MODELVIEW); glPushMatrix(); DrawPicture(); //為了更加明了,DrawPicture函數就是繪圖的核心代碼 glPopMatrix(); // 交換緩沖區 SwapBuffers(wglGetCurrentDC()); }
(6)添加繪圖自定義函數DrawPicture(),就是OpenGL里面的Display()函數
(7)添加函數OnInitialUpdate(),類似於OpenGL里面的OnInit()函數
void CStudy01View::OnInitialUpdate() { CView::OnInitialUpdate(); // TODO: 在此添加專用代碼和/或調用基類 glClearColor(1, 1, 1, 1); }
(8)添加OnSize()函數,類似於OpenGL里面的Reshape()函數
void CStudy01View::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();*/ }
五
把定義的類和方法寫入---View.h頭文件里面,方便調用
到此,基本工作就OK了。