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