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);
}