阅读:2310回复:3
求助:VC中如何利用Feature Factory创建图元
<P><b>求助:VC中如何利用Feature Factory创建图元
</b>VC中如何利用Feature Factory创建图元? CMapX m_ctrlMapX; CMapXFeatureFactory Traceff; CMapXFeature Traceftr; CMapXLayer Tracelayer; CMapXPoint Tracepoint;</P> <P>CMapXtyle TraceStyle; TraceStyle.SetSymbolType(miSymbolTypeBitmap); TraceStyle.SetSymbolBitmapSize(24); TraceStyle.SetSymbolBitmapTransparent(TRUE); TraceStyle.SetSymbolBitmapName("FIRE1-32.BMP"); Tracelayer = m_ctrlMapX.GetLayers().Item("tl"); Traceff=m_ctrlMapX.GetFeatureFactory(); m_ctrlMapX.SetAutoRedraw(FALSE);</P> <P> Tracelayer.SetEditable(TRUE); </P> <P> Tracepoint.Set(TraceX,TraceY); Traceftr=Traceff.CreateSymbol(Tracepoint,TraceStyle); Tracelayer.AddFeature(Traceftr); Tracelayer.Refresh();</P> <P> m_ctrlMapX.SetAutoRedraw(TRUE); Tracelayer.SetEditable(FALSE); 编译之后会报错: error C2664: 'class CMapXFeature __thiscall CMapXFeatureFactory::CreateSymbol(const struct tagVARIANT ;,const struct tagVARIANT ;)' : cannot convert parameter 1 from 'class CMapXPoint' to 'const struct tagVARIANT ;' Reason: cannot convert from 'class CMapXPoint' to 'const struct tagVARIANT' No constructor could take the source type, or constructor overload resolution was ambiguous Error executing cl.exe. 问题是:怎么向Traceff.CreateSymbol( const VARIANT ; Point, const VARIANT ;,Style );函数传参数???</P> <P> 也就是说在VC中,如果一个函数的形参是VARIANT类型的,如何就行调用?</P> <P>尤其是像Traceff.CreateSymbol( const VARIANT ; Point, const VARIANT ;,Style ); 谢谢拉 </P> |
|
1楼#
发布于:2004-12-15 16:32
<P><a>file://自</A>定义工具响应函数
void CGeotestView::OnToolUsed(short ToolNum, double X1, double Y1, double X2, double Y2, double Distance, BOOL Shift, BOOL Ctrl, BOOL* EnableDefault) { CString str; CMapXPoint pnt; str.Format("Tool=%d, [%f,%f] [%f, %f], dist=%f, %s %s\n", ToolNum, X1,Y1,X2,Y2,Distance, (Shift)?"Shift":"",(Ctrl)?"Ctrl":""); TRACE(str); <a>file://调</A>试时显示信息 CMapXPoints points; CMapXFeature feature; <a>file://points=m_ctrlMapX.GetLayers</A>(). CMapXFeatureFactory cFactory=m_ctrlMapX.GetFeatureFactory(); switch(ToolNum) { <a>file://画</A>线 case CUSTOM_LINE_TOOL : { points.CreateDispatch(points.GetClsid());//重要!刚才就忘了加,所以没成功 CMapXLayer layer=m_ctrlMapX.GetLayers().Item(m_strEditLayer);//得到可编辑层 points.AddXY(X1,Y1); points.AddXY(X2,Y2);</P> <P> COleVariant vtPoints; vtPoints.vt = VT_DISPATCH; vtPoints.pdispVal = points.m_lpDispatch; vtPoints.pdispVal->AddRef(); feature=cFactory.CreateLine(vtPoints); layer.AddFeature(feature); } break; <a>file://画</A>矩形 case CUSTOM_RECT_TOOL : { VARIANT scx,scy; points.CreateDispatch(points.GetClsid()); CMapXLayer layer=m_ctrlMapX.GetLayers().Item(m_strEditLayer);//得到可编辑层 <a>file://进</A>行坐标变换 m_ctrlMapX.ConvertCoordV(;scx,;scy,COleVariant(X1),COleVariant(Y1),miMapToScreen); VARIANT scx1,scy1; m_ctrlMapX.ConvertCoordV(;scx1,;scy1,COleVariant(X2),COleVariant(Y2),miMapToScreen); VARIANT mapx1,mapy1,mapx2,mapy2; m_ctrlMapX.ConvertCoordV(;scx,;scy1,;mapx1,;mapy1,miScreenToMap); m_ctrlMapX.ConvertCoordV(;scx1,;scy,;mapx2,;mapy2,miScreenToMap); double x2,y2,x4,y4; <a>file://mapx1.ChangeType</A>(VT_R8); x2= mapx1.dblVal; <a>file://mapy1.ChangeType</A>(VT_R8); y2=mapy1.dblVal; <a>file://mapx2.ChangeType</A>(VT_R8); x4=mapx2.dblVal; <a>file://mapy2.ChangeType</A>(VT_R8*; y4=mapy2.dblVal;</P> <P> <a>file://创</A>建矩形 points.AddXY(X1,Y1); points.AddXY(x2,y2); points.AddXY(X2,Y2); points.AddXY(x4,y4); COleVariant vtPoints; vtPoints.vt = VT_DISPATCH; vtPoints.pdispVal = points.m_lpDispatch; vtPoints.pdispVal->AddRef(); feature=cFactory.CreateRegion(vtPoints); </P> <P> layer.AddFeature(feature); } break; <a>file://画</A>圆弧 case CUSTOM_ARC_TOOL : { points.CreateDispatch(points.GetClsid()); CMapXLayer layer=m_ctrlMapX.GetLayers().Item(m_strEditLayer); points.AddXY(X1,Y1); points.AddXY(X2,Y2); feature=cFactory.CreateArc(points.Item(1).m_lpDispatch,points.Item(2).m_lpDispatch); </P> <P> layer.AddFeature(feature); } break; <a>file://画</A>椭圆 case CUSTOM_ELLIPSE_TOOL : { CMapXRectangle rect; rect.CreateDispatch(rect.GetClsid()); CMapXLayer layer=m_ctrlMapX.GetLayers().Item(m_strEditLayer); rect.Set(X1,Y1,X2,Y2); feature=cFactory.CreateEllipticalRegion(rect.m_lpDispatch, 0, 30); layer.AddFeature(feature); } break; <a>file://测</A>定距离 case CUSTOM_DISTANCE_TOOL : { long n; double dDistanceTot=0.0; n=points.GetCount (); VARIANT mapx1,mapy1,mapx2,mapy2; m_ctrlMapX.ConvertCoordV(COleVariant(X1),COleVariant(Y1),;mapx1,;mapy1,miScreenToMap); m_ctrlMapX.ConvertCoordV(COleVariant(X2),COleVariant(Y2),;mapx2,;mapy2,miScreenToMap); double Mapx1,Mapy1,Mapx2,Mapy2; <a>file://把</A>VARIANT转换成DOUBLE mapx1.vt=VT_R8; Mapx1=mapx1.dblVal; mapy1.vt=VT_R8; Mapy1=mapy1.dblVal; mapx2.vt=VT_R8; Mapx2=mapx2.dblVal; mapy2.vt=VT_R8; Mapy2=mapy2.dblVal; double d=m_ctrlMapX.Distance (Mapx1,Mapy1,Mapx2,Mapy2); <a>file://测</A>定距离 CString str; str.Format ("总距离为:%f",d); <a>file://m_wndStatusBar</A> ((CMainFrame*)AfxGetMainWnd())->m_wndStatusBar.SetPaneText(0,str); CDistance distance(;m_ctrlMapX); distance.m_distance = d; distance.DoModal(); UpdateData(FALSE); /*for (int i=1; i<n;i++) { CMapXPoint pt1=points.Item(i); CMapXPoint pt2=points.Item(i+1); double d=m_ctrlMapX.Distance (pt1.GetX(),pt1.GetY(),pt2.GetX (), pt2.GetY ());//测定距离 dDistanceTot+=d; str.Format ("总距离为:%f",dDistanceTot);//m_wndStatusBar <a>file://在</A>状态栏输出距离 ((CMainFrame*)AfxGetMainWnd())->m_wndStatusBar.SetPaneText(0,str); }*/ } break; case CUSTOM_INFO_TOOL : { <a>file://m_ctrlMapX.SetCurrentTool</A>(miSelectTool); CMapXSelection selection = m_ctrlMapX.GetLayers(). Item("USA").GetSelection(); if(selection.GetCount()==0) { AfxMessageBox("请选中对象!"); } } break; } }</P> |
|
2楼#
发布于:2004-12-15 16:36
<P>CMapXStyle symbol;</P><P>symbol.CreateDispatch(symbol.GetClsid());</P><P>symbol.Set();................略</P><P>COleVariant vtSymbol;
vtSymbol.vt = VT_DISPATCH; vtSymbol.pdispVal = vtSymbol.m_lpDispatch; vtSymbol.pdispVal->AddRef();</P><P>cFactory.CreateSymbol(vtSymbol) </P> |
|
3楼#
发布于:2005-05-12 08:58
<b><FONT color=#000066>kissboy_gis强人</FONT></b>
|
|