1. 程式人生 > >OpenGL在MFC程式中的配置及使用

OpenGL在MFC程式中的配置及使用

關於在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());
}

執行結果:
在這裡插入圖片描述