📄 easymapview.cpp
字号:
// EasyMapView.cpp : implementation of the CEasyMapView class
//
#include "stdafx.h"
#include "EasyMap.h"
#include "EasyMapDoc.h"
#include "EasyMapView.h"
#include "MapCommand.h"
#include "MapFields.h"
#include "MainFrm.h"
#include "Global.h"
#include "DlgPtSymbolSet.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CEasyMapView
IMPLEMENT_DYNCREATE(CEasyMapView, CView)
BEGIN_MESSAGE_MAP(CEasyMapView, CView)
//{{AFX_MSG_MAP(CEasyMapView)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
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_ZOOM_WINDOW, OnMapZoomWindow)
ON_COMMAND(ID_MAP_PAN, OnMapPan)
ON_WM_ERASEBKGND()
ON_WM_SIZE()
ON_COMMAND(ID_MAP_PTSYMBOL, OnMapPtsymbol)
ON_WM_CREATE()
ON_COMMAND(ID_MAP_SRHPT, OnMapSrhpt)
//}}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)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CEasyMapView construction/destruction
CEasyMapView::CEasyMapView()
{
// TODO: add construction code here
Initialize();
}
CEasyMapView::~CEasyMapView()
{
}
BOOL CEasyMapView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
cs.lpszClass = ::AfxRegisterWndClass(0,0,(HBRUSH)::GetStockObject(BLACK_BRUSH),0);
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CEasyMapView drawing
void CEasyMapView::OnDraw(CDC* pDC)
{
CEasyMapDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//CMainFrame *pFrame = (CMainFrame*)AfxGetMainWnd();
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(&dcMemory , m_DrawParam );
}
pDC->BitBlt(0,0,rc.Width(),rc.Height(),&dcMemory,0,0,SRCCOPY);
dcMemory.DeleteDC();
bmp.DeleteObject();
pDC->SetMapMode(MM_TEXT); //设置映射模式
EndWaitCursor();
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CEasyMapView printing
BOOL CEasyMapView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CEasyMapView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CEasyMapView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CEasyMapView diagnostics
#ifdef _DEBUG
void CEasyMapView::AssertValid() const
{
CView::AssertValid();
}
void CEasyMapView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CEasyMapDoc* CEasyMapView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CEasyMapDoc)));
return (CEasyMapDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CEasyMapView message handlers
void CEasyMapView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CRect rc;
GetClientRect(&rc);
if ( m_Operation == CMD_ZOOMIN_WINDOW && rc.PtInRect(point))
{
m_StartPt = point;
m_SecondPt = point;
m_isDownMouse = 1;
//保证鼠标移动到窗体外也可以接收到鼠标释放时件
SetCapture();
Dispatch( point);
}
if ( m_Operation == CMD_ZOOMIN && rc.PtInRect(point))
{
//点击放大
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;
//保证鼠标移动到窗体外也可以接收到鼠标释放时件
SetCapture();
}
if (m_Operation == CMD_SRHPT && rc.PtInRect(point))
{
PtSelected(point);
}
CView::OnLButtonDown(nFlags, point);
}
void CEasyMapView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if ( m_Operation == CMD_ZOOMIN_WINDOW )
{
if ( m_isDownMouse == 1 ) //一次有效的拖动
{
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 ) //一次有效的拖动
{
m_isDownMouse = 2;
ReleaseCapture();
Dispatch(point);
}
m_isDownMouse = 0;
}
else if ( m_Operation == CMD_ZOOMPAN )
{
if ( m_StartPt.x != point.x || m_StartPt.y == point.y )
{
m_SecondPt = point;
Pan();
}
m_isDownMouse = 0;
ReleaseCapture();
}
CView::OnLButtonUp(nFlags, point);
}
void CEasyMapView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
double dblX,dblY;
CMapPoint pt;
CPoint pScreen;
CString csStr;
CRect RC;
CEasyMapDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
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);
CMainFrame *pFrame = (CMainFrame*)AfxGetMainWnd();
if ( m_Operation == CMD_ZOOMIN_WINDOW )
{
::SetCursor(pFrame->m_hcurZInWindow);
if ( m_isDownMouse == 1 )
Dispatch( point);
}
else if ( m_Operation == CMD_ZOOMOUT )
{
::SetCursor(pFrame->m_hcurZOut);
}
else if ( m_Operation == CMD_ZOOMPAN )
{
::SetCursor(pFrame->m_hcurPan);
if ( m_isDownMouse == 1 )
{
if ( point.x != m_StartPt.x || point.y != m_StartPt.y )
{
m_SecondPt = point;
Pan();
m_StartPt = m_SecondPt;
}
}
}
else if ( m_Operation == CMD_ZOOMIN )
{
::SetCursor(pFrame->m_hcurZIn);
} else if ( m_Operation == CMD_SRHPT )
{
::SetCursor(pFrame->m_hcurFind);
}
else
{
::SetCursor(::LoadCursor(NULL,IDC_ARROW));
}
if (pFrame->m_bMapTip ) //鼠标动态提示
{
m_MapTip.InitMapTip(&(pDoc->m_MapLayers));
pScreen = point;
ClientToScreen(&pScreen);
m_MapTip.MoveTo( pt,pScreen);
}
if (pDoc->m_MapLayers.GetCount() > 0 )
ShowCoordinate(pt);
CView::OnMouseMove(nFlags, point);
}
void CEasyMapView::OnMapNothing()
{
m_Operation = 0;
::SetCursor(::LoadCursor(NULL,IDC_NO));
}
void CEasyMapView::OnMapZoomIn()
{
m_Operation = CMD_ZOOMIN;
}
void CEasyMapView::OnMapZoomOut()
{
m_Operation = CMD_ZOOMOUT;
}
void CEasyMapView::OnMapZoomAll()
{
float fxScale,fyScale;
double dbTmp;
CRect rc;
CMapRectangle mapExtent;
CEasyMapDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//获得当前地图最大矩形范围
pDoc->m_MapLayers.GetAllExtent(mapExtent);
//获得视图客户区矩形范围
GetClientRect(&rc);
m_DrawParam.m_ScreenWidth = abs(rc.right - rc.left);
m_DrawParam.m_ScreenHeigh = abs(rc.bottom - rc.top);
//计算横向比例系数
fxScale = (float)(fabs(mapExtent.GetRight()-mapExtent.GetLeft())/
m_DrawParam.m_ScreenWidth);
//计算纵向比例系数
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 CEasyMapView::OnMapZoomWindow()
{
m_Operation = CMD_ZOOMIN_WINDOW;
}
void CEasyMapView::OnMapPan()
{
m_Operation = CMD_ZOOMPAN;
}
void CEasyMapView::Initialize()
{
m_Operation = CMD_NOTHING;
m_isDownMouse = 0;
m_StartPt.x = 0 ;
m_StartPt.y = 0 ;
m_SecondPt.x = 0;
m_SecondPt.y = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -