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

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

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

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

单击完成:

在资源视图中添加资源Menu

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

CMenum_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: 在此添加命令处理程序代码rectmRect;mRect.DoModal();}

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

孤独是为了孤独背后的解脱,孤独的过程,就是一个寻找真爱的过程。

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

相关文章:

你感兴趣的文章:

标签云: