第一步:用MFC应用程序向导新建一个单文档的工程,名字就不妨取为:mapxdemo
第二步:Project> Add To Project>Files,选择MapX.cpp和MapX.h,MapX安装文件中的例程中。同时还要手工将Mapx.h和Mapx.cpp这两个文件复制到你的工程目录中去,不然编译时会报错的
第三步:在mapxdemoView.h文件中包括它:
#include "MapX.h"
另外还要在视图类(mapxdemoView.h)中定义一个对象:
class CMapxdemoView : pubic CView
{
......
CMapX m_ctrlMapX; //这是要添加的
.....
......
}
第四步::声明一个常量。View > Resource Symbols>New>name为IDC_MAP。
第五步:在类向导(ctrl+W)中为mapxdemoView创建WM_SIZE 和 WM_CREATE的处理消息:
void CMapxSampleView::OnCreate(UINT nType, int cx, int cy)
{
m_ctrlMapX.Create(NULL, WS_VISIBLE, CRect(0,0,100,100), this,IDC_MAP);
}
void CMapxSampleView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
m_ctrlMapX.MoveWindow(0,0,cx,cy,TRUE);
}
第六步:在类向导中为CmapxdemoView创建WM_SETFOCUS的处理消息,以确保当窗口处于活动状态时得到焦点。
void CMapxSampleView::OnSetFocus(CWnd* pOldWnd)
{
CView::OnSetFocus(pOldWnd);
m_ctrlMapX.SetFocus();
}
然后编译运行。就可以看到USA的地图了!如果没有就再试试。如果想让程序运行时不显示任何地图数据,需要将gst清空,方法如下:
int CMapxSampleView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
//创建mapx控件
CRect rc(0,0,100,100);
if( !m_ctrlMapX.Create(NULL, WS_VISIBLE, rc, this, IDC_MAP) )
return -1;
//清空 gst 地图
m_ctrlMapX.SetGeoSet("");
return 0;
}
当然如果想显示自己的地图的话,在m_ctrlMapX.SetGeoSet("");中写入路径就可以了。
如m_ctrlMapX.SetGeoSet("asia.gst"); 或m_ctrlMapX.SetGeoSet("maps\\asia.gst");
这说明maps文件夹是在工程目录下的.
在地图显示出来后,用户通常要以各种比例查看地图的全局、局部或细部,必须提供诸如放大、缩小和漫游等功能。采用MapX通用工具,可以非常方便地实现上述功能。设定MapX使用标准工具的方法很简单,只需设定地图对象的CurrentTool属性。下面的例子是用标准放大工具实现放大功能。
添加新菜单项资源,输入标题“工具”,在“工具”下添加子菜单,输入标题“放大”及ID 为ID_ZOOM_ IN。打开类向导,选择视图类CMapXSampleView,为菜单项ID_ZOOM_IN 添加COMMAND 消息映射函数OnZoomIn ( ),并编辑码如下。
void CMapXSampleView::OnZoomIn()
{
m_ctrlMapX.SetCurrentTool(miZoomInTool);// miZoomInTool为放大工具常量
}
编译运行程序,选择“工具|放大”,就会看到此时光标变为放大镜,单击鼠标就会实现放大功能。可用相同方法实现其他标准工具的功能。
实现鼠标滚轮缩放
在mapx中地图实现滚轮事件的放大缩小,如果单纯的按照MFC中那样添加鼠标滚轮响应,在刚初始化的时候是正确的,好使。但是如果使用了mapx定制的工具或者自定义的工具的时候,程序就不再响应鼠标滚轮消息。具体的原因并不清楚。我猜想是由于MFC把一些东西交给了mapx来处理。意思是在图片点击鼠标已经不归MFC定制的那些类管理,而是交给了MAPx中的消息响应机制了。
要实现鼠标滚轮缩放请往下看,
打开类向导,选择视图类CMapXSampleView,为WM_MOUSEWHEEL 添加COMMAND 消息映射函数OnMouseWheel ( ),并编辑码如下。
BOOL CExampleView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
// TODO: Add your message handler code here and/or call default
//miNoMousewheelSupport:不支持鼠标缩放
//miMousewheelNoAutoScroll:缩放/仅限滚动
//miFullMousewheelSupport:缩放,外加拖动
m_ctrlMapX.SetMousewheelSupport(miMousewheelNoAutoScroll);
return CView::OnMouseWheel(nFlags, zDelta, pt);
}