int COpenGLBaseView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
m_pDC = new CClientDC(this);
ASSERT(m_pDC != NULL);
// 初始化像素格式
static PIXELFORMATDESCRIPTOR pfd =
{
sizeof(PIXELFORMATDESCRIPTOR), // 结构大小
1, // 版本
PFD_DRAW_TO_WINDOW | // 支持Windows
PFD_SUPPORT_OPENGL | // 支持 OpenGL
PFD_DOUBLEBUFFER, // 双缓冲
PFD_TYPE_RGBA, // 像素类型
24, // 24-bit颜色位数
0, 0, 0, 0, 0, 0, // 忽略R、G、B位数
0, // α值位数
0, // α值偏移
0, // 光栅缓存位数
0, 0, 0, 0, // 光栅各分量缓存位数
32, // 深度缓存位数
0, // 图案缓存位数
0, // 辅助缓存位数
PFD_MAIN_PLANE, // 层类型
0, // 保留
0, 0, 0 // 忽略掩码
};
// 选择像素格式
int pixelformat;
if ( (pixelformat = ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd)) == 0 )
{
AfxMessageBox("选择像素格式失败!");
return -1;
}
// 设置像素格式
if (SetPixelFormat(m_pDC->GetSafeHdc(), pixelformat, &pfd) == FALSE)
{
AfxMessageBox("设置像素格式失败!");
return -1;
}
// 创建绘制情景对象
m_hglrc = wglCreateContext(m_pDC->GetSafeHdc());
return 0;
}
void COpenGLBaseView::OnDraw(CDC* pDC)
{
COpenGLBaseDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//指定在后台缓存中绘制
glDrawBuffer(GL_BACK);
//初始化变换矩阵
glLoadIdentity();
glClearColor(0.0,0.0,0.0,0.0f);//设置背景颜色为黑色
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清除背景颜色
gluLookAt(0, 0, 10, 0, 0, 0, 0, 1, 0); // 设置观察点位置
glLoadIdentity(); // 设置当前矩阵为单位矩阵(无缩放和旋转)
glColor3f(1.0f, 0.0f, 0.0f); // 设置绘图颜色为红色
DrawGLSquare(); // 画正方形
glPushMatrix();
glScalef(2.0f, 0.5f, 0.0f); // x方向的尺寸放大一倍, y方向的尺寸缩小一倍
glColor3f(0.0f, 1.0f, 0.0f); // 设置绘图颜色为绿色
DrawGLSquare(); // 画扁矩形
glPopMatrix();
glPushMatrix();
glRotatef(45.0f, 0.0f, 0.0f, 1.0f); // 沿z轴旋转45度
glColor3f(0.0f, 0.0f, 1.0f); // 设置绘图颜色为蓝色
DrawGLSquare(); // 画菱形
glScalef(0.5f, 0.5f, 0.0f); // x方向与y方向的尺寸都缩小一半
glColor3f(1.0f, 1.0f, 0.0f); // 设置绘图颜色为黄色
DrawGLSquare();// 画小菱形
glPopMatrix();
gluLookAt(3, 2, 6, 0, 0, 0, 0, 1, 0); // 设置观察点位置
glColor3f(1.0f, 1.0f, 0.0f); //设置绘图颜色
glPushMatrix();
glColor3f(0.0,1.0,1.0);
glTranslatef(-5.0,0.2,0.0);
auxWireTeapot(1.6);// 画茶壶网格
glTranslatef(9.0,3.0,0.0);
auxSolidTeapot(1.6);//实心茶壶
glPopMatrix();
//交换前后缓存
SwapBuffers(wglGetCurrentDC());
//绘制前景
glDrawBuffer(GL_FRONT);
}
void COpenGLBaseView::DrawGLSquare()
{ // X-Y平面中的正方形
glBegin(GL_LINES); // 逆时针画边线框
// 画左边线
glVertex3f(-1.0f, 1.0f, 0.0f); // 似MoveTo
glVertex3f(-1.0f, -1.0f, 0.0f); // 似LineTo
// 画下边线
glVertex3f(-1.0f, -1.0f, 0.0f);
glVertex3f(1.0f, -1.0f, 0.0f);
// 画右边线
glVertex3f(1.0f, -1.0f, 0.0f);
glVertex3f(1.0f, 1.0f, 0.0f);
// 画上边线
glVertex3f(1.0f, 1.0f, 0.0f);
glVertex3f(-1.0f, 1.0f, 0.0f);
glEnd();
}
void COpenGLBaseView::OnDestroy()
{
CView::OnDestroy();
// TODO: Add your message handler code here
::wglMakeCurrent(NULL, NULL);
// 删除当前绘图情景对象并释放所占内存
if (m_hglrc)
{
::wglDeleteContext(m_hglrc);
m_hglrc = NULL;
}
if (m_pDC)
delete m_pDC;
}
void COpenGLBaseView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if(m_hglrc)
wglMakeCurrent(m_pDC->GetSafeHdc(), m_hglrc);//获取当前绘图场景
else
return;
glViewport(0,0,cx,cy);//设置视口大小
glMatrixMode(GL_PROJECTION);//设置变换模式为投影变换
glLoadIdentity();//初始化投影变换矩阵
//根据窗口大小设置调整正射投影矩阵
if(cx<=cy)
glOrtho(-5.0,5.0,-5.0*(GLfloat)cy/(GLfloat)cx,
5.0*(GLfloat)cy/(GLfloat)cx,-12.0,12.0);
else
glOrtho(-5.0*(GLfloat)cx/(GLfloat)cy,
5.0*(GLfloat)cx/(GLfloat)cy,-5.0,5.0,-12.0,12.0);
// 设置变换模式为模型变换
glMatrixMode(GL_MODELVIEW);
// 初始化模型变换矩阵为单位矩阵
glLoadIdentity();
}