您的位置:首页 > 运维架构

在对话框中dialog 创建简单opengl程序

2013-12-30 12:43 417 查看
前言:用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目录





完成,运行即可



程序源码下:http://download.csdn.net/detail/wangsky2/6787807
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: