⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 glview.cpp

📁 TEA 茶茶茶 TEA 茶茶茶 TEA 茶茶茶 TEA 茶茶茶 TEA 茶茶茶 TEA 茶茶茶
💻 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 + -