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

原创 2015年08月01日 09:42:23

打开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();
}

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


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






Opengl学习笔记:(四)添加菜单

创建级联菜单~
  • sinat_20530977
  • sinat_20530977
  • 2015年04月02日 19:07
  • 749

VS2013 MFC单文档添加菜单

新建MFC单文档程序,命名为HelloMFC 在资源视图中打开Menu,双击打开ID为IDR_MAINFRAME的选项在最后的空白框中双击添加字符Test 回车接着添加&Hello并将ID改为ID...
  • Tan_HandSome
  • Tan_HandSome
  • 2015年08月05日 13:34
  • 2690

VS2012 +MFC+ OPenGL环境搭建

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

MFC+OpenGL单文档制作三维图像

GDI:图形设备接口 DC:设备描述表 RC:着色描述表 OpenGL:专业图形程序接口 画图原理:每个GDI命令需要传给它一个DC,OpenGL需要绘制环境(RC), RC与特定的DC联系起来,完成...
  • Tan_HandSome
  • Tan_HandSome
  • 2015年08月07日 19:55
  • 2044

图形学 - OpenGL MFC菜单实现多个图形显示源码2个

  • 2012年12月18日 17:11
  • 8.28MB
  • 下载

vs2013下,MFC单文档工程如何在菜单栏新增菜单,并添加响应函数

以前做练习时,经常使用MFC基于对话框,今天使用基于单文档
  • x_j_b
  • x_j_b
  • 2014年11月14日 16:19
  • 5918

glew,opengl

  • 2016年12月21日 16:18
  • 1.33MB
  • 下载

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

《基于MFC的OpenGL编程》Part 0 基于MFC的OpenGL基本框架                                                             ...
  • sinat_24206709
  • sinat_24206709
  • 2016年03月09日 15:40
  • 1297

VS2013/MFC编程入门之三十三(菜单:菜单及CMenu类的使用)

在上一节中讲的是VS2013的菜单资源,本节主要讲菜单及CMenu类的使用。        CMenu类的主要成员函数        MFC为菜单的操作提供了CMenu类,下面就常用的几个...
  • zhaoyinhui0802
  • zhaoyinhui0802
  • 2016年12月04日 22:36
  • 2986

VS2013/MFC编程入门之三十二(菜单:VS2013菜单资源详解)

前面我们已经讲完了所有的常用控件,本节开始为大家讲解菜单的概念及使用。        菜单简介        菜单可以分为下拉式菜单和弹出式菜单。        下拉式菜单一般在窗口标题栏下面显...
  • zhaoyinhui0802
  • zhaoyinhui0802
  • 2016年12月04日 10:43
  • 2677
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VS2013用MFC制作包含菜单的OpenGL程序
举报原因:
原因补充:

(最多只允许输入30个字)