VC下鹰眼图实现的思路与VB是一样的,只不过VC的可视化程序没有VB高,VC更多的是利用代码来实现一定的功能。如利用下面的两句代码创建两个控件,分别用来显示主图和鹰眼图。
m_ctrlMapX.Create(NULL, WS_VISIBLE, CRect(0,0,300,300), this, IDC_MAP1);
m_eagleMapx.Create(NULL, WS_VISIBLE, CRect(0,0,400,400), this,IDC_MAP2);
另外在初始化程序时,还需创建一个图层,用于显示鹰眼图上矩形Feature。
m_eagleMapx.GetLayers().CreateLayer( "RectLayer ");
鹰眼图的主要功能是在主图发生变化时,在鹰眼图上用变化的矩形框来显示当前主图显示的边界。这里主要利用MapX 控件内置的消息MAPX_DISPID_MAPVIEWCHANGED映射的函数来完成该功能,当主视图发生变化时,MapX 控件发出消息,调用OnMapViewChanged()函数进行相应的处理,所以主要的代码在OnMapViewChanged()函数中实现。
ON_EVENT(CMapXSampleView, IDC_MAP1, MAPX_DISPID_MAPVIEWCHANGED, OnMapViewChanged, VTS_NONE)
//主视图发生变化时,调用如下的函数
void CMapXSampleView::OnMapViewChanged()
{
double X1,Y1,X2,Y2; //声明坐标变量
double x2,y2,x4,y4; //声明坐标变量
VARIANT scx, scy, scx1, scy1; //声明屏幕坐标变量
VARIANT mapx1,mapy1,mapx2,mapy2; //声明地图坐标变量
//声明FeatureFactory变量并获取缺省值
CMapXFeatureFactory cFactory=m_eagleMapx.GetFeatureFactory();
CMapXLayer layer; //声明图层变量
CMapXFeature feature; //声明Feature变量
CMapXFeatures features; //声明Features变量
CMapXPoints points; //声明Points变量
points.CreateDispatch(points.GetClsid());
CMapXRectangle rect; //声明矩形变量
rect.CreateDispatch(rect.GetClsid());
//获取主图的边界,根据这个边界值,在鹰眼图上添加一个矩形Feature
rect = m_ctrlMapX.GetBounds();
X1 = rect.GetXMin(); //获得矩形左上顶点x坐标
Y1 = rect.GetYMin(); //获得矩形左上顶点y坐标
X2 = rect.GetXMax(); //获得矩形右下顶点x坐标
Y2 = rect.GetYMax(); //获得矩形右下顶点y坐标
//进行坐标变换
m_eagleMapx.ConvertCoordV(&scx,&scy,COleVariant(X1),COleVariant(Y1),miMapToScreen);
m_eagleMapx.ConvertCoordV(&scx1,&scy1,COleVariant(X2),COleVariant(Y2),miMapToScreen);
m_eagleMapx.ConvertCoordV(&scx,&scy1,&mapx1,&mapy1,miScreenToMap);
m_eagleMapx.ConvertCoordV(&scx1,&scy,&mapx2,&mapy2,miScreenToMap);
//获得矩形框顶点坐标
x2= mapx1.dblVal;
y2=mapy1.dblVal;
x4=mapx2.dblVal;
y4=mapy2.dblVal;
//得到添加矩形Feature的图层
layer=m_eagleMapx.GetLayers().Item( "RectLayer ");
features=layer.AllFeatures();
//没有添加矩形Feature的图层,则新建
if(features.GetCount() == 0)
{
//添加四个顶点构成一个矩形框
points.AddXY(X1,Y1); //添加顶点1
points.AddXY(x2,y2); //添加顶点2
points.AddXY(X2,Y2); //添加顶点3
points.AddXY(x4,y4); //添加顶点4
//创建矩形Feature
COleVariant vtPoints;
vtPoints.vt = VT_DISPATCH;
vtPoints.pdispVal = points.m_lpDispatch;
vtPoints.pdispVal-> AddRef();
feature=cFactory.CreateRegion(vtPoints);
//设置矩形Feature的属性
CMapXStyle style=feature.GetStyle();
style.SetRegionPattern(miPatternNoFill); //设置矩形的填充方式
style.SetRegionBorderColor(miColorRed); //设置矩形边框颜色
style.SetRegionBorderWidth(2); //设置矩形边框宽度
feature.SetStyle(style.m_lpDispatch);
//添加已经创建的矩形Feature
m_eaglefeature = layer.AddFeature(feature);
}
else //否则更新Feature的矩形大小与位置
{
m_eaglefeature.GetParts().Item(1).RemoveAll(); //除去已有的顶点
m_eaglefeature.GetParts().Item(1).AddXY(X1,Y1); //添加顶点1
m_eaglefeature.GetParts().Item(1).AddXY(x2,y2); //添加顶点2
m_eaglefeature.GetParts().Item(1).AddXY(X2,Y2); //添加顶点3
m_eaglefeature.GetParts().Item(1).AddXY(x4,y4); //添加顶点4
m_eaglefeature.Update(); //更新Feature属性
}
//更新显示图层
layer.Refresh();
}
VC下鹰眼图的实现
最新推荐文章于 2019-07-28 19:39:19 发布