sshj_mil
路人甲
路人甲
  • 注册日期2004-09-08
  • 发帖数62
  • QQ
  • 铜币131枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:2116回复:3

求助:VC中如何利用Feature Factory创建图元

楼主#
更多 发布于:2004-12-09 01:00
<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>
喜欢0 评分0
kissboy_gis
路人甲
路人甲
  • 注册日期2004-11-29
  • 发帖数4
  • QQ
  • 铜币111枚
  • 威望0点
  • 贡献值0点
  • 银元0个
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>
举报 回复(0) 喜欢(0)     评分
kissboy_gis
路人甲
路人甲
  • 注册日期2004-11-29
  • 发帖数4
  • QQ
  • 铜币111枚
  • 威望0点
  • 贡献值0点
  • 银元0个
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>
举报 回复(0) 喜欢(0)     评分
longlong09
路人甲
路人甲
  • 注册日期2005-03-17
  • 发帖数12
  • QQ
  • 铜币124枚
  • 威望0点
  • 贡献值0点
  • 银元0个
3楼#
发布于:2005-05-12 08:58
<b><FONT color=#000066>kissboy_gis强人</FONT></b>
举报 回复(0) 喜欢(0)     评分
游客

返回顶部