提个简单的问题:怎样在vc+mapx中用FeatureFactory创建多边形图元,为什么我这段代码不对?

cloudrain 2005-03-23 05:08:44
大虾们:我需要建立一个矩形图元,用了以下的代码:
CMapXRectangle feRect;//其中m_map是MapX控件,lyr是已经存在的图层,dbX,dbY是矩形的左下角坐
//标,dbSize是矩形大小
VARIANT vVal;
CMapXFeatureFactory feFac;
try
{
feRect.CreateDispatch(feRect.GetClsid());
feFac=m_map.GetFeatureFactory();
feRect.Set(dbX,dbY,dbX+dbSize,dbY+dbSize);
vVal.vt=VT_VARIANT;
vVal.pdispVal=feRect.m_lpDispatch;
vVal.pdispVal->AddRef();
lyr.AddFeature(feFac.CreateRegion(vVal));
}
catch(COleDispatchException *e)
{
e->ReportError();
e->Delete();
}
catch(COleException *e)
{
e->ReportError();
e->Delete();
}
这段代码运行后报出异常:(Invalid points object)该如何解决啊??
...全文
192 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
charryli 2005-03-28
  • 打赏
  • 举报
回复
哦,忘了,是MapX
BOOL CMapEditorView::DrawRectFill(double X1, double Y1, double X2, double Y2)
{
if(m_MapX.GetLayers().GetInsertionLayer()==NULL)
return FALSE;
if(m_MapX.Distance(X1,Y1,X2,Y2)==0)
return FALSE;
try
{
VARIANT fx,fy;
m_MapX.ConvertCoordV(&fx,&fy,COleVariant(X1),COleVariant(Y1),miMapToScreen);
VARIANT sx,sy;
m_MapX.ConvertCoordV(&sx,&sy,COleVariant(X2),COleVariant(Y2),miMapToScreen);
VARIANT mapx1,mapy1,mapx2,mapy2;
m_MapX.ConvertCoordV(&fx,&sy,&mapx1,&mapy1,miScreenToMap);
m_MapX.ConvertCoordV(&sx,&fy,&mapx2,&mapy2,miScreenToMap);
double x2,y2,x4,y4;
x2 = mapx1.dblVal;
y2 = mapy1.dblVal;
x4 = mapx2.dblVal;
y4 = mapy2.dblVal;
CMapXFeature pFea;
CMapXPoints points;
points.CreateDispatch(points.GetClsid());
CMapXFeatureFactory pFactory;
pFactory=m_MapX.GetFeatureFactory();
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();
pFea=pFactory.CreateRegion(vtPoints);
pFea.SetStyle(m_MapX.GetDefaultStyle());
pFea=m_MapX.GetLayers().GetInsertionLayer().AddFeature(pFea);
m_MapX.GetLayers().GetInsertionLayer().GetSelection().Replace(pFea);
// m_MapX.GetLayers().GetInsertionLayer().Refresh();
return TRUE;
}
catch (COleDispatchException *e)
{
e->ReportError();
e->Delete();
}
catch (COleException *e)
{
e->ReportError();
e->Delete();
}
return FALSE;
}
charryli 2005-03-28
  • 打赏
  • 举报
回复
CMoLine polygon;
polygon.CreateDispatch(TEXT("MapObjects2.Polygon"));
CMoParts parts=polygon.GetParts();

CMoPoints points;
points.CreateDispatch(TEXT("MapObjects2.Points"));

CMoPoint point;
point.CreateDispatch(TEXT("MapObjects2.Point"));
point.SetX(m_trace_rectangle.GetLeft());
point.SetY(m_trace_rectangle.GetBottom());
points.Add(point);
point.SetX(m_trace_rectangle.GetRight());
point.SetY(m_trace_rectangle.GetBottom());
points.Add(point);
point.SetX(m_trace_rectangle.GetRight());
point.SetY(m_trace_rectangle.GetTop());
points.Add(point);
point.SetX(m_trace_rectangle.GetLeft());
point.SetY(m_trace_rectangle.GetTop());
points.Add(point);
parts.Add(points);

CMainFrame * pFrame;
pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
int index=pFrame->GetCurLayer();

CMoLayers layers = m_map.GetLayers();
CMoMapLayer layer(layers.Item(COleVariant(long(index))));
if(layer.GetLayerType()!=0)
return;
CMoRecordset recs(layer.GetRecords());

if(!recs.m_lpDispatch) return;
CMoFields fields(recs.GetFields());
try {
if(recs.GetSupportsTransactions())
recs.StartTransaction();
recs.AddNew();
SetValue(fields,"Shape",polygon.m_lpDispatch);
// SetValue(fields, "OBJECTID", (double)GetLayerMaxObjID(index));
// SetValue(fields, DEV_TYPE, (long)GetDevTypeID(layer.GetName()));
recs.Update();
if(recs.GetSupportsTransactions())
recs.CommitTransaction();
}
catch(CException *e) {
e->ReportError();
e->Delete();
recs.CancelUpdate();
recs.StopEditing();
return;
}
cloudrain 2005-03-23
  • 打赏
  • 举报
回复
补充一下:我用CMapXPoints对象先加入四个坐标点也出现Invalid points object错误提示
在Windows 10或Windows 11操作系统中,用户经常会遇到共享打印机时出现的一系列错误代码,这些错误代码可能会阻碍打印机共享功能的正常使用。常见的错误代码包括0x00000057、0x00000709和0x0000011b,这些代码通常指出了不同的问题,比如权限不足、服务未运行或配置错误等。除此之外,还有一些故障提示如“连接失败”或“内存不足”,这些都可能影响到打印机共享的稳定性。 要解决这些故障,首先要确保打印机已经正确地连接到网络,并且在需要共享的电脑上进行了设置。确保打印机驱动程序是最新的,并且在共享设置中没有错误配置。对于权限问题,需要检查网络上的用户账户是否具有足够的权限来访问共享打印机。同时,也要确保打印机服务正在运行,特别是“Print Spooler”服务,因为这是打印机共享服务的核心组件。 在某些情况下,问题可能与操作系统的更新有关,如升级到最新版的Windows 10或Windows 11后可能出现的兼容性问题。这时,可能需要查看微软的官方支持文档来获取特定的解决方案或更新。 对于错误代码0x00000057,这通常是由于没有足够的权限来访问网络打印机或其共享资源,解决方法是确保网络打印机的权限设置正确,包括在组策略中设置相应的访问权限。而0x00000709错误可能是由于打印机驱动问题或打印机端口配置错误,可以尝试重新安装或更新打印机驱动来解决。至于0x0000011b错误,这往往是因为打印机队列服务的问题,检查并重启“Print Spooler”服务通常是解决这类问题的常见手段。 至于“连接失败”或“内存不足”这类故障,通常与客户端和打印机之间的网络连接以及打印机本地资源的使用情况有关。检查网络连接,确保打印机所在的网络段没有故障或中断。同时,如果打印机的打印队列长时间得不到处理,可能会导致内存不足的情况,这时可能需要清理打印队列或增加打印机的内存配置。 为了帮助用户更快速地解决这些问题,市面上出现了各种打印机共享错误修复工具。这些工具往往通过预设的修复程序来自动检测和修正打印机共享中常见的问题。它们可以快速检查打印机驱动、网络连接以及共享设置,并且能够提供一键修复功能,大幅减少了用户自行排查和解决问题的难度。 然而,在使用这些修复工具之前,用户应确保这些工具的来源是安全可靠的,避免因使用不当的修复工具而引发其他系统安全或隐私问题。用户可以到官方平台或者信誉良好的软件提供商处下载这些工具。通过细心检查打印机的共享设置,及时更新驱动程序和服务,以及合理使用修复工具,大多数共享打印机的问题都可以得到有效的解决。

2,154

社区成员

发帖
与我相关
我的任务
社区描述
它是一种特定的十分重要的空间信息系统。它是在计算机硬、软件系统支持下,对整个或部分地球表层(包括大气层)空间中的有关地理分布数据进行采集、储存、管理、运算、分析、显示和描述的技术系统。
社区管理员
  • 地理信息系统
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧