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