码迷,mamicode.com
首页 > 编程语言 > 详细

mapwingis c++ mfc 改变光标状态达到放大缩小平移的效果

时间:2015-05-04 22:13:52      阅读:348      评论:0      收藏:0      [点我收藏+]

标签:mapwingis

        mapwingis是个免费的开源插件,官网上的教程大多都是c#的。最近做的一个project是用的MFC,怎么调用他的接口了,网上的资料比较少,大多数都只有说到怎么显示矢量或者影像数据就结束了,但是这样的话,一打开图片光标的默认状态是放大,鼠标左键单击一下是当大,右键是缩小,拖动是选中放大,怎么实现像他给的demo中点击放大,或者缩小,平移按钮切换鼠标状态来完成相应的操作,mapwingis这些操作都是封装好了的,只是c++的调用接口没有详细说明(也可能是我没在官网找到。。。),网上有说是版本问题,说低版本有提供接口修改,我安装了几个低版本的也没有什么变化,还是改变不了。。还行先记录一下怎么在MFC中使用mapwingis插件,最后在说一下怎么改变光标状态。

1、在官网下载mapwingis的安装程序http://mapwingis.codeplex.com/releases/view/541892,下载后直接默认安装,最后不要改安装路径,我没有测试改了后的情况。默认安装完成后会在c盘出现这个目录C:\dev\MapWinGIS,记住这个目录,后面会用到的。


2、用vs2012(其他的版本应该也可以)新建一个单文档或者多文档程序,接着在这个位置点击新建一个类

技术分享

然后在这个位置选择添加activex控件的类

技术分享


技术分享

3、 stdafx.h文件中添加

#import "C:\dev\MapWinGIS\MapWinGIS.ocx" rename_namespace("mapWindow") rename("GetObject", "GISGetObject")
 Resource.h中添加

#define IDC_MAP				140
只有保证ID不重复即可

4、在视图类添加一个变量

CDMap m_Map;这个CDMap类是之前导入activex类的时候生成的。我是直接用公有的变量,不安全?暂时还没遇到。。

5、添加视图类的WM_CREATE消息的响应函数,动态创建地图窗口,具体代码如下:

	int CXXView::OnCreate(LPCREATESTRUCT lpCreateStruct)
	{
		if (CView::OnCreate(lpCreateStruct) == -1)
			return -1;

		// TODO:  在此添加您专用的创建代码

		CRect rect;
		GetClientRect(&rect);
		m_Map.Create(NULL,WS_CHILD | WS_VISIBLE | WS_BORDER,rect,this,IDC_MAP);


		return 0;
	}

6、添加视图类的WM_SIZE消息的响应函数,加入如下代码以使地图控件占满整个视图:

void CXXView::OnSize(UINT nType, int cx, int cy)
	{
		CView::OnSize(nType, cx, cy);

		// TODO: 在此处添加消息处理程序代码
		if(m_Map.m_hWnd == NULL)return;
		if(IsWindow(m_Map.m_hWnd))
		{
			CRect rect;
			GetClientRect(&rect);
			m_Map.MoveWindow(rect,FALSE);
			m_Map.ZoomToPrev();
		}
	}
7、接下来就是要显示了,可以在DOC类中利用默认的Serialize函数获得文件路径,比如这样:

#pragma warning(disable:4996) // 调用strlwr 函数的时候会出错 不加这句的的话

void CSeXXDoc::Serialize(CArchive& ar)
	{
		if (ar.IsStoring())
		{
			// TODO: 在此添加存储代码
		}
		else
		{
			// TODO: 在此添加加载代码
			CFile *p_file = ar.GetFile();

			CString filePathTem = m_filePath;
			CString fileExtTem = m_fileExt;
			m_filePath = p_file->GetFilePath();

			char * nameTem = m_filePath.GetBuffer();
			char * ext = strlwr(strrchr(nameTem,'.') + 1);
			m_fileExt = ext;

			CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
			CXXView * pView = (CXXView *)pFrame->GetActiveView();
			if(m_fileExt == "tif")
			{
	
				pView->DrawImage(m_filePath);

			}
			else if(m_fileExt == "shp")
			{
	
				pView->DrawShp(m_filePath);
			}
			else
			{
				AfxMessageBox(_T("暂时只支持*.tif *.shp"));
				return;
			}



		}

	}


m_filePath可以声明为DOC的一个共有成员变量即可

然后在view类去实现对应的显示操作即可

8、显示tif

void CXXView::DrawImage(CString filePath)
	{
		// 创建图像接口打开图像加入地图
		m_Map.RemoveAllLayers(); 
		mapWindow::IImagePtr pImage;
		pImage.CreateInstance(__uuidof(mapWindow::Image));
		pImage->Open(_bstr_t(filePath),mapWindow::USE_FILE_EXTENSION,TRUE,NULL);
		m_Map.AddLayer(pImage,true); 
		Invalidate();
	}
9、显示shp

	void CXXView::DrawShp(CString filePath)
	{
		// 创建shp接口打开shp文件加入地图
		m_Map.RemoveAllLayers(); 
		mapWindow::IShapefilePtr pShapefilebound;
		pShapefilebound.CreateInstance(__uuidof(mapWindow::Shapefile));
		pShapefilebound->Open(_bstr_t(filePath),false);
		m_Map.AddLayer(pShapefilebound,true);
		Invalidate();
		
	}

这样就完成显示操作了,怎么实现漫游等其他操作了。。

网上搜了很久,没找到答案,最后在一篇老外的帖子上找到了解决方法,也是看了很久才明白他说的意思。

网上看的关于漫游,放大,缩小的c#代码是这样的

基本的地图操作
放大:axMap1.CursorMode = MapWinGIS.tkCursorMode.cmZoomIn;
缩小:axMap1.CursorMode = MapWinGIS.tkCursorMode.cmZoomOut;
漫游:axMap1.CursorMode = MapWinGIS.tkCursorMode.cmPan;
全幅:axMap1.ZoomToMaxExtents();

所以对于的c++代码应该也是和这个类似的,

有说是这样写的,好像是百度空间的一个帖子,不记得链接了,直接摘抄一些那个老外的帖子上的代码

map.SetCursorMode(MapWinGIS::tkCursorMode::cmPan);
但是我加的代码中找了很久都没有SetCursorMode这个方法,这要怎么设置,这个帖子老外在讨论的方法,好像是直接给控件添加一个变量什么什么的,也不知道在哪个地方添加,又搜索了一番,原来还有一种使用mapwingis的方法,就是在一个对话框中添加这个mapwingis控件,但是我的toolbox上面也没有这个控件。。最后发现原来这个是要手动添加进去的。具体的添加办法也是在老外的那个论坛上看见的,链接暂时找不到了,有两种添加方法

一个是直接在对话框上左键单击然后选择添加activex控件,第二个是 工具菜单下的选择工具箱菜单后选择com组件中找到map control 1.0即可,然后可以看到这个控件的属性中确实有这个设置模式的,而且改了以后也是有效的

技术分享


然后为这个对话框的添加一个类,在为这个mapwingis控件添加一个变量,关联到之前的CDmap.h和CDmap.cpp中,发现一大推错误。。不过没关系,这里我发现了怎么添加SetCursorMode这个接口的方法了。

	void SetCursorMode(long propVal)
{
	SetProperty(0x3, VT_I4, propVal);
}

其他的没用的直接删了就可以了,也就是说只要在CDmap.h中把这个接口添加进去就可以了。

后面这样在需要的地方这样调用就可以了

m_Map.SetCursorMode(mapWindow::tkCursorMode::cmZoomOut);
这个tkCursorMode有这么多枚举的,按需调用即可

enum
{
    cmZoomIn = 0,
    cmZoomOut = 1,
    cmPan = 2,
    cmSelection = 3,
    cmNone = 4,
    cmMeasure = 5,
    cmAddShape = 6,
    cmEditShape = 8,
    cmSplitByPolyline = 9,
    cmIdentify = 10,
    cmMoveShapes = 11,
    cmRotateShapes = 12,
    cmSelectByPolygon = 13,
    cmEraseByPolygon = 14,
    cmSplitByPolygon = 15,
    cmClipByPolygon = 16
}tkCursorMode;



mapwingis c++ mfc 改变光标状态达到放大缩小平移的效果

标签:mapwingis

原文地址:http://blog.csdn.net/pqleo/article/details/45484559

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!