www.pudn.com > MyVirtualCruise.rar > VirtualCruise_XiaoFangbingView.cpp
// VirtualCruise_XiaoFangbingView.cpp : implementation of the CVirtualCruise_XiaoFangbingView class
//
#include "stdafx.h"
#include "VirtualCruise_XiaoFangbing.h"
#include "VirtualCruise_XiaoFangbingDoc.h"
#include "VirtualCruise_XiaoFangbingView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define TEXTURE_COUNT 1
#define DIMAO 0
GLuint textures[TEXTURE_COUNT];
char *szTextureFiles[TEXTURE_COUNT] = { "Dimao.bmp"};
GLuint texture[1];
AUX_RGBImageRec * LoadBMP(char *Filename)//载入位图
{
FILE *File = NULL;
if (!Filename)
{
return NULL;
}
File=fopen(Filename,"rb");
if (File)
{
fclose(File);
return auxDIBImageLoad(Filename);
}
return NULL;
}
GLfloat light0Ambient[] = {0.1f, 0.1f, 0.1f, 1.0f};
GLfloat light0Diffuse[] = {0.5f, 0.5f, 0.5f, 1.0f};
GLfloat light0Position[] = {0.0f, 0.0f, 0.0f, 1.0f};
/////////////////////////////////////////////////////////////////////////////
// CVirtualCruise_XiaoFangbingView
IMPLEMENT_DYNCREATE(CVirtualCruise_XiaoFangbingView, CView)
BEGIN_MESSAGE_MAP(CVirtualCruise_XiaoFangbingView, CView)
//{{AFX_MSG_MAP(CVirtualCruise_XiaoFangbingView)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_ERASEBKGND()
ON_WM_SIZE()
ON_WM_KEYDOWN()
ON_COMMAND(ID_WIRE_MAP, OnWireMap)
ON_COMMAND(ID_ENTITY_MAP, OnEntityMap)
ON_COMMAND(ID_TEXTURE_SWITCH, OnTextureSwitch)
ON_COMMAND(ID_LIGHT_SWITCH, OnLightSwitch)
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
ON_COMMAND(ID_MENU_KEYDESCRIBE, OnMenuKeydescribe)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CVirtualCruise_XiaoFangbingView construction/destruction
CVirtualCruise_XiaoFangbingView::CVirtualCruise_XiaoFangbingView()
{
// TODO: add construction code here
dx=0;
dy=0;
dz=0;
m_bWireFlag=FALSE;
m_bTextureFlag=TRUE;
m_bLightFlag=FALSE;//初始光照关
m_strName="ZhuJiaJIanDaoT.dat";//文件名初始化为空
m_iReadFile=0;
}
CVirtualCruise_XiaoFangbingView::~CVirtualCruise_XiaoFangbingView()
{
}
BOOL CVirtualCruise_XiaoFangbingView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
//防止在窗口重叠时把图形绘制到子窗口和兄弟窗口
cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CVirtualCruise_XiaoFangbingView drawing
void CVirtualCruise_XiaoFangbingView::OnDraw(CDC* pDC)
{
CVirtualCruise_XiaoFangbingDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
DrawOpenGLScene();
//使用双缓存
// SwapBuffers(dc.m_ps.hdc);
::SwapBuffers(wglGetCurrentDC());
}
/////////////////////////////////////////////////////////////////////////////
// CVirtualCruise_XiaoFangbingView diagnostics
#ifdef _DEBUG
void CVirtualCruise_XiaoFangbingView::AssertValid() const
{
CView::AssertValid();
}
void CVirtualCruise_XiaoFangbingView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CVirtualCruise_XiaoFangbingDoc* CVirtualCruise_XiaoFangbingView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CVirtualCruise_XiaoFangbingDoc)));
return (CVirtualCruise_XiaoFangbingDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CVirtualCruise_XiaoFangbingView message handlers
int CVirtualCruise_XiaoFangbingView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
m_hRC=SetupOpenGL();//设置OpenGL初始运行模式
InitGL();
return 0;
}
void CVirtualCruise_XiaoFangbingView::OnDestroy()
{
CView::OnDestroy();
// TODO: Add your message handler code here
//删除当前的RC
::wglMakeCurrent(NULL,NULL);//设置当前线程的rc
if (m_hRC)
{
wglDeleteContext(m_hRC);
}
//删除DC
if (m_pDC)
delete m_pDC;
}
BOOL CVirtualCruise_XiaoFangbingView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
return TRUE;
// return CView::OnEraseBkgnd(pDC);
}
void CVirtualCruise_XiaoFangbingView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
ReSizeGLScene(cx,cy);
Invalidate(TRUE);
}
HGLRC CVirtualCruise_XiaoFangbingView::SetupOpenGL()
{
HGLRC hglRC;
static PIXELFORMATDESCRIPTOR pfd=
{
sizeof(PIXELFORMATDESCRIPTOR),//象素格式的大小
1,//版本
PFD_DRAW_TO_WINDOW|//使之能在窗口或其他设备中画图
PFD_SUPPORT_OPENGL|//使之能调用OpenGL函数
PFD_DOUBLEBUFFER,//使用双缓存
PFD_TYPE_RGBA,//采用RGBA模式
24,//24位颜色深度
0,0,0,//颜色位可以忽略
0,0,0,//颜色位可以忽略
0,//无Alpha抖动
0,//无颜色抖动
0,//没有累积缓存
0,0,0,0,//累积缓存位数可以忽略
32,//32位深度缓存
0,//深度缓存位数
0,//辅助缓存
PFD_MAIN_PLANE,//主层类型
0,//保留
0,0,0//相关掩码在此不设置
};
m_pDC = new CClientDC(this);
ASSERT(m_pDC != NULL);
//使Windows设备描述表找到相应的象素格式
int pixelFormat=ChoosePixelFormat(m_pDC->GetSafeHdc(),&pfd);//返回象素格式的索引号
if (pixelFormat==0)
{
MessageBox("ChoosePixelFormat failed");
return FALSE;
}
//设置象素格式
BOOL bSetPix=SetPixelFormat(m_pDC->GetSafeHdc(),pixelFormat,&pfd);
if (bSetPix==FALSE)
{
MessageBox("SetPixelFormat failed");
return FALSE;
}
//创建着色描述表,根据DC来创建RC(RC与指定的设备相符)
hglRC=::wglCreateContext(m_pDC->GetSafeHdc());
//着色描述表激活,以后的绘图工作都在这个rc上进行
::wglMakeCurrent(m_pDC->GetSafeHdc(),hglRC);
return hglRC;
}
int CVirtualCruise_XiaoFangbingView::InitGL()
{
glLightfv(GL_LIGHT0, GL_AMBIENT, light0Ambient);
glLightfv(GL_LIGHT0,GL_POSITION,light0Position);
glLightfv(GL_LIGHT0,GL_DIFFUSE,light0Diffuse);
glLightfv(GL_LIGHT0,GL_SPECULAR,light0Diffuse);
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE);
glEnable(GL_LIGHTING);
AUX_RGBImageRec *TextureImage[1];
//黑色背景
glClearColor(0.0f,0.0f,0.0f,1.0f);
//载入纹理
//按照贴图方式应用纹理,不使用光照或颜色效果
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
//载入纹理
glGenTextures(TEXTURE_COUNT,texture);
if (TextureImage[0] = LoadBMP(szTextureFiles[0]))
{
//绑定纹理对象
glBindTexture(GL_TEXTURE_2D,texture[0]);
//载入纹理,设置过滤器和环绕模式
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
}
if (TextureImage[0]) // If Texture Exists
{
if (TextureImage[0]->data) // If Texture Image Exists
{
free(TextureImage[0]->data); // Free The Texture Image Memory
}
free(TextureImage[0]); // Free The Image Structure
}
return TRUE;
}
void CVirtualCruise_XiaoFangbingView::ReSizeGLScene(int width, int height)
{
GLfloat fAspect;
if (width==0|| height==0)//防止被零除
return;
fAspect=(GLfloat)width/(GLfloat)height;
glViewport(0,0,width,height);//将视口设为整个窗口的大小
//重置坐标系统
glMatrixMode(GL_PROJECTION);//选择投影矩阵
glLoadIdentity();//重置投影矩阵
// gluPerspective(35.0f,fAspect,0.1f,100.0f);//选择视裁剪体
gluPerspective(150, fAspect, 2, 70000 );
glMatrixMode(GL_MODELVIEW);//选择模型观察矩阵
glLoadIdentity();//重置模型观察矩阵
}
void CVirtualCruise_XiaoFangbingView::DrawOpenGLScene()
{
glClear(GL_COLOR_BUFFER_BIT| //清除屏幕缓存
GL_DEPTH_BUFFER_BIT);//清除深度缓存
glLoadIdentity();
gluLookAt(dx-700, dy+500, 71000+dz, 0, dy+5,0, 0, 1, 0);
glBindTexture(GL_TEXTURE_2D,texture[DIMAO]);
if (m_bLightFlag==FALSE)
{
glDisable(GL_LIGHTING);
glDisable(GL_LIGHT0);
}
else
{
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
}
if(m_bTextureFlag==TRUE)
glEnable(GL_TEXTURE_2D);
else
glDisable(GL_TEXTURE_2D);
if(m_bWireFlag)
glBegin(GL_LINE_STRIP);
else
glBegin(GL_TRIANGLES);
glColor3ub(0,200,0);
int ret;
if (m_iReadFile==0)
{
m_iReadFile=1;//读了"ZhuJiaJIanDaoT.dat"
ret=m_Data.ReadData(m_strName);
}
if (m_iReadFile==2)
{
m_iReadFile=3;//读了"TaoHuaDaoT.dat"
ret=m_Data.ReadData(m_strName);
}
if (m_iReadFile==4)
{
m_iReadFile=5;//读了XiaZhiDaoT.dat
ret=m_Data.ReadData(m_strName);
}
if (ret)
{
for (int i=0; iCreate(IDD_EXPLAIN_DLG);
m_pExplainDlg->ShowWindow(SW_RESTORE);
}