?? simplemapview.cpp
字號(hào):
// SimpleMapView.cpp : implementation of the CSimpleMapView class
//
#include "stdafx.h"
#include "SimpleMap.h"
#include "SimpleMapDoc.h"
#include "SimpleMapView.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSimpleMapView
IMPLEMENT_DYNCREATE(CSimpleMapView, CView)
BEGIN_MESSAGE_MAP(CSimpleMapView, CView)
//{{AFX_MSG_MAP(CSimpleMapView)
ON_WM_SIZE()
ON_COMMAND(ID_MAP_NOTHING, OnMapNothing)
ON_COMMAND(ID_MAP_ZOOM_IN, OnMapZoomIn)
ON_COMMAND(ID_MAP_ZOOM_OUT, OnMapZoomOut)
ON_COMMAND(ID_MAP_ZOOM_ALL, OnMapZoomAll)
ON_COMMAND(ID_MAP_PAN, OnMapPan)
ON_COMMAND(ID_MAP_ZOOM_WINDOW, OnMapZoomWindow)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_UPDATE_COMMAND_UI(ID_MAP_NOTHING, OnUpdateMapNothing)
ON_UPDATE_COMMAND_UI(ID_MAP_PAN, OnUpdateMapPan)
ON_UPDATE_COMMAND_UI(ID_MAP_ZOOM_IN, OnUpdateMapZoomIn)
ON_UPDATE_COMMAND_UI(ID_MAP_ZOOM_OUT, OnUpdateMapZoomOut)
ON_UPDATE_COMMAND_UI(ID_MAP_ZOOM_WINDOW, OnUpdateMapZoomWindow)
ON_COMMAND(ID_MAP_SRHPT, OnMapSrhpt)
ON_UPDATE_COMMAND_UI(ID_MAP_SRHPT, OnUpdateMapSrhpt)
ON_COMMAND(ID_LAYER_MANAGE, OnLayerManage)
ON_COMMAND(ID_MAP_COORD, OnMapCoord)
ON_UPDATE_COMMAND_UI(ID_MAP_COORD, OnUpdateMapCoord)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSimpleMapView construction/destruction
CSimpleMapView::CSimpleMapView()
{
m_Operation = CMD_NOTHING;
m_isDownMouse = 0;
m_StartPt.x = 0 ;
m_StartPt.y = 0 ;
m_SecondPt.x = 0;
m_SecondPt.y = 0;
}
CSimpleMapView::~CSimpleMapView()
{
}
BOOL CSimpleMapView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CSimpleMapView drawing
void CSimpleMapView::OnDraw(CDC* pDC)
{
CSimpleMapDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CMapLayer *pLayer;
CRect rc;
CBitmap bmp;
CDC dcMemory;
//BeginWaitCursor();
GetClientRect(rc);
//dcMemory.CreateCompatibleDC(pDC);
//bmp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());
//dcMemory.SelectObject(&bmp);
short iCount = pDoc->m_MapLayers.GetCount();
for ( short i = 0 ; i < iCount ; i++ )
{
pLayer = pDoc->m_MapLayers.GetAt(i);
pLayer->DrawLayer(pDC , m_DrawParam );
}
//pDC->BitBlt(0,0,rc.Width(),rc.Height(),&dcMemory,0,0,SRCCOPY);
//dcMemory.DeleteDC();
//bmp.DeleteObject();
//pDC->SetMapMode(MM_TEXT); //設(shè)置映射模式
//EndWaitCursor();
}
/////////////////////////////////////////////////////////////////////////////
// CSimpleMapView diagnostics
#ifdef _DEBUG
void CSimpleMapView::AssertValid() const
{
CView::AssertValid();
}
void CSimpleMapView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CSimpleMapDoc* CSimpleMapView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CSimpleMapDoc)));
return (CSimpleMapDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CSimpleMapView message handlers
void CSimpleMapView::InitScale()
{
float fxScale,fyScale;
double dbTmp;
CRect rc;
CMapRectangle mapExtent;
CSimpleMapDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//獲得當(dāng)前地圖最大矩形范圍
pDoc->m_MapLayers.GetAllExtent(mapExtent);
//獲得視圖客戶區(qū)矩形范圍
GetClientRect(&rc);
m_DrawParam.m_ScreenWidth = abs(rc.right - rc.left);
m_DrawParam.m_ScreenHeigh = abs(rc.bottom - rc.top);
//計(jì)算橫向比例系數(shù)
fxScale = (float)(fabs(mapExtent.GetRight()-mapExtent.GetLeft())/
m_DrawParam.m_ScreenWidth);
//計(jì)算縱向比例系數(shù)
fyScale = (float)(fabs(mapExtent.GetBottom() -mapExtent.GetTop() )/
m_DrawParam.m_ScreenHeigh);
//選擇較大的做比例尺
if ( fxScale > fyScale)
{
m_DrawParam.m_Scale = fxScale;
m_DrawParam.m_StartX = mapExtent.GetLeft();
dbTmp = fabs(mapExtent.GetBottom() -mapExtent.GetTop());
dbTmp =fxScale*m_DrawParam.m_ScreenHeigh - dbTmp;
m_DrawParam.m_StartY = mapExtent.GetBottom() - dbTmp / 2;
}
else
{
m_DrawParam.m_Scale = fyScale;
m_DrawParam.m_StartY = mapExtent.GetBottom();
dbTmp = fabs(mapExtent.GetRight() -mapExtent.GetLeft());
dbTmp = fyScale*m_DrawParam.m_ScreenWidth - dbTmp;
m_DrawParam.m_StartX = mapExtent.GetLeft() - dbTmp / 2;
}
Invalidate(TRUE);
}
void CSimpleMapView::OnInitialUpdate()
{
CView::OnInitialUpdate();
CRect rc;
GetClientRect(&rc);
m_DrawParam.m_Scale = 1;
m_DrawParam.m_StartX = 10;
m_DrawParam.m_StartY = 10;
m_DrawParam.m_ScreenWidth = abs(rc.right - rc.left);
m_DrawParam.m_ScreenHeigh = abs(rc.bottom - rc.top );
m_FixedScale = 2;
}
void CSimpleMapView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
float fxScale,fyScale;
double dbTmp;
CRect rc;
CMapRectangle mapExtent;
CSimpleMapDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//獲得當(dāng)前地圖最大矩形范圍
pDoc->m_MapLayers.GetAllExtent(mapExtent);
//獲得視圖客戶區(qū)矩形范圍
GetClientRect(&rc);
m_DrawParam.m_ScreenWidth = abs(rc.right - rc.left);
m_DrawParam.m_ScreenHeigh = abs(rc.bottom - rc.top);
//計(jì)算橫向比例系數(shù)
fxScale = (float)(fabs(mapExtent.GetRight()-mapExtent.GetLeft())/
m_DrawParam.m_ScreenWidth);
//計(jì)算縱向比例系數(shù)
fyScale = (float)(fabs(mapExtent.GetBottom() -mapExtent.GetTop() )/
m_DrawParam.m_ScreenHeigh);
//選擇較大的做比例尺
if ( fxScale > fyScale)
{
m_DrawParam.m_Scale = fxScale;
m_DrawParam.m_StartX = mapExtent.GetLeft();
dbTmp = fabs(mapExtent.GetBottom() -mapExtent.GetTop());
dbTmp =fxScale*m_DrawParam.m_ScreenHeigh - dbTmp;
m_DrawParam.m_StartY = mapExtent.GetBottom() - dbTmp / 2;
}
else
{
m_DrawParam.m_Scale = fyScale;
m_DrawParam.m_StartY = mapExtent.GetBottom();
dbTmp = fabs(mapExtent.GetRight() -mapExtent.GetLeft());
dbTmp = fyScale*m_DrawParam.m_ScreenWidth - dbTmp;
m_DrawParam.m_StartX = mapExtent.GetLeft() - dbTmp / 2;
}
Invalidate(TRUE);
}
void CSimpleMapView::OnMapNothing()
{
m_Operation = 0;
}
void CSimpleMapView::OnMapZoomIn()
{
m_Operation = CMD_ZOOMIN;
}
void CSimpleMapView::OnMapZoomOut()
{
m_Operation = CMD_ZOOMOUT;
}
void CSimpleMapView::OnMapZoomAll()
{
float fxScale,fyScale;
double dbTmp;
CRect rc;
CMapRectangle mapExtent;
CSimpleMapDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//獲得當(dāng)前地圖最大矩形范圍
pDoc->m_MapLayers.GetAllExtent(mapExtent);
//獲得視圖客戶區(qū)矩形范圍
GetClientRect(&rc);
m_DrawParam.m_ScreenWidth = abs(rc.right - rc.left);
m_DrawParam.m_ScreenHeigh = abs(rc.bottom - rc.top);
//計(jì)算橫向比例系數(shù)
fxScale = (float)(fabs(mapExtent.GetRight()-mapExtent.GetLeft())/
m_DrawParam.m_ScreenWidth);
//計(jì)算縱向比例系數(shù)
fyScale = (float)(fabs(mapExtent.GetBottom() -mapExtent.GetTop() )/
m_DrawParam.m_ScreenHeigh);
//選擇較大的做比例尺
if ( fxScale > fyScale)
{
m_DrawParam.m_Scale = fxScale;
m_DrawParam.m_StartX = mapExtent.GetLeft();
dbTmp = fabs(mapExtent.GetBottom() -mapExtent.GetTop());
dbTmp =fxScale*m_DrawParam.m_ScreenHeigh - dbTmp;
m_DrawParam.m_StartY = mapExtent.GetBottom() - dbTmp / 2;
}
else
{
m_DrawParam.m_Scale = fyScale;
m_DrawParam.m_StartY = mapExtent.GetBottom();
dbTmp = fabs(mapExtent.GetRight() -mapExtent.GetLeft());
dbTmp = fyScale*m_DrawParam.m_ScreenWidth - dbTmp;
m_DrawParam.m_StartX = mapExtent.GetLeft() - dbTmp / 2;
}
pDoc->UpdateAllViews(NULL);
}
void CSimpleMapView::OnMapPan()
{
m_Operation = CMD_ZOOMPAN;
}
void CSimpleMapView::OnMapZoomWindow()
{
m_Operation = CMD_ZOOMIN_WINDOW;
}
void CSimpleMapView::OnLButtonDown(UINT nFlags, CPoint point)
{
CRect rc;
GetClientRect(&rc);
if ( m_Operation == CMD_ZOOMIN_WINDOW && rc.PtInRect(point))
{
m_StartPt = point;
m_SecondPt = point;
m_isDownMouse = 1;
//保證鼠標(biāo)移動(dòng)到窗體外也可以接收到鼠標(biāo)釋放時(shí)件
SetCapture();
Dispatch( point);
}
if ( m_Operation == CMD_ZOOMIN && rc.PtInRect(point))
{
//點(diǎn)擊放大
m_StartPt = point;
m_SecondPt = point;
ZoomIn();
}
if (m_Operation == CMD_ZOOMOUT && rc.PtInRect(point))
{
m_StartPt = point;
m_SecondPt = point;
m_isDownMouse = 1;
ZoomOut();
}
if (m_Operation == CMD_ZOOMPAN && rc.PtInRect(point))
{
m_StartPt = point;
m_SecondPt = point;
m_isDownMouse = 1;
//保證鼠標(biāo)移動(dòng)到窗體外也可以接收到鼠標(biāo)釋放時(shí)件
SetCapture();
}
if (m_Operation == CMD_SRHPT && rc.PtInRect(point))
{
PtSelected(point);
}
if(m_Operation == CMD_COORD && rc.PtInRect(point))
{
CMapPoint pt;
double dblX,dblY;
dblX = m_DrawParam.m_StartX + point.x*m_DrawParam.m_Scale;
dblY = m_DrawParam.m_StartY - point.y*m_DrawParam.m_Scale;
pt.SetX(dblX);
pt.SetY(dblY);
ShowCoordinate(pt);
}
CView::OnLButtonDown(nFlags, point);
}
void CSimpleMapView::OnLButtonUp(UINT nFlags, CPoint point)
{
if ( m_Operation == CMD_ZOOMIN_WINDOW )
{
if ( m_isDownMouse == 1 ) //一次有效的拖動(dòng)
{
m_isDownMouse = 2;
m_SecondPt = point;
ReleaseCapture();
Dispatch(point);
if ( m_StartPt.x != m_SecondPt.x || m_StartPt.y != m_SecondPt.y )
ZoomInWindows();
}
m_isDownMouse = 0;
}
else if ( m_Operation == CMD_ZOOMOUT )
{
if ( m_isDownMouse == 1 ) //一次有效的拖動(dòng)
{
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -