www.pudn.com > MapXpro006.rar > MapXpro006View.cpp
// MapXpro006View.cpp : implementation of the CMapXpro006View class
//
#include "stdafx.h"
#include "MapXpro006.h"
#include "MapXpro006Doc.h"
#include "MapXpro006View.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMapXpro006View
//消息与事件映射说明区;
IMPLEMENT_DYNCREATE(CMapXpro006View, CView)
BEGIN_MESSAGE_MAP(CMapXpro006View, CView)
//{{AFX_MSG_MAP(CMapXpro006View)
ON_WM_CREATE()
ON_WM_SIZE()
ON_WM_SETFOCUS()
ON_COMMAND(IDC_USERDRAWLINE, OnUserdrawline)
ON_COMMAND(ID_SCALEMAP, OnScalemap)
ON_COMMAND(IDD_CLEARUSERLAYER, OnClearuserlayer)
ON_COMMAND(IDD_ZOOMINITEM, OnZoominitem)
ON_COMMAND(IDD_ZOOMOUTITEM, OnZoomoutitem)
//}}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()
//huhu22地图事件定义宏与地图消息定义对应;
BEGIN_EVENTSINK_MAP(CMapXpro006View, CView)
ON_EVENT(CMapXpro006View,IDC_MAP,MAPX_DISPID_DRAWUSERLAYER,
OnDrawUserLayer,VTS_DISPATCH VTS_I4 VTS_I4 VTS_DISPATCH VTS_DISPATCH)
//响应DrawUserLayer消息;
END_EVENTSINK_MAP()
//huhu22;
/////////////////////////////////////////////////////////////////////////////
// CMapXpro006View construction/destruction
//构造函数与析构函数,有关变量的初始化与释放区;
CMapXpro006View::CMapXpro006View()
{
// TODO: add construction code here
}
CMapXpro006View::~CMapXpro006View()
{
}
//视图的相关创建函数;
BOOL CMapXpro006View::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CMapXpro006View drawing
void CMapXpro006View::OnDraw(CDC* pDC)
{
CMapXpro006Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CMapXpro006View printing
//与视图样关的文档内容打印函数;
BOOL CMapXpro006View::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CMapXpro006View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CMapXpro006View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CMapXpro006View diagnostics
//获取文档的相关函数;
#ifdef _DEBUG
void CMapXpro006View::AssertValid() const
{
CView::AssertValid();
}
void CMapXpro006View::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CMapXpro006Doc* CMapXpro006View::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMapXpro006Doc)));
return (CMapXpro006Doc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMapXpro006View message handlers
//huhu04本工程基础初始化函数,是每个GIS程序都有的函数;
int CMapXpro006View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
//huhu05在视图中创建地图对象;
if (!m_ctrlMapX.Create(NULL,WS_VISIBLE,CRect(0,0,100,100),this,IDC_MAP))
{
return -1;
}
//huhu08取消标题;
m_ctrlMapX.SetTitleText("");
return 0;
}
void CMapXpro006View::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
//huhu06在视图文件中添加地图对象大小改变时的操作代码;
if (cx != 0 && cy != 0)
{
m_ctrlMapX.MoveWindow(0,0,cx,cy);
}
}
void CMapXpro006View::OnSetFocus(CWnd* pOldWnd)
{
CView::OnSetFocus(pOldWnd);
// TODO: Add your message handler code here
//huhu07在视图文件中添加地图对象获取焦点的代码;
m_ctrlMapX.SetFocus();
}
//huhu04;
//huhu1用户自定义图层点击后的响应函数;
//其操作是向当前地图中加一个新图层但其图层属性被指定为自定义图层;
//定义一个用户图层被点击过的变量标识;
BOOL USERLINEHASCLICKED = FALSE;
//定义一个当前点击是用户直线的标识;
BOOL USERLINECLICKED = FALSE;
extern BOOL SCALEMAPCLICKED;
void CMapXpro006View::OnUserdrawline()
{
// TODO: Add your command handler code here
//设置当前地图的比例;
m_ctrlMapX.SetZoom(3500);
//如果当前点击是第一次点击;
if (!USERLINEHASCLICKED)
{
//当前点击的用户直线命令是第一次;
USERLINEHASCLICKED = TRUE;
//指定DrawUserLayer响应用户直线的消息;
USERLINECLICKED = TRUE;
//huhu32指定DrawUserLayer不响应地图缩放的消息;
SCALEMAPCLICKED = FALSE;
try
{
//定义一个地图图层变量对象;
CMapXLayer lyruserdef;
//创建自定义图层并将其加入到当前地图同时指定其在图层集中的放置位置;
lyruserdef = m_ctrlMapX.GetLayers().AddUserDrawLayer("huhuuserdef",1);
//添加命令执行后将发出DrawUserLayer消息,为响应函数所接到并执行相应程序体代码;
}
//异常处理(OleDispatch与Ole);
catch (COleDispatchException *e)
{
e->ReportError();
e->Delete();
} catch (COleException *e)
{
e->ReportError();
e->Delete();
}
}
else
AfxMessageBox("当前命令已被点击过.");
}
//huhu2响应DrawUserLayer消息的程序体代码,也是一个函数;
//传入参数说明:Layer-地图图层的分发指针,hOutputDC-图形输出设备号,hAttributeDC-设备当前的状态;
//RectFull-全屏的分发指针,RectInvalid-有效矩形区的分发指针;
void CMapXpro006View::OnDrawUserLayer(LPDISPATCH Layer, long hOutputDC,
long hAttributeDC, LPDISPATCH RectFull,
LPDISPATCH RectInvalid)
{
//响应用户直线的消息;
if(USERLINECLICKED)
{
//在此图层中画一条线;
//将当前地图空间的属性由纸空间(hOutputDC所指向)转换成设备空间,
//并设置其向像素点是1/1440个打印点(MM_TWIPS的含义),相关可参见CGI编程;
SetMapMode((HDC)hOutputDC,MM_TWIPS);
//定义一个MFC点对象;
CPoint point;
//定义两个存储由地图坐标转成屏幕坐标的中间变量;
float pixfx,pixfy;
//定义两个整型变量,以表示屏幕上的像素点坐标;
int pixx,pixy;
//定义要画的线(在地图中)的起终点坐标;
double startx,endx,starty,endy;
//初始化线的起终点;
startx = m_ctrlMapX.GetCenterX();
starty = m_ctrlMapX.GetCenterY()+15;
endx = m_ctrlMapX.GetCenterX();
endy = m_ctrlMapX.GetCenterY()-15;
//检测当前线(按地图坐标)是否在当前视图可见区内;
if (m_ctrlMapX.ClipLine(&startx,&starty,&endx,&endy))
{
//如果在的话将地图坐标转成屏幕坐标进行画线;
m_ctrlMapX.ConvertCoord(&pixfx,&pixfy,&startx,&starty,miMapToScreen);
//开始画线,线的起点开始点绘;
pixx = (int)pixfx,pixy = (int)pixfy;
MoveToEx((HDC)hOutputDC,pixx,pixy,&point);
//设置线的终点;
m_ctrlMapX.ConvertCoord(&pixfx,&pixfy,&endx,&endy,miMapToScreen);
pixx = (int)pixfx,pixy = (int)pixfy;
LineTo((HDC)hOutputDC,pixx,pixy);
}
else
AfxMessageBox("其初始化线不在当前可看到的范围内.");
}
//huhu33响应地图缩放的消息;
else if (SCALEMAPCLICKED)
{
//获取当前视图的矩形区域;
CRect CurRect;
GetClientRect(&CurRect);
//定义比例尺的相关角点(===);
int StartX,StartY,SecondX,SecondY,ThirdX,ThirdY,EndX,EndY;
//初始化上述变量;
StartX = CurRect.Width()*16/48;
StartY = CurRect.Height()*48/300;
SecondX = CurRect.Width()*21/48;
SecondY = CurRect.Height()*48/300;
ThirdX = CurRect.Width()*27/48;
ThirdY = CurRect.Height()*48/300;
EndX = CurRect.Width()*32/48;
EndY = CurRect.Height()*48/300;
//指定区域的边界线属性(边框线为黑色);
SelectObject((HDC)hOutputDC,CreatePen(0,1,RGB(0,0,0)));
//定义区域的填充颜色变量;
LOGBRUSH m_logbrush;
//创建比例尺的三个分段;
//设置区域的颜色;
m_logbrush.lbStyle = BS_SOLID;
m_logbrush.lbColor = RGB(255,0,0);//红色;
SelectObject((HDC)hOutputDC,CreateBrushIndirect(&m_logbrush));
Rectangle((HDC)hOutputDC,StartX,StartY,SecondX,SecondY-5);//第一分段;
m_logbrush.lbStyle = BS_SOLID;
m_logbrush.lbColor = RGB(0,0,0);//黑色;
SelectObject((HDC)hOutputDC,CreateBrushIndirect(&m_logbrush));
Rectangle((HDC)hOutputDC,SecondX,SecondY,ThirdX,ThirdY-5);//第二分段;
m_logbrush.lbStyle = BS_SOLID;
m_logbrush.lbColor = RGB(255,0,0);//红色;
SelectObject((HDC)hOutputDC,CreateBrushIndirect(&m_logbrush));
Rectangle((HDC)hOutputDC,ThirdX,ThirdY,EndX,EndY-5); //第三分段;
//标注比例数字;
//定义两上用于地图转换的中间浮点型变量;
float InterimX,InterimY;
//定义两个地图上点的坐标的变量;
double MapX1,MapY1,MapX2,MapY2;
//定义比例尺分段的长度变量;
double distance = 0;
//定义存储比例值的字串;
CString valuescale;
//起点;
valuescale.Format("%ld",(long)distance);
TextOut((HDC)hOutputDC,StartX-5,StartY-25,valuescale,1);
//第二个角点;
//获取起点与第二点在地图上的坐标;
InterimX = (float)StartX;
InterimY = (float)StartY;
m_ctrlMapX.ConvertCoord(&InterimX,&InterimY,&MapX1,&MapY1,miScreenToMap);
InterimX = (float)SecondX;
InterimY = (float)SecondY;
m_ctrlMapX.ConvertCoord(&InterimX,&InterimY,&MapX2,&MapY2,miScreenToMap);
//获取两点的实际距离;
distance = m_ctrlMapX.Distance(MapX1,MapY1,MapX2,MapY2);
//标注第二角点;
valuescale.Format("%ld",(long)distance);
TextOut((HDC)hOutputDC,SecondX-5,SecondY-25,valuescale,valuescale.GetLength());
//第三个角点;
//获取起点与第三点在地图上的坐标;
InterimX = (float)ThirdX;
InterimY = (float)ThirdY;
m_ctrlMapX.ConvertCoord(&InterimX,&InterimY,&MapX2,&MapY2,miScreenToMap);
//获取两点的实际距离;
distance = m_ctrlMapX.Distance(MapX1,MapY1,MapX2,MapY2);
//标注第三角点;
valuescale.Format("%ld",(long)distance);
TextOut((HDC)hOutputDC,ThirdX-5,ThirdY-25,valuescale,valuescale.GetLength());
//终点;
//获取起点与终点在地图上的坐标;
InterimX = (float)EndX;
InterimY = (float)EndY;
m_ctrlMapX.ConvertCoord(&InterimX,&InterimY,&MapX2,&MapY2,miScreenToMap);
//获取两点的实际距离;
distance = m_ctrlMapX.Distance(MapX1,MapY1,MapX2,MapY2);
//标注终点;
valuescale.Format("%ld",(long)distance);
TextOut((HDC)hOutputDC,EndX-5,EndY-25,valuescale,valuescale.GetLength());
//标注单位;
valuescale = "miles";
TextOut((HDC)hOutputDC,EndX+50,EndY-25,valuescale,valuescale.GetLength());
}
}
//1.在屏幕左上方有一条短线即是当前函数的效果;
//(当地图放大或缩小时用户图层将将其上的所有特征删除并重新执行上述函数体);
//huhu31响应地图缩放被点击的函数;
//定义当前命令被点击过的标识;
BOOL SCALEMAPHASCLICKED = FALSE;
//定义定义一个当前点击是地图缩放的标识;
BOOL SCALEMAPCLICKED = FALSE;
void CMapXpro006View::OnScalemap()
{
// TODO: Add your command handler code here
//设置当前地图的比例;
m_ctrlMapX.SetZoom(6000);
//如果当前点击是第一次点击;
if (!SCALEMAPHASCLICKED)
{
try
{
//声明当前命令第一次被点击;
SCALEMAPHASCLICKED = TRUE;
//指定DrawUserLayer响应地图缩放的消息;
SCALEMAPCLICKED = TRUE;
//指定当前不再响应USERLINE消息;
USERLINECLICKED = FALSE;
//创建自定义图层并将其加入到当前地图同时指定其在图层集中的放置位置;
m_ctrlMapX.GetLayers().AddUserDrawLayer("huhuscalemap",1);
//添加命令执行后将发出DrawUserLayer消息,为响应函数所接到并执行相应程序体代码;
}
//异常处理(OleDispatch与Ole);
catch (COleDispatchException *e)
{
e->ReportError();
e->Delete();
} catch (COleException *e)
{
e->ReportError();
e->Delete();
}
}
else
AfxMessageBox("当前命令已被点击过.");
}
//huhu4删除当前地图中的用户图层;
void CMapXpro006View::OnClearuserlayer()
{
// TODO: Add your command handler code here
//当用户图层或地图缩放命令被点击过则地图存在用户图层;
if (USERLINEHASCLICKED)
{
//删除用户直线图层;
m_ctrlMapX.GetLayers().Remove("huhuuserdef");
//重置用户直线被点击状态;
USERLINEHASCLICKED = FALSE;
}
else if(SCALEMAPHASCLICKED)
{
//删除地图缩放图层;
m_ctrlMapX.GetLayers().Remove("huhuscalemap");
//重置地图缩放被点击状态;
SCALEMAPHASCLICKED = FALSE;
}
}
//huhu5地图的放大与缩小工具;
void CMapXpro006View::OnZoominitem()
{
// TODO: Add your command handler code here
//地图放大;
m_ctrlMapX.SetCurrentTool(miZoomInTool);
}
void CMapXpro006View::OnZoomoutitem()
{
// TODO: Add your command handler code here
//地图缩小;
m_ctrlMapX.SetCurrentTool(miZoomOutTool);
}