www.pudn.com > 地表贴图.zip > GeoDrawView.cpp


// GeoDrawView.cpp : implementation of the CGeoDrawView class 
// 
 
#include "stdafx.h" 
#include "GeoDraw.h" 
#include "GeoDrawDoc.h" 
#include "GeoDrawView.h" 
#include ".\geodrawview.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
 
///////////////////////////////////////////////////////////////////////////// 
// CGeoDrawView 
 
IMPLEMENT_DYNCREATE(CGeoDrawView, CView) 
 
BEGIN_MESSAGE_MAP(CGeoDrawView, CView) 
	//{{AFX_MSG_MAP(CGeoDrawView) 
	ON_WM_CREATE() 
	ON_WM_DESTROY() 
	ON_WM_SIZE() 
	ON_COMMAND(ID_MODE_DATA, OnModeData)	 
	ON_COMMAND(ID_MODE_FACE, OnModeFace) 
	ON_COMMAND(ID_MODE_LINE, OnModeLine) 
	//}}AFX_MSG_MAP 
	// Standard printing commands 
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) 
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) 
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) 
	ON_COMMAND(ID_DOT, OnDot) 
	ON_COMMAND(ID_XVIEW, OnXview) 
	ON_COMMAND(ID_YVIEW, OnYview) 
	ON_COMMAND(ID_XADD, OnXadd) 
	ON_COMMAND(ID_YADD, OnYadd) 
	ON_COMMAND(ID_FRANCH, OnFranch) 
	ON_COMMAND(ID_BACKCOLOR, OnBackcolor) 
	ON_COMMAND(ID_MODE_LIGHT, OnModeLight) 
	ON_WM_ERASEBKGND() 
	ON_WM_KEYDOWN() 
	ON_COMMAND(ID_VIEW_TEXTURE, OnViewTexture) 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CGeoDrawView construction/destruction 
 
CGeoDrawView::CGeoDrawView() 
{ 
 
	m_hRC=NULL;  
	m_pDC=NULL; 
	x_view=535693; 
	y_view=4431000; 
	z_view=1000; 
	g_ViewMode=GL_Triangles; 
    m_bLight=true; 
	m_bTexture=true; 
 
} 
 
CGeoDrawView::~CGeoDrawView() 
{ 
} 
 
BOOL CGeoDrawView::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	// TODO: Modify the Window class or styles here by modifying 
	//  the CREATESTRUCT cs 
	cs.style|=WS_CLIPCHILDREN|WS_CLIPSIBLINGS; 
	return CView::PreCreateWindow(cs); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CGeoDrawView drawing 
 
void CGeoDrawView::OnDraw(CDC* pDC) 
{ 
	CGeoDrawDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
 
	GLReady(pDC);	 
	pDoc->m_readdsn.Draw(pDoc->m_pos,pDC,g_ViewMode);	  
	GLFinish(pDC);	 
 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CGeoDrawView printing 
 
BOOL CGeoDrawView::OnPreparePrinting(CPrintInfo* pInfo) 
{ 
	// default preparation 
	return DoPreparePrinting(pInfo); 
} 
 
void CGeoDrawView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add extra initialization before printing 
} 
 
void CGeoDrawView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add cleanup after printing 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CGeoDrawView diagnostics 
 
#ifdef _DEBUG 
void CGeoDrawView::AssertValid() const 
{ 
	CView::AssertValid(); 
} 
 
void CGeoDrawView::Dump(CDumpContext& dc) const 
{ 
	CView::Dump(dc); 
} 
 
CGeoDrawDoc* CGeoDrawView::GetDocument() // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGeoDrawDoc))); 
	return (CGeoDrawDoc*)m_pDocument; 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CGeoDrawView message handlers 
 
int CGeoDrawView::OnCreate(LPCREATESTRUCT lpCreateStruct)  
{ 
	if (CView::OnCreate(lpCreateStruct) == -1) 
		return -1; 
 
	CRect rect; 
	GetClientRect(&rect); 
	m_pDC=new CClientDC(this); 
	InitializeOpenGL(rect.right,rect.bottom);  
	//////////////////////////////////////// 
	GetDocument()->m_readdsn.InitDSN2("Data\\1.bmp");  
	//	GetDocument()->m_readdsn.InitDSN1("Data\\7#.txt");  
 
	////////////////////////////////////////////// 
	return 0; 
} 
 
void CGeoDrawView::OnDestroy()  
{ 
	CView::OnDestroy(); 
 
	DeInit(); 
} 
 
void CGeoDrawView::OnSize(UINT nType, int cx, int cy)  
{ 
	CView::OnSize(nType, cx, cy); 
 
	SizeOpenGLScreen(cx,cy);	 
 
} 
/****************************************************/ 
/***********bSetupPixelFormat***************/ 
/*******************************************/ 
bool CGeoDrawView::bSetupPixelFormat(HDC hdc)  
{  
	PIXELFORMATDESCRIPTOR pfd;  
	int pixelformat;  
 
	pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);			 
	pfd.nVersion = 1;								 
 
	pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;  
	pfd.dwLayerMask = PFD_MAIN_PLANE;			 
	pfd.iPixelType = PFD_TYPE_RGBA;				 
	pfd.cColorBits = 16;				 
	pfd.cDepthBits = 16;				 
	pfd.cAccumBits = 0;						 
	pfd.cStencilBits = 0;				 
 
	if ( (pixelformat = ChoosePixelFormat(hdc, &pfd)) == FALSE )  
	{  
 
		return FALSE;  
	}  
 
	if (SetPixelFormat(hdc, pixelformat, &pfd) == FALSE)  
	{  
 
		return FALSE;  
	}  
 
	return TRUE;							 
} 
 
void CGeoDrawView::SizeOpenGLScreen(int width, int height)		 
{ 
	if (height==0)										 
	{ 
		height=1;										 
	} 
	glViewport(0,0,width,height);						 
 
	glMatrixMode(GL_PROJECTION);		 
	glLoadIdentity();						 
	glOrtho(-3000,3000,-2000,2000, 0 ,1000.0); 
	glMatrixMode(GL_MODELVIEW);						 
	glLoadIdentity();		 
} 
 
 
void CGeoDrawView::GLReady(CDC* pDC) 
{ 
	wglMakeCurrent(m_pDC->m_hDC,m_hRC);		 
	m_Base.ClearBkground();		 
	gluLookAt(x_view,y_view,z_view,0,0,0,0,1,0); 
} 
 
void CGeoDrawView::GLFinish(CDC* pDC) 
{ 
	glFlush(); 
	SwapBuffers(pDC->m_hDC); 
} 
 
void CGeoDrawView::InitializeOpenGL(int width, int height)  
{   
 
 
	if (!bSetupPixelFormat(m_pDC->m_hDC))			 
		PostQuitMessage (0);					 
 
	m_hRC = wglCreateContext(m_pDC->m_hDC);			 
	wglMakeCurrent(m_pDC->m_hDC, m_hRC);	 
	m_Base.GLSetupRC(); 
 
	glEnable(GL_TEXTURE_2D);				 
	glEnable(GL_DEPTH_TEST);				 
 
} 
 
void CGeoDrawView::DeInit() 
{ 
	if (m_hRC)											 
	{ 
		wglMakeCurrent(NULL, NULL);						 
		wglDeleteContext(m_hRC);						 
	} 
 
} 
 
void CGeoDrawView::OnModeData()  
{ 
	static char BASED_CODE szFilter[] = "DLT文件 (*.dlt)|*.dlt|所有文件 (*.*)|*.*||"; 
	CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter); 
	if(dlg.DoModal() == IDOK) 
	{ 
		m_strFileName=dlg.GetPathName();	 
		GetDocument()->m_readdsn.InitDSN1(m_strFileName);   			 
		Invalidate(); 
	} 
} 
 
 
void CGeoDrawView::OnModeFace()  
{ 
 
	g_ViewMode=GL_TRIANGLE_STRIP;	   
	Invalidate(); 
 
} 
 
void CGeoDrawView::OnModeLine()  
{ 
 
	g_ViewMode=GL_LINE_STRIP; 
 
	Invalidate(); 
 
} 
 
void CGeoDrawView::OnDot() 
{	 
 
	g_ViewMode=GL_POINTS;	 
	Invalidate(); 
} 
 
 
void CGeoDrawView::OnXview() 
{ 
	if(x_view<50000000) 
		x_view+=500; 
	else  
		x_view=50000000; 
	Invalidate(); 
 
} 
 
void CGeoDrawView::OnYview() 
{ 
	if(y_view<50000000) 
		y_view+=500; 
	else  
		y_view=50000000; 
	Invalidate(); 
} 
 
void CGeoDrawView::OnXadd() 
{ 
	x_view-=500; 
	Invalidate(); 
} 
 
void CGeoDrawView::OnYadd() 
{ 
 
	y_view-=500; 
	Invalidate(); 
} 
 
void CGeoDrawView::OnFranch() 
{ 
	CFanceDlg dlg; 
	dlg.m_xmin=GetDocument()->m_readdsn.m_dsn.minPnt.x; 
	dlg.m_ymin=GetDocument()->m_readdsn.m_dsn.minPnt.y; 
	dlg.m_xmax=GetDocument()->m_readdsn.m_dsn.maxPnt.x; 
	dlg.m_ymax=GetDocument()->m_readdsn.m_dsn.maxPnt.y; 
	for(int i=0; im_readdsn.m_dsn.m_MaxTexs; i++) 
	{ 
		dlg.m_image=GetDocument()->m_readdsn.m_ppTexturelist[i]->fname; 
	} 
	if(dlg.DoModal() == IDOK) 
	{ 
		GetDocument()->m_readdsn.m_dsn.minPnt.x=dlg.m_xmin; 
		GetDocument()->m_readdsn.m_dsn.minPnt.y=dlg.m_ymin; 
		GetDocument()->m_readdsn.m_dsn.maxPnt.x=dlg.m_xmax; 
		GetDocument()->m_readdsn.m_dsn.maxPnt.y=dlg.m_ymax; 
		for(int i=0; im_readdsn.m_dsn.m_MaxTexs; i++) 
		{ 
	//		GetDocument()->m_readdsn.m_ppTexturelist[i]->fname=dlg.m_image; 
		} 
	} 
 
} 
 
void CGeoDrawView::OnBackcolor() 
{    
	COLORREF clr; 
	CColorDialog dlg; 
	if(dlg.DoModal()==IDOK) 
	{ 
		clr=dlg.GetColor(); 
		m_Base.SetBkColor(clr); 
		Invalidate(); 
	} 
} 
 
void CGeoDrawView::OnModeLight() 
{	 
	m_bLight=!m_bLight; 
	m_Base.Lighting(m_bLight); 
	Invalidate(); 
} 
 
BOOL CGeoDrawView::OnEraseBkgnd(CDC* pDC) 
{ 
	return false; 
//	return CView::OnEraseBkgnd(pDC); 
} 
 
void CGeoDrawView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{ 
	switch(nChar){ 
		case VK_RIGHT: 
			y_view+=500; 
			Invalidate(); 
			break; 
 
		case VK_LEFT: 
			y_view-=500; 
			Invalidate(); 
			break; 
 
		case VK_UP: 
			if(x_view<50000000) 
				x_view-=500; 
			else  
				x_view=50000000; 
			Invalidate(); 
			break; 
 
		case VK_DOWN: 
			if(x_view<50000000) 
				x_view+=500; 
			else  
				x_view=50000000; 
			Invalidate(); 
			break; 
	} 
	CView::OnKeyDown(nChar, nRepCnt, nFlags); 
} 
 
void CGeoDrawView::OnViewTexture() 
{ 
	if(m_bTexture){		 
		glEnable(GL_TEXTURE_2D); 
		m_bTexture=!m_bTexture; 
	} 
	else{ 
		glDisable(GL_TEXTURE_2D); 
		m_bTexture=!m_bTexture; 
	} 
	Invalidate(); 
}