www.pudn.com > Map_OpenGL.rar > GLEnabledView.cpp


// GLEnabledView.cpp : 实现文件 
// 
 
#include "stdafx.h" 
#include "GLEnabledView.h" 
#include ".\glenabledview.h" 
 
 
// CGLEnabledView 
 
IMPLEMENT_DYNCREATE(CGLEnabledView, CView) 
 
CGLEnabledView::CGLEnabledView() 
{ 
} 
 
CGLEnabledView::~CGLEnabledView() 
{ 
} 
 
BEGIN_MESSAGE_MAP(CGLEnabledView, CView) 
	ON_WM_SIZE() 
	ON_WM_CREATE() 
	ON_WM_DESTROY() 
END_MESSAGE_MAP() 
 
 
// CGLEnabledView 绘图 
 
void CGLEnabledView::OnDraw(CDC* pDC) 
{ 
	CDocument* pDoc = GetDocument(); 
	// TODO: 在此添加绘制代码 
	static BOOL bBusy=FALSE; 
	if(bBusy) return; 
	bBusy=TRUE; 
 
	//获取设备描述表 
	wglMakeCurrent(m_pDC->GetSafeHdc(),m_hRC); 
	 
	glClearColor(0.0f,0.0f,0.0f,1.0f); 
	 
	//清除颜色缓冲区和深度缓冲区 
	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
 
	//设置各种属性 
	SetRC(); 
 
	//调用场景绘制函数 
	OnDrawGL(); 
 
	//完成图形绘制 
	glFinish(); 
 
	//启用双缓 
	SwapBuffers(m_pDC->GetSafeHdc()); 
 
	//绘制完毕,置标志为空闲 
	bBusy=FALSE; 
 
	//释放OPenGL绘制描述表 
	wglMakeCurrent(NULL,NULL); 
} 
 
 
// CGLEnabledView 诊断 
 
#ifdef _DEBUG 
void CGLEnabledView::AssertValid() const 
{ 
	CView::AssertValid(); 
} 
 
void CGLEnabledView::Dump(CDumpContext& dc) const 
{ 
	CView::Dump(dc); 
} 
#endif //_DEBUG 
 
 
// CGLEnabledView 消息处理程序 
 
 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
//												      画想要的openGL图形								     	   // 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 
void CGLEnabledView::OnDrawGL(void) 
{ 
 
} 
 
 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
//												      设置像素格式									     		   // 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 
bool CGLEnabledView::SetupPixelFormat(void) 
{ 
	PIXELFORMATDESCRIPTOR pfd={ 
		sizeof(PIXELFORMATDESCRIPTOR),	//pfd结构大小 
			1,							//版本号 
			PFD_DRAW_TO_WINDOW|			//支持在窗口中绘图 
			PFD_SUPPORT_OPENGL|			//支持openGL 
			PFD_DOUBLEBUFFER,			//双缓存模式 
			24,							//24位颜色深度 
			0,0,0,0,0,0,				//忽略颜色色位 
			0,							//没有非透明度缓存取 
			0,							//忽略移位位 
			0,							//无累加缓存 
			0,0,0,0,					//忽略累加位 
			32,							//32位深度缓存 
			0,							//无模板缓存 
			0,							//无辅助缓存 
			PFD_MAIN_PLANE,				//主层 
			0,							//保留 
			0,0,0						//忽略层,可见性和损毁掩模 
	}; 
 
	int pixelformat; 
	//选择像素格式 
	pixelformat=::ChoosePixelFormat(m_pDC->GetSafeHdc(),&pfd); 
 
	//设置像素格式 
	::SetPixelFormat(m_pDC->GetSafeHdc(),pixelformat,&pfd); 
 
	//设置逻辑调色板 
	if(pfd.dwFlags & PFD_NEED_PALETTE) 
	{ 
		SetLogicalPalette(); 
	} 
 
	return TRUE; 
} 
 
 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
//												      设置逻辑调色板											   // 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 
void CGLEnabledView::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); 
} 
 
 
 
 
 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
//													初始化openGL场景										       // 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 
bool CGLEnabledView::InitiaLizeOpenGL(CDC* pDC) 
{ 
	m_pDC=pDC; 
	SetupPixelFormat(); 
	 
	//生成绘制描述表 
	m_hRC=::wglCreateContext(m_pDC->GetSafeHdc()); 
 
	//设置当前绘制描述表 
	::wglMakeCurrent(m_pDC->GetSafeHdc(),m_hRC); 
 
	return TRUE; 
} 
 
 
 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
//																											       // 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 
 
void CGLEnabledView::OnSize(UINT nType, int cx, int cy) 
{ 
	CView::OnSize(nType, cx, cy); 
 
	if(0GetSafeHdc(),m_hRC); 
 
		//设置视口变换 
		glViewport(0,0,cx,cy); 
 
		//设置透视变换 
		glPushMatrix(); 
			glMatrixMode(GL_PROJECTION); 
				glLoadIdentity(); 
				gluPerspective(40.0,m_dAspectRatio,0.1f,40000.0f); 
				glTranslated(0.0f,0.0f,-5.0f); 
			glMatrixMode(GL_MODELVIEW); 
		glPopMatrix(); 
 
		//释放openGL描述表 
		wglMakeCurrent(NULL,NULL); 
 
		//更新窗口内容 
		Invalidate(TRUE); 
	} 
} 
 
 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
//																											       // 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 
int CGLEnabledView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{ 
	if (CView::OnCreate(lpCreateStruct) == -1) 
		return -1; 
 
	m_pDC=new CClientDC(this); 
 
	//初始化openGL 
	InitiaLizeOpenGL(m_pDC); 
 
	//释放openGL描述表 
	wglMakeCurrent(NULL,NULL); 
 
	SetTimer(1,10,NULL); 
 
	return 0; 
} 
 
 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
//																											       // 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 
void CGLEnabledView::OnDestroy() 
{ 
	//获得设备描述表的openGL绘制描述表 
	wglMakeCurrent(m_pDC->GetSafeHdc(),m_hRC); 
 
	//释放绘制描述表 
	if(m_hRC!=NULL) ::wglDeleteContext(m_hRC); 
 
	//释放调色板 
	if(m_hPalette) DeleteObject(m_hPalette); 
 
	//释放windows 设备描述表 
	if(m_pDC) delete m_pDC; 
 
 
	CView::OnDestroy(); 
} 
 
 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
//																											       // 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 
 
BOOL CGLEnabledView::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	//openGL的要求 
	cs.style|=WS_CLIPCHILDREN|WS_CLIPSIBLINGS; 
 
	//多文档应用程序的要求 
	cs.lpszClass=AfxRegisterWndClass(CS_OWNDC|CS_HREDRAW|CS_VREDRAW); 
 
	return CView::PreCreateWindow(cs); 
} 
 
void CGLEnabledView::SetRC(void) 
{ 
}