📄 glview.cpp
字号:
// GLView.cpp : implementation of the CGLView class
//
#include "stdafx.h"
#include "GL.h"
#include "GLDoc.h"
#include "GLView.h"
#include "gl\gl.h"//加入的头文件
#include "gl\glu.h"//加入的头文件
#include "gl\glut.h"//加入的头文件
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CGLView
IMPLEMENT_DYNCREATE(CGLView, CView)
BEGIN_MESSAGE_MAP(CGLView, CView)
//{{AFX_MSG_MAP(CGLView)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_ERASEBKGND()
ON_WM_SIZE()
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGLView construction/destruction
CGLView::CGLView()
{
m_hDC = NULL;
m_hRC = NULL;
}
CGLView::~CGLView()
{
}
BOOL CGLView::PreCreateWindow(CREATESTRUCT& cs)//由AppWizard自动生成
{
// Add Window style required for OpenGL before window is created
cs.style |= WS_CLIPSIBLINGS|WS_CLIPCHILDREN|CS_OWNDC;//增加属性
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CGLView drawing
void CGLView::OnDraw(CDC* pDC)
{
wglMakeCurrent(m_hDC,m_hRC);//当前化RC
RenderScene();//调用虚拟函数,具体绘制OpenGL图形
SwapBuffers(m_hDC);//交换缓存
wglMakeCurrent(m_hDC,NULL);//非当前化RC
}
/////////////////////////////////////////////////////////////////////////////
// CGLView diagnostics
#ifdef _DEBUG
CGLDoc* CGLView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGLDoc)));
return (CGLDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CGLView message handlers
int CGLView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)//创建视图窗口
return -1;
// TODO: Add your specialized creation code here
//创建窗口后,进行OpenGL Windows初始化
GLInit();//像素格式的设置和RC的创建
SetTimer(0,50,NULL);
return 0;
}
void CGLView::OnDestroy()
{
GLRelease();//先释放RC
CView::OnDestroy();//后释放窗口
}
BOOL CGLView::OnEraseBkgnd(CDC* pDC)
{
//return CView::OnEraseBkgnd(pDC);
return FALSE;
}
void CGLView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
VERIFY(wglMakeCurrent(m_hDC,m_hRC));
GLResize(cx,cy);
VERIFY(wglMakeCurrent(NULL,NULL));
}
void CGLView::GLInit()
{
m_hDC = ::GetDC(m_hWnd); // 获取RC句柄
ASSERT(m_hDC);
//定义像素格式
static PIXELFORMATDESCRIPTOR pfdWnd =
{
sizeof(PIXELFORMATDESCRIPTOR), // Structure size.
1, // Structure version number.
PFD_DRAW_TO_WINDOW | // Property flags.
PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
24, // 24-bit color.
0, 0, 0, 0, 0, 0, // Not concerned with these.
0, 0, 0, 0, 0, 0, 0, // No alpha or accum buffer.
32, // 32-bit depth buffer.
0, 0, // No stencil or aux buffer.
PFD_MAIN_PLANE, // Main layer type.
0, // Reserved.
0, 0, 0 // Unsupported.
};
//在DC中选取和所定义的最匹配的像素格式
int pixelformat;
pixelformat = ChoosePixelFormat(m_hDC, &pfdWnd);
//为DC设置像素格式
ASSERT(SetPixelFormat(m_hDC, pixelformat, &pfdWnd));
//创建RC
m_hRC=wglCreateContext(m_hDC);//1.创建一个RC
//选择m_hRC为当前RC
VERIFY(wglMakeCurrent(m_hDC,m_hRC));//2. 激活当前RC
//初始化RC
GLSetupRC();//3. 渲染绘图
//关闭RC
VERIFY(wglMakeCurrent(NULL,NULL));//4. 关闭RC
}
//clear up rendering context
void CGLView::GLRelease()
{
wglDeleteContext(m_hRC);//删除创建的RC
::ReleaseDC(m_hWnd,m_hDC);
}
void CGLView::GLResize(int cx,int cy)
{
double nRange = 1.9;
// Prevent a divide by zero
if(cy == 0)
cy = 1;
// Set Viewport to window dimensions
glViewport(0, 0, cx, cy);
glMatrixMode(GL_PROJECTION);
// Reset coordinate system
glLoadIdentity();
// Establish clipping volume (left, right, bottom, top, near, far)
if(cx <= cy)
glOrtho(-nRange,nRange,-nRange*cy/cx,nRange*cy/cx,nRange,-nRange);
else
glOrtho(-nRange*cx/cy,nRange*cx/cy,-nRange,nRange,nRange,-nRange);
glMatrixMode( GL_MODELVIEW );
glLoadIdentity( );
}
//为RC设置光照、颜色和材质
void CGLView::GLSetupRC()
{
glEnable(GL_DEPTH_TEST); // Hidden surface removal
glEnable(GL_COLOR_MATERIAL);
// 光源设置
GLfloat ambientLight[] = { 0.2f, 0.2f, 0.2f, 1.0f };
GLfloat diffuseLight[] = { 0.6f, 0.6f, 0.6f, 1.0f };
GLfloat specular[] = { 1.0f, 1.0f, 1.0f, 1.0f};
GLfloat lightPos[] = { 1.0f, 1.0f, -1.0f, 0.0f };
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0,GL_AMBIENT,ambientLight);
glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight);
glLightfv(GL_LIGHT0,GL_SPECULAR,specular);
glLightfv(GL_LIGHT0,GL_POSITION,lightPos);
glEnable(GL_LIGHT0);
//材料设置
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
glMaterialfv(GL_FRONT, GL_SPECULAR,specular);
glMateriali(GL_FRONT,GL_SHININESS,100);
//背景颜色设置
glClearColor(0.0f, 1.0f, 1.0f, 1.0f ); //background color
// 默认的前景色设置
glColor3ub(255, 0, 255);
}
void CGLView::RenderScene()
{
//加入用户自己的绘制程序
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glColor3ub(255, 0, 255);
glTranslated(0.0, -1.0, 0.0);
glutSolidTeapot(1.0f);//用辅助库函数画茶壶
glTranslated(0.0, 2.0, 0.0);
glColor3ub(255, 255, 0);
// glutSolidSphere(0.5f, 25, 25);//绘制球
glPopMatrix();
glFlush();
}
void CGLView::OnTimer(UINT nIDEvent)
{
Invalidate(FALSE);
CView::OnTimer(nIDEvent);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -