MFC:基于OPenGL的三维渲染控件样例代码

opengl类

Myopengl.h

#pragma once
#include 
#pragma comment (lib,"glut64.lib")
#define GLUT_DISABLE_ATEXIT_HACK
#include "glut.h"
class Myopengl :
    public CWnd
{

public:
    Myopengl();
    ~Myopengl();
    void display();//绘制图形
    void light();//光照
    void refresh();//刷新函数
    void OnDestroy();
    CWnd* cwnd;
    float m_tranlate[3];//用于平移,对应XYZ平移量。
    float m_rorate[3];//用于旋转,分别是绕x,y,z轴的平移量
    float m_scale;//用于缩放
protected:
    HDC hdc;//设备上下文
    HGLRC hglrc;//opengl 上下文
    BOOL SetupPixelFormat(HDC hdc);//设置像素格式
  
    CPoint m_MouseDownPT;//记录鼠标坐标点,用于控制旋转角度
    bool m_bMouseDown;//记录鼠标左键是否按下
    bool m_bWheel;//记录鼠标滚轮是不是在滚动
    BOOL InitializeOpenGL(/*CDC* pDC*/);
    GLfloat ctrlpoints[4][3] = {
      { -4, -4, 0 }, { -2, 4, 0 }, { 2, -4, 0 }, { 4, 4, 0 }
    };
    void SetLogicalPalette(void);
    void InitLightAndMaterial(void);
    HPALETTE m_hPalette;//OpenGL调色板
    

public:
    DECLARE_MESSAGE_MAP()
    afx_msg void OnSize(UINT nType, int cx, int cy);
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    afx_msg void OnPaint();
//    afx_msg void OnMove(int x, int y);
    afx_msg void OnMouseMove(UINT nFlags, CPoint point);
//    afx_msg void OnMouseHWheel(UINT nFlags, short zDelta, CPoint pt);
    afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
};

Myopengl.cpp

#include "pch.h"
#include "Myopengl.h"
BEGIN_MESSAGE_MAP(Myopengl, CWnd)
	ON_WM_SIZE()
	ON_WM_CREATE()
	ON_WM_PAINT()
//	ON_WM_MOVE()
ON_WM_MOUSEMOVE()
//ON_WM_MOUSEHWHEEL()
ON_WM_MOUSEWHEEL()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
END_MESSAGE_MAP()
Myopengl::Myopengl()
{
	//用于平移,对应X Y Z 平移量。按键W:上  S:下   A:左  D:右
	m_tranlate[0] = 0;
	m_tranlate[1] = 0;
	m_tranlate[2] = -10;

	//用于旋转,分别是绕X轴 和Y轴旋转的角度,用鼠标左键控制
	m_rorate[0] = -45;
	m_rorate[1] = 0;
	m_rorate[2] = -134;

	//用于缩放,用鼠标中间滚轮控制
	m_scale = 1.0;

	//记录鼠标坐标点,用于控制旋转角度;
	m_MouseDownPT.x = 0;
	m_MouseDownPT.y = 0;

	//记录鼠标左键是否按下,按下为true,初始值为false
	m_bMouseDown = false;
	m_bWheel = true;
	m_MouseDownPT.x = 0;
	m_MouseDownPT.y = 0;

	



}
Myopengl::~Myopengl()
{
	wglMakeCurrent(NULL, NULL);
	wglDeleteContext(hglrc);//删除渲染描述表
	::ReleaseDC(m_hWnd, hdc);//释放设备描述表




}
void Myopengl::display()//绘制图形
{
	//glPushMatrix();//压栈
	//glColor3f(1.0, 0, 0);//设置颜色为红色
	//glTranslatef(m_tranlate[0], m_tranlate[1], m_tranlate[2]);//平移(X,Y,Z)
	//glRotatef(m_rorate[0], 1, 0, 0);//旋转 绕X轴
	//glRotatef(m_rorate[1], 0, 1, 0);//旋转 绕Y轴
	//glScalef(m_scale, m_scale, m_scale);//缩放(X,Y,Z)
	//glutSolidTeapot(1.0);//绘制一个茶壶,1.0:指的是茶壶大小
	//glPopMatrix();//出栈



	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清除缓冲区
	glPushMatrix();//压栈,保存模型视图矩阵
	glColor3f(1.0, 0, 0);//设置画笔颜色为红色
	glTranslatef(m_tranlate[0], m_tranlate[1], m_tranlate[2]);//平移绘制起点(X,Y,Z)
	glRotatef(m_rorate[0], 1, 0, 0);//模型旋转变换 绕X轴
	glRotatef(m_rorate[1], 0, 1, 0);//旋转 绕Y轴
	glRotatef(m_rorate[2], 0, 0, 1);//旋转 绕Z轴
	glScalef(m_scale, m_scale, m_scale);//缩放(X,Y,Z)
	glutSolidTeapot(1.0);//绘制一个茶壶,1.0:指的是茶壶大小
	glEnd();

	glPopMatrix();



}
void Myopengl::refresh()
{
	Invalidate(false);//是控件无效
	this->UpdateWindow();//更新控件



}
BOOL Myopengl::InitializeOpenGL(/*CDC* pDC*/)
{
	SetupPixelFormat(hdc);//设置像素格式
	hglrc = ::wglCreateContext(hdc);
	::wglMakeCurrent(hdc, hglrc);


	glClearColor(0.0, 0.0, 0.0, 0.0);//置黑背景
	glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &ctrlpoints[0][0]);
	glEnable(GL_MAP2_VERTEX_3);//允许二维映射
	glMapGrid2f(40, 0.0, 1.0, 40, 0.0, 1.0);
	glShadeModel(GL_FLAT);
	gluLookAt(-5, 5, -5, 0, 0, 0, 0, 1, 0);

	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();//复位

	glOrtho(-50.0, 50.0, -50.0, 50.0, -50.0, 50.0);

	return TRUE;




}
void Myopengl::SetLogicalPalette(void)
{
	struct
	{
		WORD Version;
		WORD NumberOfEntries;
		PALETTEENTRY aEntries[256];
	} logicalPalette = { 0x300, 256 };
	BYTE reds[] = { 0, 36, 72, 109, 145, 182, 218, 255 };
	BYTE greens[] = { 0, 36, 72, 109, 145, 182, 218, 255 };
	BYTE blues[] = { 0, 85, 170, 255 };
	for (int colorNum = 0; colorNum < 256; ++colorNum)
	{
		logicalPalette.aEntries[colorNum].peRed =
			reds[colorNum & 0x07];
		logicalPalette.aEntries[colorNum].peGreen =
			greens[(colorNum >> 0x03) & 0x07];
		logicalPalette.aEntries[colorNum].peBlue =
			blues[(colorNum >> 0x06) & 0x03];
		logicalPalette.aEntries[colorNum].peFlags = 0;
	}
	m_hPalette = CreatePalette((LOGPALETTE*)&logicalPalette);


}
void Myopengl::InitLightAndMaterial(void)
{
	//光照与材质参数的数值
	GLfloat ambient[] = { 0.1, 0.1, 0.1, 1.0 };
	GLfloat diffuse[] = { 0.5, 1.0, 1.0, 1.0 };
	GLfloat position[] = { 90.0, 90.0, 150.0, 0.0 };
	GLfloat front_mat_shininess[] = { 0.0,0.0,0.0,1.0 };
	GLfloat front_mat_specular[] = { 0.0, 0.0, 0.0, 1.0 };
	GLfloat front_mat_diffuse[] = { 0.1, 0.5, 0.8, 1.0 };
	GLfloat lmodel_ambient[] = { 1.0, 1.0, 1.0, 1.0 };
	glPushMatrix();
	glEnable(GL_DEPTH_TEST);
	glDepthFunc(GL_LEQUAL);
	//设置光照
	glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
	glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
	glLightfv(GL_LIGHT0, GL_POSITION, position);
	//设置材质
	glMaterialfv(GL_FRONT, GL_SHININESS, front_mat_shininess);
	glMaterialfv(GL_FRONT, GL_DIFFUSE, front_mat_diffuse);
	glMaterialfv(GL_FRONT, GL_SPECULAR, front_mat_specular);
	glEnable(GL_LIGHT0);//启动一号灯
	glEnable(GL_LIGHTING);//开启光照
	glShadeModel(GL_SMOOTH);
	glPopMatrix();//出栈,恢复模型视图矩阵




}
BOOL Myopengl::SetupPixelFormat(HDC hdc)
{

	//PIXELFORMATDESCRIPTOR pfd =     //像素格式
	//{
	//	sizeof(PIXELFORMATDESCRIPTOR),
	//	1,
	//	PFD_DRAW_TO_WINDOW | //绘制到窗口
	//	PFD_SUPPORT_OPENGL |//支持opengl
	//	PFD_DOUBLEBUFFER,//采用双缓冲
	//	PFD_TYPE_RGBA,//像素类型 RGBA
	//	24,//像素位数 4*8- 32
	//	0, 0, 0, 0, 0, 0,//
	//	0,
	//	0,
	//	0,
	//	0, 0, 0, 0,
	//	16,//深度缓冲区位数
	//	0,//模板缓冲
	//	0,
	//	PFD_MAIN_PLANE,//
	//	0,
	//	0, 0, 0
	//};
	//int pixelformat;
	//if (0 == (pixelformat = ChoosePixelFormat(hdc, &pfd)))//匹配像素格式的索引
	//{
	//	return FALSE;
	//}
	//if (FALSE == ::SetPixelFormat(hdc, pixelformat, &pfd))//设置像素格式
	//{
	//	return FALSE;
	//}
	//return TRUE;
	PIXELFORMATDESCRIPTOR pfd =     //像素格式
	{
		sizeof(PIXELFORMATDESCRIPTOR),
		1,//结构大小
		PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
		//结构版本,绘制到窗口,绘制到窗口支持opengl,告知OpenGL如何处理像素,采用双缓冲
		PFD_TYPE_RGBA,//颜色模式,像素类型 RGBA
		24,//颜色位数,像素位数 4*8- 32
		0, 0, 0, 0, 0, 0,//通常为0
		0,//RGBA颜色缓存中Alpha的位数
		0,//现不支持置为0
		0,//累计缓存的位数
		0, 0, 0, 0,//基本不被采用置为0
		32,//深度缓冲区位数
		0,//模板缓冲位数
		0,//辅助缓存为主
		PFD_MAIN_PLANE,//层面类型:主层
		0,0, 0, 0//置0
	};
	//选择匹配像素格式,并返回索引
	int pixelformat;
	if (0 == (pixelformat = ::ChoosePixelFormat(hdc, &pfd)))//匹配像素格式的索引
	{
		return FALSE;
	}
	if (FALSE == ::SetPixelFormat(hdc, pixelformat, &pfd))//设置像素格式
	{
		return FALSE;
	}
	if (pfd.dwFlags & PFD_NEED_PALETTE)
	{
		SetLogicalPalette();//设置逻辑调色板
	}
	return TRUE;



}
void Myopengl::OnSize(UINT nType, int cx, int cy)
{
	//CWnd::OnSize(nType, cx, cy);

	 TODO: 在此处添加消息处理程序代码
	//GLdouble aspect_ratio;//窗口长宽比
	//if (0 >= cx || 0 >= cy)//窗口长、宽必须大于0
	//	return;
	//glViewport(0, 0, cx, cy);//根据窗口的实时变化重绘窗口
	//aspect_ratio = (GLdouble)cx / (GLdouble)cy;//长宽比
	//glMatrixMode(GL_PROJECTION);//对投影矩阵应用随后的矩阵操作
	//glLoadIdentity();//重置当前投影矩阵指定的矩阵为单位矩阵	
	//gluPerspective(45.0f, aspect_ratio, 0.1f, 10000.0f);//谁知投影矩阵
	//glMatrixMode(GL_MODELVIEW);//对模型视景矩阵堆栈应用随后的矩阵操作	
	//glLoadIdentity();//重置当前模型矩阵为单位矩阵


	CWnd::OnSize(nType, cx, cy);

	// TODO: 在此处添加消息处理程序代码
	GLdouble aspect_ratio;//窗口长宽比
	if (0 >= cx || 0 >= cy)//窗口长、宽必须大于0
		return;
	//设置视口
	glViewport(0, 0, cx, cy);//根据窗口的实时变化重绘窗口,将三维空间坐标映射为屏幕二维平面坐标
	aspect_ratio = (GLdouble)cx / (GLdouble)cy;//长宽比
	glMatrixMode(GL_PROJECTION);//对投影矩阵应用随后的矩阵操作
	glLoadIdentity();//重置当前投影矩阵指定的矩阵为单位矩阵    
	gluPerspective(45.0f, aspect_ratio, 0.1f, 10000.0f);//谁知投影矩阵
	//切换到模型视图矩阵
	glMatrixMode(GL_MODELVIEW);//对模型视景矩阵堆栈应用随后的矩阵操作    
	glLoadIdentity();//重置当前模型矩阵为单位矩阵


}


int Myopengl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	//if (CWnd::OnCreate(lpCreateStruct) == -1)
	//	return -1;
	 TODO:  在此添加您专用的创建代码
	//if (CWnd::OnCreate(lpCreateStruct) == -1)
	//	return -1;
	//hdc = ::GetDC(m_hWnd);//hdc设备上下文,m_hWnd窗口句柄
	//SetupPixelFormat(hdc);//设置像素格式
	CPaintDC dc(this);
	//hglrc = wglCreateContext(hdc);//hglrc :opengl设备上下文
	//wglMakeCurrent(hdc, hglrc);//hglrc绑定hdc; 绘制到当前设备上下文

	//glClearDepth(1.0f);//1.0是最大深度([0.0,1.0])
	//glEnable(GL_DEPTH_TEST);//启动深度检测

	//return 0;

	if (CWnd::OnCreate(lpCreateStruct) == -1)
		return -1;

	// TODO:  在此添加您专用的创建代码
	hdc = ::GetDC(cwnd->m_hWnd);
	InitializeOpenGL();

	InitLightAndMaterial();

	return 0;

}


void Myopengl::OnPaint()
{
	//CPaintDC dc(this); // device context for painting
	 TODO: 在此处添加消息处理程序代码
	 不为绘图消息调用 CWnd::OnPaint()
	 TODO: 在此处添加消息处理程序代码
	 不为绘图消息调用 CWnd::OnPaint()
	//wglMakeCurrent(hdc, hglrc);//hglrcopengl设备上下文--》绑定-->hdc当前设备上下文
	//glClearColor(0.3f, 0.3f, 0.3f, 1.0f);//背景颜色
	//glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清除颜色缓冲以及深度缓冲 
	//light();
	//display();//绘制函数,在这个函数中绘制自己的图形
	//glFinish();//绘制结束
	//SwapBuffers(hdc);//交换前后缓冲区
	//wglMakeCurrent(hdc, NULL);//释放设备上下文

	CPaintDC dc(this); // device context for painting
	// TODO: 在此处添加消息处理程序代码
	// 不为绘图消息调用 CWnd::OnPaint()
	wglMakeCurrent(hdc, hglrc);
	glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	display();
	glFinish();
	SwapBuffers(hdc);
	wglMakeCurrent(hdc, NULL);



}


//void Myopengl::OnMove(int x, int y)
//{
//	CWnd::OnMove(x, y);
//
	// TODO: 在此处添加消息处理程序代码
//}
void Myopengl::light()
{
	float ambientlight0Color[] = { 0.0f,0.0f,0.0f,1.0f };
	float diffuselight0Color[] = { 1.0f,1.0f,1.0f,1.0f };
	float specularlight0Color[] = { 1.0f,1.0f,1.0f,1.0f };
	float light0Position[] = { -2.0,2.0f,2.0f,1.0f };
	float ambientM[] = { 0.11f,0.06f,0.11f,1.0f };
	float ambientD[] = { 0.43f,0.47f,0.54f,1.0f };
	float ambientS[] = { 0.33f,0.33f,0.52f,1.0f };
	float ambientE[] = { 0.0f,0.0f,0.0f,0.0f };
	float ambientSE = 10;

	glLightfv(GL_LIGHT0, GL_AMBIENT, ambientlight0Color);
	glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuselight0Color);
	glLightfv(GL_LIGHT0, GL_SPECULAR, specularlight0Color);
	glLightfv(GL_LIGHT0, GL_POSITION, light0Position);
	//----------设置材质
	glMaterialfv(GL_FRONT, GL_AMBIENT, ambientM);
	glMaterialfv(GL_FRONT, GL_DIFFUSE, ambientD);
	glMaterialfv(GL_FRONT, GL_SPECULAR, ambientS);
	glMaterialfv(GL_FRONT, GL_EMISSION, ambientE);
	glMaterialf(GL_FRONT, GL_SHININESS, 10.0f);
	//控制镜面反射光斑的大小 0---120
	//-----------启动光照
	glEnable(GL_LIGHT0);
	glEnable(GL_LIGHTING);

}

void Myopengl::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if (m_bMouseDown)//如果鼠标左键按下
	{
		m_rorate[0] += point.y - m_MouseDownPT.y;//通过滑动鼠标改变旋转的角度
		m_rorate[1] += point.x - m_MouseDownPT.x;//通过滑动鼠标改变旋转的角度

		m_MouseDownPT = point;//记录当前点
	}
	refresh();//刷新控件
	CWnd::OnMouseMove(nFlags, point);

}
void Myopengl::OnDestroy()
{
	CWnd::OnDestroy();

	// TODO: 在此处添加消息处理程序代码
	::wglMakeCurrent(0, 0);
	::wglDeleteContext(hglrc);
	//删除调色板和渲染上下文
	if (m_hPalette)
	{
		DeleteObject(m_hPalette);
	}




}

//void Myopengl::OnMouseHWheel(UINT nFlags, short zDelta, CPoint pt)
//{
	// 此功能要求 Windows Vista 或更高版本。
	// _WIN32_WINNT 符号必须 >= 0x0600。
	// TODO: 在此添加消息处理程序代码和/或调用默认值

//	CWnd::OnMouseHWheel(nFlags, zDelta, pt);
//}


BOOL Myopengl::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值


	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if (m_bWheel)
	{
		if (zDelta > 0)m_scale += 0.1;//放大.向上滚动
		if (zDelta < 0)m_scale -= 0.1;//缩小,向下滚动
		if (m_scale < 0.1) m_scale = 0.1;//最小倍数为0.1

		refresh();//刷新控件
	}

	return CWnd::OnMouseWheel(nFlags, zDelta, pt);

}


void Myopengl::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	 // TODO: 在此添加消息处理程序代码和/或调用默认值
	m_MouseDownPT = point;//记录鼠标左键按下的坐标点
	m_bMouseDown = true;//记录鼠标左键按下

	if (!m_bWheel)
	{
		this->SetFocus();
		m_bWheel = true;
	}
	else
	{
		m_bWheel = false;
	}

	CWnd::OnLButtonDown(nFlags, point);

}


void Myopengl::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	m_bMouseDown = false;//记录鼠标左键弹起
	CWnd::OnLButtonUp(nFlags, point);
}

主对话框

3ddlgDlg.h


// 3ddlgDlg.h: 头文件
//

#pragma once

#include "MyOpengl.h"
// CMy3ddlgDlg 对话框
class CMy3ddlgDlg : public CDialogEx
{
// 构造
public:
	CMy3ddlgDlg(CWnd* pParent = nullptr);	// 标准构造函数
	Myopengl* m_pDisplay;
// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_MY3DDLG_DIALOG };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持


// 实现
protected:
	HICON m_hIcon;
	virtual BOOL PreTranslateMessage(MSG* pMsg);
	// 生成的消息映射函数
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
};

3ddlgDlg.cpp


// 3ddlgDlg.cpp: 实现文件
//

#include "pch.h"
#include "framework.h"
#include "3ddlg.h"
#include "3ddlgDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialogEx
{
public:
	CAboutDlg();

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_ABOUTBOX };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)

END_MESSAGE_MAP()


// CMy3ddlgDlg 对话框



CMy3ddlgDlg::CMy3ddlgDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_MY3DDLG_DIALOG, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CMy3ddlgDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}
BOOL CMy3ddlgDlg::PreTranslateMessage(MSG* pMsg)
{
	// TODO: 在此添加专用代码和/或调用基类
	if (pMsg->message == WM_KEYDOWN && (GetAsyncKeyState(VK_CONTROL) < 0))
	{
		switch (pMsg->wParam)
		{
		case'W'://上移动    
			m_pDisplay->m_tranlate[1] += 0.1;
			return TRUE;
		case'S'://下移动    
			m_pDisplay->m_tranlate[1] -= 0.1;
			return TRUE;
		case'A'://左移动    
			m_pDisplay->m_tranlate[0] -= 0.1;
			return TRUE;
		case'D'://右移动
			m_pDisplay->m_tranlate[0] += 0.1;
			return TRUE;
		case VK_UP:
			m_pDisplay->m_rorate[0] += 5;
			return TRUE;
		case VK_DOWN:
			m_pDisplay->m_rorate[0] -= 5;
			return TRUE;
		case VK_LEFT:
			m_pDisplay->m_rorate[2] -= 5;
			return TRUE;
		case VK_RIGHT:
			m_pDisplay->m_rorate[2] += 5;
			return TRUE;
		}
	}
	m_pDisplay->refresh();//刷新控件    
	return CDialogEx::PreTranslateMessage(pMsg);






}

BEGIN_MESSAGE_MAP(CMy3ddlgDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_KEYDOWN()
END_MESSAGE_MAP()


// CMy3ddlgDlg 消息处理程序

BOOL CMy3ddlgDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 将“关于...”菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != nullptr)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码
	m_pDisplay = new Myopengl();
	//CRect rect;
	CRect rect = CRect(10, 10, 620, 430);

	m_pDisplay->cwnd = GetDlgItem(IDC_OpenGl);
	GetDlgItem(IDC_OpenGl)->GetClientRect(&rect);
	m_pDisplay->Create(NULL, NULL, WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VISIBLE, rect, this, 0);




	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CMy3ddlgDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialogEx::OnSysCommand(nID, lParam);
	}
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CMy3ddlgDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast(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();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CMy3ddlgDlg::OnQueryDragIcon()
{
	return static_cast(m_hIcon);
}

你可能感兴趣的:(opengl,mfc,c++)