mapx 鼠标点击图元时时获取feature失败(有源代码)

sin816 2008-11-15 10:05:45
MFC对话框工程 采用ActiveX导入mapx插件

现在属性数据已经和图层绑定
下面是我点击鼠标后获取features失败的代码:编译通过,但运行时会提示:Invalid Point object

void CHomeworkDlg::OnToolUsedMap1(short ToolNum, double X1, double Y1, double X2, double Y2, double Distance, BOOL Shift, BOOL Ctrl, BOOL FAR* EnableDefault) 
{
CCMapXPoint point;
COleVariant empty;
empty.vt = VT_ERROR;
empty.scode = DISP_E_PARAMNOTFOUND;
point.Set(X1,Y1);
features = myLayer.SearchAtPoint(point, empty);
}


SearchAtPoint()有两个参数,但mapx在线帮助里用的都是一个参数。
CCMapXFeatures CCMapXLayer::SearchAtPoint(LPDISPATCH Point, const VARIANT& SearchResultFlags)

为什么点对象不合法呢?我调试了下发现x和y都是地图坐标数据,而不是屏幕坐标数据

需要怎么该才能获得features?

哪位前辈有这方面的源代码,能否分享分享



...全文
585 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sxuwy2008 2010-08-15
  • 打赏
  • 举报
回复
同问同问同问同问同问同问同问同问
Tinary3v0 2008-11-18
  • 打赏
  • 举报
回复
呵呵 弄好了 你到这个网址去看看吧
上面你说的过程有点乱 虽然文章中并没有直接具体的回答你的问题 但是你看过后应该就知道怎么弄了。

看过提提意见 呵呵
sin816 2008-11-18
  • 打赏
  • 举报
回复
我恨啊 恨我怎么不找点认识你,写得太好了,尤其对于我这等菜鸟,呵呵呵
sin816 2008-11-17
  • 打赏
  • 举报
回复
Tinary3v0:

谢谢指导啊。
帖子加100分帮我看看我下面的操作对不对

1.新建一个对话框工程,将CMAPX.h CMAPX.cpp和地图文件拷贝的工程目录下
2.project->add to project->files,将CMAPX.h 和CMAPX.cpp导入
3.在对话框类定义CMapX类对象:m_ctrlMapX
4.右键对话框->Insert ActiveX Control->导入MapInfo MapX V5
5.右键该控件->ClassWizard,目的是将该控件绑定给对象m_ctrlMapX,这时又会产生很多.h文件在工程目录下。就像5楼所说的。

我不希望产生这些.h文件该怎么办呢?因为前面已经导入了CMAPX.h 和CMAPX.cpp

也许这步骤有问题,请问如果是你做的话,你会怎么做。
Tinary3v0 2008-11-17
  • 打赏
  • 举报
回复
我去写一篇博客文章 等我写好了 上来告诉你地址 你去看看吧 哎 被你逼得我这种懒人都要写文章发博客了 呵呵
Tinary3v0 2008-11-16
  • 打赏
  • 举报
回复
SearchAtPoint: 以某一个点为基准进行搜索,可以设置搜索结果的类型,比如返回线状地物可以设置SearchResultFlag为miSearchResultLine

设置成miSearchResultAll为全部搜索。

觉得你的第二个参数设置有问题吧。
Tinary3v0 2008-11-16
  • 打赏
  • 举报
回复
miSearchResultAll
Tinary3v0 2008-11-16
  • 打赏
  • 举报
回复
在我的工程里面试验了一下,代码如下:
void CMetCenView::OnToolUsedMap1(short ToolNum, double X1, double Y1, double X2, double Y2, double Distance, BOOL Shift, BOOL Ctrl, BOOL FAR* EnableDefault) 
{
CMapXPoint point;
point.CreateDispatch(point.GetClsid()); //忘记这句就会出现你的那个错误
point.Set(X1,Y1);
//-----------------------------------------------------//因为我的工程没有全局变量 所以这里重新去获得了一下图层
CMapXLayers layers;
layers = m_CtrMap.GetLayers();
int m = layers.GetCount();
//------------------------------------------------------
CMapXLayer m_traceLayer;
m_traceLayer =layers.Item(3); //随便选择了一个图层
m_traceLayer.SetSelectable( TRUE ); //这句加不加是不是也会造成一些问题呢? 如果图层不可选,估计什么都选不到吧

CMapXFeatures features = m_traceLayer.SearchAtPoint( point, miSearchResultAll);

int k = features.GetCount(); //我在我的工程里面试验了,随便点了一个地方 显示1 说明有Feature被选中了。
}


看我的代码里面根本不会用到COleVariant类型或Variant类型的,所以还是建议你 按照我上面说的改改。

实在不想改也行 那你还是得懂得下面的这个问题:

CreateDispatch:下面是搜到的一段话,感觉好像是,MapX的东西都需要一个接口,这个接口是一个类的ID,创建的时候还要同时创建这个接口。

//In cases where you are creating a MapX subordinate object yourself, you need to cause it to create its own 
//internal IDispatch *. That is done by calling CreateDispatch on the object and passing the class ID from the Windows
//Registry. This is made easier by the provision in most MapX subordinate object classes of a function called Classid().
//So use the following form: CMapXFeature NewFeature; NewFeature.CreateDispatch(NewFeature.Classid());
//Failure to do this will cause your program to experience an Access Violation the moment you try to do anything to the object.
Tinary3v0 2008-11-16
  • 打赏
  • 举报
回复
不清楚你是怎么用的MapX 既然是VC的工程 怎么老是用到COleVariant或Variant类型呢?

在VC的工程里面使用MapX的时候 你在对话框上添加一个MapX控件 会出现很多的.h文件在你的工程目录下
但这些文件对VC使用很不方便的。

最好的办法就是把这些文件从工程当中删除了(别乱删,要按照VC总工程中删除文件的过程来)
然后去MapX的安装目录下去找那个VC的Demo工程 将那个工程下面的MaX.h和MapX.cpp(就这两个文件
)考到你工程目录下 添加到工程里面去。

这个时候你会发现 原来用COleVariant类型或Variant类型的地方 可以使用C++或MFC定义的一些数据类型了。

看看我的MapX中SearchAtPoint的定义是不是跟你的不一样 我的第二个参数传short就行 那里有你的COleVariant啊?
CMapXFeatures CMapXLayer::SearchAtPoint(LPDISPATCH Point, short SearchResultFlags)
{
LPDISPATCH result;
static BYTE parms[] =
VTS_DISPATCH VTS_I2;
InvokeHelper(0x1d, DISPATCH_METHOD, VT_DISPATCH, (void*)&result, parms,
Point, SearchResultFlags);
return CMapXFeatures(result);
}

千万记住 VC下面使用MapX 不能用自动生成的那些文件。

当然 我说的上面这些跟你现在问题好像不是很相关了 只是告诉你了一些别的东西 等有时间再给你试试。
sin816 2008-11-16
  • 打赏
  • 举报
回复
对第二个参数做了修改如下:

CCMapXPoint point;
COleVariant searchType;
searchType.vt = VT_I4;
searchType.lVal = miSearchResultRegion;
point.Set(X1,Y1);
features = myLayer.SearchAtPoint(point, searchType);


编译通过,但运行时仍会会提示:Invalid Point object

sin816 2008-11-16
  • 打赏
  • 举报
回复
第二参数改为 miSearchResultAll,编译提示:
'SearchAtPoint' : cannot convert parameter 2 from 'enum SearchResultTypeConstants' to 'const struct tagVARIANT &'

查了一下mapx.h,发现
enum SearchResultTypeConstants
{
miSearchResultAll = 0x0000,
miSearchResultTopmost = 0x0001,
miSearchResultRegion = 0x0002,
miSearchResultPoint = 0x0004,
miSearchResultLine = 0x0008,
miSearchResultText = 0x0010,
miSearchResultMultipoint= 0x0020,
miSearchResultCollection= 0x0040
};

Tinary3v0 :请问这时第二个参数该怎么转换类型呢?

2,142

社区成员

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

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