VS2013用MFC制作包含菜单的OpenGL程序

标签: OpenGL+MFC 对话框 menu
1844人阅读 评论(0) 收藏 举报

打开VS2013新建项目 MFC程序:命名为:MFCOpenGLDemo


单击确定 下一步建一个基于对话框的程序


单击完成:


在资源视图中添加资源Menu



然后在MFCOpenGLDemo.h中添加protected类型的变量:

CMenu m_Menu;

在MFCOpenGLDemo.cpp文件BOOL CMFCOpenGLDemoDlg::OnInitDialog()函数中添加

m_Menu.LoadMenu(IDR_MENU1);
SetMenu(&m_Menu);

然后添加 一个新的对话框:

命名为矩形,ID改为IDD_RECT,并为其添加一个类rect.h

更改rect.h的内容

class rect : public CDialogEx
{
DECLARE_DYNAMIC(rect)


public:
rect(CWnd* pParent = NULL);   // 标准构造函数
virtual ~rect();


// 对话框数据
enum { IDD = IDD_RECT };


protected:

HICON m_hIcon;
HGLRC hRC;
HDC hDC;


virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
void DrawFunc();//画图      
void ChangeDrawWinSize();//改变窗口大小时


DECLARE_MESSAGE_MAP()
public:
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnDestroy();
afx_msg void OnPaint();
virtual BOOL OnInitDialog();
afx_msg void OnTimer(UINT_PTR nIDEvent);
afx_msg void OnClose();
afx_msg HCURSOR OnQueryDragIcon();
};

能用类向导的用类向导添加;

在rect.cpp文件中包含头文件#include"gl\glut.h"

更改下面的代码

line::line(CWnd* pParent /*=NULL*/)
: CDialogEx(line::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}


line::~line()
{
}


void line::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}




BEGIN_MESSAGE_MAP(line, CDialogEx)
ON_WM_CLOSE()
ON_WM_SIZE()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_TIMER()
END_MESSAGE_MAP()




// line 消息处理程序




void line::OnClose()
{
// TODO:  在此添加消息处理程序代码和/或调用默认值
KillTimer(1);
CDialogEx::OnClose();
}




void line::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
ChangeDrawWinSize();
// TODO:  在此处添加消息处理程序代码
}


HCURSOR line::OnQueryDragIcon()
{
// TODO:  在此添加消息处理程序代码和/或调用默认值


return CDialogEx::OnQueryDragIcon();
}




void line::OnTimer(UINT_PTR nIDEvent)
{
// TODO:  在此添加消息处理程序代码和/或调用默认值
DrawFunc();
CDialogEx::OnTimer(nIDEvent);
}


BOOL line::OnInitDialog()
{
CDialogEx::OnInitDialog();


// TODO:  在此添加额外的初始化
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(L"ChoosePixelFormat failed!");
return false;
}
if (!SetPixelFormat(hDC, pixelformat, &pfd))
{
MessageBox(L"SetPixelFormat failed!");
return false;
}
if (!(hRC = wglCreateContext(hDC)))
{
MessageBox(L"CreateContext failed!");
return false;
}
if (!wglMakeCurrent(hDC, hRC))
{
MessageBox(L"MakeCurrent failed!");
return false;
}


ChangeDrawWinSize();


SetTimer(1, 50, NULL); //使用一个定时器(最简单的做法)  
/****************************************************************/




return TRUE;  // return TRUE unless you set the focus to a control
// 异常:  OCX 属性页应返回 FALSE
}


void line::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 line::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO:  在此处添加消息处理程序代码
// 不为绘图消息调用 CDialogEx::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();
}
}




void line::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); //利用双缓冲  
}

然后在资源视图中的Menu中为“矩形”菜单添加消息处理

void CMFCOpenGLDemoDlg::OnRect()
{
// TODO:  在此添加命令处理程序代码
rect mRect;
mRect.DoModal();
}

然后运行点击画图->矩形就出现结果了


如果想画不同类型的图像的初始化最好在其绘画函数中进行初始化






查看评论

VS2013 OpenGL MFC 编程问题

1、编译时出现 warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s inst...
  • zkp0601
  • zkp0601
  • 2015-06-27 12:31:44
  • 952

vs mfc opengl配置教程

  • 2016年09月27日 11:55
  • 246KB
  • 下载

vs2013配置OpenGL开发环境

一、下载并解压gult库文件 下载链接:http://download.csdn.net/detail/lwqbrell/9727737解压后: 二、将解压后的文件复制到相应的文件夹中 2-1、将g...
  • lwqBrell
  • lwqBrell
  • 2017-01-03 16:44:33
  • 532

在Visual Studio 2013下利用MFC框架配置OpenGL

PS:这是弱鸡第一次写这样的总结,请多指教!需要做好的工作: 把.h文件放入D:\Program Files\Microsoft Visual Studio 12.0(前面的是Visual Studi...
  • chenzhenyu123456
  • chenzhenyu123456
  • 2017-03-12 13:19:36
  • 947

在VS2013环境下MFC学习:新建MFC工程

在VS2015环境下MFC学习系列一:新建MFC工程
  • amusi1994
  • amusi1994
  • 2016-09-26 19:39:35
  • 6016

VS2012 +MFC+ OPenGL环境搭建

这里以MFC单文档程序为例。框架的代码是基于NEHE的OPenGL教程的,应该放在负责视图的View.cpp中,笔者的项目名叫迷宫,故类名为C迷宫View,下面是主要步骤: 一. 在MFC中的View...
  • hf19931101
  • hf19931101
  • 2015-12-23 19:48:00
  • 1286

MFC 中配置OpenGL环境

MFC为编写Windows应用程序提供了极大的方便,程序员在编写Windows应用程序时,只需要几步就可以把一个程序的框架建立起来.该类极大的提高了编程者的开发效率,是个具有极大实用价值的工具. ...
  • xiaoge132
  • xiaoge132
  • 2016-03-09 09:45:49
  • 2912

《基于MFC的OpenGL编程》Part 0 基于MFC的OpenGL基本框架

《基于MFC的OpenGL编程》Part 0 基于MFC的OpenGL基本框架                                                             ...
  • sinat_24206709
  • sinat_24206709
  • 2016-03-09 15:40:58
  • 1739

直接在MFC的对话框上利用OpenGL绘制图形

借鉴前人的经验,如链接http://www.cnblogs.com/phinecos/archive/2007/07/28/834916.html介绍了如何利用MFC的单文档来使用OpenGL(本文也...
  • hurricanecqj
  • hurricanecqj
  • 2015-05-01 15:20:46
  • 1933

MFC搭建OpenGL框架示例

本文以SDI文档结构为例,列出绘制OpenGL图形的关键步骤; (1)在单文档窗口的创建过程中设置好显示的像素格式,并按OpengL的要求设置好窗口的属性和风格 (2)获得Windows设...
  • wang15061955806
  • wang15061955806
  • 2015-10-12 14:49:11
  • 1182
    个人资料
    持之以恒
    等级:
    访问量: 5万+
    积分: 1332
    排名: 3万+