📄 easymapview.cpp
字号:
void CEasyMapView::Dispatch(CPoint curPt)
{
int oldDrawMode;
switch( m_Operation )
{
case CMD_ZOOMIN_WINDOW:
{
CPen penDrag( PS_DOT , 1 , RGB(0,0,0) );
CDC *pDC = GetDC();
CPen* pOldPen = (CPen*)pDC->SelectObject( &penDrag );
oldDrawMode = pDC->SetROP2(R2_XORPEN); //设置绘制模式
if ( m_isDownMouse == 1 )
{
pDC->MoveTo(m_StartPt);
pDC->LineTo(m_StartPt.x , m_SecondPt.y);
pDC->LineTo(m_SecondPt.x , m_SecondPt.y);
pDC->LineTo(m_SecondPt.x , m_StartPt.y);
pDC->LineTo(m_StartPt.x , m_StartPt.y);
pDC->MoveTo(m_StartPt);
pDC->LineTo(m_StartPt.x,curPt.y);
pDC->LineTo(curPt.x,curPt.y);
pDC->LineTo(curPt.x,m_StartPt.y);
pDC->LineTo(m_StartPt.x , m_StartPt.y);
}
if ( m_isDownMouse == 2 )
{
pDC->MoveTo(m_StartPt);
pDC->LineTo(m_StartPt.x , m_SecondPt.y);
pDC->LineTo(m_SecondPt.x , m_SecondPt.y);
pDC->LineTo(m_SecondPt.x , m_StartPt.y);
pDC->LineTo(m_StartPt.x , m_StartPt.y);
}
m_SecondPt = curPt;
pDC->SelectObject( pOldPen );
pDC->SetROP2(oldDrawMode);
}
break;
default:
break;
}
}
BOOL CEasyMapView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
/*CRect rc;
CBrush br(RGB(0,0,0));
CBrush *pOldbr = pDC->SelectObject(&br);
pDC->GetClipBox(&rc);
pDC->PatBlt(rc.left,rc.top,rc.Width(),rc.Height(),PATCOPY);
pDC->SelectObject(pOldbr);
return TRUE;*/
return CView::OnEraseBkgnd(pDC);
}
void CEasyMapView::OnInitialUpdate()
{
CRect rc;
CView::OnInitialUpdate();
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;
// TODO: Add your specialized code here and/or call the base class
}
void CEasyMapView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
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;
}
Invalidate(TRUE);
}
//显示坐标
void CEasyMapView::ShowCoordinate( CMapPoint& pt)
{
int iDU,iFEN,iMIAO;
double dblX,dblY;
char szPrompt[100];
CMapRectangle mapExtent;
CMainFrame *pframe;
CEasyMapDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//获得当前地图最大矩形范围
pDoc->m_MapLayers.GetAllExtent(mapExtent);
//在地图范围内
if ( mapExtent.IsPointIn(pt) )
{
pframe =(CMainFrame*)AfxGetMainWnd();
if ( pframe == NULL )
return;
memset(szPrompt , 0 , 100 );
dblX = pt.GetX();
iDU = (int)dblX;
dblX = (dblX-iDU)*60;
iFEN = (int)dblX;
dblX = (dblX-iFEN)*60;
iMIAO = (int)dblX;
sprintf(szPrompt,"东经:%d度%d分%d秒",iDU,iFEN,iMIAO);
pframe->m_wndStatusBar.SetPaneText(1,szPrompt,true);
memset(szPrompt , 0 , 100 );
dblY = pt.GetY();
iDU = (int)dblY;
dblY = (dblY - iDU)*60;
iFEN = (int)dblY;
dblY = (dblY-iFEN)*60;
iMIAO = (int)dblY;
sprintf(szPrompt,"北纬:%d度%d分%d秒",iDU,iFEN,iMIAO);
pframe->m_wndStatusBar.SetPaneText(2,szPrompt,true);
}
}
void CEasyMapView::ZoomInWindows()
{
double dblX,dblY,dblXScale,dblYScale;
CMapPoint ptFirst,ptSecond;
dblX = m_DrawParam.m_StartX + m_StartPt.x*m_DrawParam.m_Scale;
dblY = m_DrawParam.m_StartY - m_StartPt.y*m_DrawParam.m_Scale;
ptFirst.SetX(dblX);
ptFirst.SetY(dblY);
dblX = m_DrawParam.m_StartX + m_SecondPt.x *m_DrawParam.m_Scale;
dblY = m_DrawParam.m_StartY - m_SecondPt.y*m_DrawParam.m_Scale;
ptSecond.SetX(dblX);
ptSecond.SetY(dblY);
dblXScale = fabs(ptSecond.GetX() - ptFirst.GetX())/m_DrawParam.m_ScreenWidth;
dblYScale = fabs(ptSecond.GetY() - ptFirst.GetY())/m_DrawParam.m_ScreenHeigh;
if ( dblXScale < dblYScale )
m_DrawParam.m_Scale = (float)dblXScale;
else
m_DrawParam.m_Scale = (float)dblYScale;
m_DrawParam.m_StartX = min( ptFirst.GetX(),ptSecond.GetX());
m_DrawParam.m_StartY = max( ptFirst.GetY(),ptSecond.GetY());
Invalidate(TRUE);
}
void CEasyMapView::ZoomIn()
{
double dblX,dblY;
CMapPoint pt,ptCenter;
//移动鼠标点击点到屏幕中心
dblX = (m_StartPt.x - m_DrawParam.m_ScreenWidth /2)*m_DrawParam.m_Scale;
dblY = (m_StartPt.y - m_DrawParam.m_ScreenHeigh/2) *m_DrawParam.m_Scale;
m_DrawParam.m_StartX += dblX;
m_DrawParam.m_StartY -= dblY;
//计算放大窗口屏幕坐标
m_StartPt.x = m_DrawParam.m_ScreenWidth/2 - m_DrawParam.m_ScreenWidth /(2*m_FixedScale);
m_StartPt.y = m_DrawParam.m_ScreenHeigh/2 - m_DrawParam.m_ScreenHeigh/(2*m_FixedScale);
m_SecondPt.x = m_DrawParam.m_ScreenWidth/2 + m_DrawParam.m_ScreenWidth /(2*m_FixedScale);
m_SecondPt.y = m_DrawParam.m_ScreenHeigh/2 + m_DrawParam.m_ScreenHeigh/(2*m_FixedScale);
ZoomInWindows();
}
void CEasyMapView::ZoomOut()
{
double dblX,dblY,dblXScale,dblYScale;
CMapPoint pt,ptCenter;
CMapPoint ptFirst,ptSecond;
CMapRectangle mapExtent;
CEasyMapDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//获得当前地图最大矩形范围
pDoc->m_MapLayers.GetAllExtent(mapExtent);
dblXScale = m_DrawParam.m_Scale + (mapExtent.GetWidth()/m_FixedScale)/m_DrawParam.m_ScreenWidth;
dblYScale = m_DrawParam.m_Scale + (mapExtent.GetHeigh()/m_FixedScale)/m_DrawParam.m_ScreenHeigh;
if ( dblXScale < dblYScale )
{
m_DrawParam.m_StartX -=(dblXScale - m_DrawParam.m_Scale)*m_DrawParam.m_ScreenWidth/2;
m_DrawParam.m_StartY += (dblXScale - m_DrawParam.m_Scale)*m_DrawParam.m_ScreenHeigh/2;
m_DrawParam.m_Scale = (float)dblXScale;
}
else
{
m_DrawParam.m_StartX -=(dblYScale - m_DrawParam.m_Scale)*m_DrawParam.m_ScreenWidth/2;
m_DrawParam.m_StartY += (dblYScale - m_DrawParam.m_Scale)*m_DrawParam.m_ScreenHeigh/2;
m_DrawParam.m_Scale = (float)dblYScale;
}
//移动鼠标点击点到屏幕中心
dblX = (m_StartPt.x - m_DrawParam.m_ScreenWidth /2)*m_DrawParam.m_Scale;
dblY = (m_StartPt.y - m_DrawParam.m_ScreenHeigh/2) *m_DrawParam.m_Scale;
m_DrawParam.m_StartX += dblX;
m_DrawParam.m_StartY -= dblY;
Invalidate(TRUE);
Invalidate(TRUE);
}
void CEasyMapView::Pan()
{
double dblX,dblY;
CMapPoint ptFirst,ptSecond;
CRect rc;
dblX = m_DrawParam.m_StartX + m_StartPt.x*m_DrawParam.m_Scale;
dblY = m_DrawParam.m_StartY - m_StartPt.y*m_DrawParam.m_Scale;
ptFirst.SetX(dblX);
ptFirst.SetY(dblY);
dblX = m_DrawParam.m_StartX + m_SecondPt.x *m_DrawParam.m_Scale;
dblY = m_DrawParam.m_StartY - m_SecondPt.y*m_DrawParam.m_Scale;
ptSecond.SetX(dblX);
ptSecond.SetY(dblY);
m_DrawParam.m_StartX -= ptSecond.GetX() - ptFirst.GetX();
m_DrawParam.m_StartY -= ptSecond.GetY() - ptFirst.GetY();
rc.left = (long)min(ptSecond.GetX(),ptFirst.GetX());
rc.right = (long)max(ptSecond.GetX(),ptFirst.GetX());
rc.top = (long)min(ptSecond.GetY(),ptFirst.GetY());
rc.bottom = (long)max(ptSecond.GetY(),ptFirst.GetY());
Invalidate(FALSE);
}
void CEasyMapView::OnMapPtsymbol()
{
CDlgPtSymbolSet dlgSet;
char szValue[256];
char szFile[256];
GetAppPath(szFile);
strcat(szFile , "\\System.ini");
::GetPrivateProfileString("SYMBOL","INDEX","35",szValue,255,szFile);
dlgSet.uiIndex = (unsigned short)atoi(szValue);
if ( dlgSet.DoModal() == IDOK )
{
sprintf(szValue,"%d",dlgSet.uiIndex);
::WritePrivateProfileString("SYMBOL","POINTINDEX", szValue , szValue);
}
}
void CEasyMapView::GetAppPath( char *szPath )
{
// 函数功能:获得应用程序路径
int i,len;
char szVal[256];
::GetModuleFileName(NULL,szVal,255);
len = strlen(szVal)-1;
for ( i = len ; i > 0 ; i-- )
if (szVal[i] == '\\' )
break;
szVal[i] = '\0';
len = strlen(szVal);
szVal[len] = '\0';
strcpy(szPath,szVal);
};
int CEasyMapView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
CPoint point(100,100);
m_MapTip.Create(this->GetParent() ,point); //创建鼠标提示窗口
m_MapTip.ShowWindow(SW_HIDE);//隐藏鼠标提示窗口
return 0;
}
BOOL CEasyMapView::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
//m_MapTip.RelayEvent(pMsg);
return CView::PreTranslateMessage(pMsg);
}
void CEasyMapView::OnMapSrhpt()
{
m_Operation = CMD_SRHPT;
}
void CEasyMapView::PtSelected(CPoint& pt)
{
short i;
int iIndex;
double dblX,dblY;
CMapPoint MapPt;
CMapLayer *pLayer;
CEasyMapDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CDC *pDC = GetDC();
dblX = m_DrawParam.m_StartX + pt.x*m_DrawParam.m_Scale;
dblY = m_DrawParam.m_StartY - pt.y*m_DrawParam.m_Scale;
MapPt.SetX(dblX);
MapPt.SetY(dblY);
for ( i = 0 ; i < pDoc->m_MapLayers.GetCount() ; i++ )
{
pLayer = (CMapLayer*)pDoc->m_MapLayers.GetAt(i);
iIndex = pLayer->SearchShape(MapPt);
if ( iIndex > 0 )
{
pLayer->FlashShp(pDC,m_DrawParam,iIndex);
break;
}
}
}
void CEasyMapView::InitScale()
{
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;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -