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