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