打开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();
}
然后运行点击画图->矩形就出现结果了
版权声明:本文为博主原创文章,未经博主允许不得转载。