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

来源:互联网 发布:淘宝网艾瑞可女式皮衣 编辑:程序博客网 时间:2024/06/08 05:34

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

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


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






1 0
原创粉丝点击