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

转载注明出处:

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

1、在官网下载mapwingis的安装程序,下载后直接默认安装,最后不要改安装路径,我没有测试改了后的情况。默认安装完成后会在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_MAP140只有保证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、显示shpvoid 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();}这样就完成显示操作了,怎么实现漫游等其他操作了。。

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

让我们从自身的禁锢中放心地飞出去,重新审视自己,

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

相关文章:

你感兴趣的文章:

标签云: