前言:用opengl庫在mfc 對話框程序中創建簡單的opengl程序
開發環境:vs2010+opengl庫
opengl庫:下載opengl庫
程序源碼下:http://download.csdn.net/detail/wangsky2/6787807
參考:http://hi.baidu.com/xun1573/item/7041b8344d9152f1e6bb7a6e
步驟:
1.用vs2010創建mfc dialog對話框程序
直接點擊完成,創建工程結束。
2.刪掉對話框上面的lable,及button按鈕
3.打開對話框頁,並選擇“”項目“中的 ”添加類嚮導“ 打開添加類嚮導對話框,添加WM_CLOSE .WM_SIZE 方法
4.打開Dlg_OpenGLDlg.h文件,修改如下代碼:
#pragma once
#include <gl/glut.h>
#include <gl/glaux.h>
class CDlg_OpenGLDlg : public CDialogEx
{
// 構造
public:
CDlg_OpenGLAppDlg(CWnd* pParent = NULL); // 標準構造函數
// 對話框數據
enum { IDD = IDD_DLG_OPENGLAPP_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
void DrawFunc(); //在Dlg中添加一個成員函數
void ChangeDrawWinSize();
// 實現
protected:
HICON m_hIcon;
HGLRC hRC;
HDC hDC;
// 生成的消息映射函數
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnTimer(UINT nIDEvent);
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnClose();
};
5.打開Dlg_OpenGLDlg.cpp,修改文件如下:
// Dlg_OpenGLDlg.cpp : 實現文件
//
#include "stdafx.h"
#include "Dlg_OpenGL.h"
#include "Dlg_OpenGLDlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CDlg_OpenGLDlg 對話框
CDlg_OpenGLDlg::CDlg_OpenGLDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CDlg_OpenGLDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CDlg_OpenGLDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CDlg_OpenGLDlg, CDialogEx)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_TIMER()
ON_WM_SIZE()
ON_WM_CLOSE()
END_MESSAGE_MAP()
// CDlg_OpenGLDlg 消息處理程序
BOOL CDlg_OpenGLDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 設置此對話框的圖標。當應用程序主窗口不是對話框時,框架將自動
// 執行此操作
SetIcon(m_hIcon, TRUE); // 設置大圖標
SetIcon(m_hIcon, FALSE); // 設置小圖標
/****************************************************************/
//在OnInitDialog中設置像素格式,並在DC中選擇這種格式
static PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW |
PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
24 ,
0, 0, 0, 0, 0, 0,
0,
0,
0,
0, 0, 0, 0,
32 ,
0,
0,
PFD_MAIN_PLANE,
0,
0, 0, 0
};
int pixelformat;
hDC = ::GetDC(this->GetSafeHwnd());
if (!(pixelformat = ChoosePixelFormat(hDC , &pfd)))
{
MessageBox("ChoosePixelFormat failed!");
return false;
}
if (!SetPixelFormat(hDC , pixelformat , &pfd))
{
MessageBox("SetPixelFormat failed!");
return false;
}
if (!(hRC = wglCreateContext(hDC)))
{
MessageBox("CreateContext failed!");
return false;
}
if (!wglMakeCurrent(hDC , hRC))
{
MessageBox("MakeCurrent failed!");
return false;
}
ChangeDrawWinSize();
SetTimer(1 , 50 , NULL); //使用一個定時器(最簡單的做法)
/****************************************************************/
return TRUE; // 除非將焦點設置到控件,否則返回 TRUE
}
// 如果向對話框添加最小化按鈕,則需要下面的代碼
// 來繪製該圖標。對於使用文檔/視圖模型的 MFC 應用程序,
// 這將由框架自動完成。
void CDlg_OpenGLDlg::ChangeDrawWinSize()
{
CRect rect; //在這個矩形中畫圖
GetClientRect(rect);
//繪製區域佔據整個窗口大小
glViewport(0 , 0 , rect.Width() , rect.Height());
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f , rect.Width()/rect.Height() , 0.1f , 100.0f);// 計算窗口的外觀比例*/
//gluPerspective(45.0f , 640/480 , 0.1f , 100.0f);// 計算窗口的外觀比例
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClearColor(0.0f , 0.0f , 0.0f , 1.0f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
}
void CDlg_OpenGLDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用於繪製的設備上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使圖標在工作區矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 繪製圖標
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
//當用戶拖動最小化窗口時系統調用此函數取得光標
//顯示。
HCURSOR CDlg_OpenGLDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CDlg_OpenGLDlg::OnTimer(UINT nIDEvent)
{
DrawFunc(); //定時器中調用這個函數
CDialog::OnTimer(nIDEvent);
}
void CDlg_OpenGLDlg::DrawFunc() //函數具體實現
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0f , 0.0f , -3.0f);
glBegin(GL_QUADS); //繪製正方形
glTexCoord2f(0.0,1.0); //紋理左上
glVertex3f(-1.0f,1.0f,0.0f); //四邊形左上
glTexCoord2f(1.0,1.0); //紋理右上
glVertex3f(1.0f,1.0f,0.0f); //右上
glTexCoord2f(1.0,0.0); //紋理右下
glVertex3f(1.0f,-1.0f,0.0f); //右下
glTexCoord2f(0.0,0.0); //紋理左下
glVertex3f(-1.0f,-1.0f,0.0f); //左下
glEnd();
SwapBuffers(hDC); //利用雙緩衝
}
void CDlg_OpenGLDlg::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
ChangeDrawWinSize();
// TODO: 在此處添加消息處理程序代碼
}
void CDlg_OpenGLDlg::OnClose()
{
// TODO: 在此添加消息處理程序代碼和/或調用默認值
KillTimer(1);//結束settimer
CDialogEx::OnClose();
}
6.修改程序的字符編碼方式爲使用多字節字符集
7.添加opengl include 和lib目錄
完成,運行即可