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

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

}

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-05 03:43:07

VS2013用MFC制作包含菜单的OpenGL程序的相关文章

[MFC] VS2013版本MFC工程移植到VC6.0上

:VS虽号称“宇宙最强IDE”,但是有时候安装包太大,动不动就几个G:而且安装好之后也会多出很多几乎很难用到的部分,这对于那些处女座的人如何忍受!本文不是吐槽,而是给出一种在应急场景下,不用安装新版本几个G的IDE,而是将高版本的工程移植到低版本的IDE中,并使其工作和调试的解决方法~ VS2013版本MFC工程移植到VC6.0上 1.场景再现 我最近搞了个ubuntu系统,并在virtualbox中装了个win7用于安装设计PCB和嵌入式集成开发环境Keil.项目需要,得用到我之前写的一个将图

精通CSS+DIV网页样式与布局--制作实用菜单

在上篇博文中,小编中主要的简单总结了一下CSS中关于如何设置页面和浏览器元素,今天小编继续将来介绍CSS的相关基础知识,这篇博文,小编主要简单的总结一下在CSS中如何制作网页中的菜单,这部分的内容包括:项目列表.无需表格的菜单.菜单的横竖装换,看下面一张思维导图: 首先,我们看项目列表,列表的符号,我们来看例子代码和运行效果: <span style="font-size:18px;"><span style="font-size:18px;"&g

使用pyinstaller制作包含Oracle数据库的可执行程序

使用pyinstaller制作包含Oracle数据库的可执行程序 准备 首先参考[Linux上pip安装cx_Oracle]安装cx_Oracle库和oracle驱动instantclient_11_2. 这里假定oracle驱动还是解压到/opt/instantclient_11_2目录下,内容大致如下: /opt/instantclient_11_2 ├── adrci ├── BASIC_LITE_README ├── genezi ├── libclntsh.so.11.1 ├── li

mfc添加系统菜单

在OnInitDialog()函数里,mfc对系统菜单进行了处理,要想对你的程序增加属于你自己的系统菜单,可在其基础上进行修改,最后在进行响应. 具体步骤如下: (1)定义属于自己的系统菜单ID,此ID必须<0xF000,这样才不会跟系统使用的ID产生冲突. #define IDM_SYS_SELF 1 (2)在OnInitDialog里面增加如下红色内容: ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBO

CSS3背景 制作导航菜单综合练习题

CSS3背景 制作导航菜单综合练习题 小伙伴们,根据所学知识,使用CSS3实现下图的导航菜单效果 任务 1.制作导航圆角 提示:使用border-radius实现圆角 2.制作导航立体风格 提示:使用box-shadow实现立体风格 3.制作导航分隔线 提示:使用渐变与伪元素制作 4.删除第一个和最后一个导航分隔线 提示:使用伪元素删除第一个和最后一个分隔线 <!doctype html> <html lang="en"> <head> <me

CSS制作二级菜单时,二级菜单与一级菜单不对齐

效果如图: 部分代码如图: <li><a href="#" target="_blank">关于我们</a> <ul> <li class="top"><a href="#" target="_blank">关于我们</a></li> <li><a href="#" targ

ASP动态网页设计与Ajax技术----制作折叠式菜单

<!doctype html><html><head><meta charset="utf-8"><title>制作折叠式菜单</title></head><style type="text/css"> ul{list-style: none; margin: 0; padding: 0;} #accordion{width: 200px;} #accordion li{

用VC++打造有多语言菜单的应用程序[转]

随着计算机技术的快速发展,软件的交流越来越频繁,软件的国际化已成为一个软件开发人员不可回避的一个问题.所谓软件的国际化,就是让软件界面支持多种语言,从而可以被很多国家的人使用.为了使应用程序支持多种语言,一个很好的办法就是使用动态链接库,将不同的语言资源放入不同的库中,根据需要程序加载不同的动态库,从而实现程序的国际化.但是这种方法实现起来不很方便,对软件开发人员要求较高,尤其是对于初学者,难度较大.为了解决这个问题,以实现多语言菜单为例,笔者介绍在VC编程中一种简单实现方法,从而实现软件的国际

1.一个简单的OpenGL程序

一.OpenGL介绍 1.与C语言紧密结合. OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的. 如果你曾经接触过TC的graphics.h,你会发现,使用OpenGL作图甚至比TC更加简单. 2.强大的可移植性. 微软的Direct3D虽然也是十分优秀的图形API,但它只用于Windows系统(现在还要加上一个XBOX游戏机). 而OpenGL不仅用于 Windows,还可以用于Unix/Linux等其它系统,它甚至在大型计算机.各种专