C++ Builder中实现MAPX的Feature
2004-11-14 11:59
309 查看
昨天试了一天的Feature,现在还存在的问题有:
1)无法将CMapX***Disp 转换成 tagVariant, 例如例子中,创建线及区域时, 无论你写成下面的任何一种,都创建不成功,
Map1->Layers->_Item(Variant(1))->CreateRegion(points, EmptyParam);//编译失败
Map1->Layers->_Item(Variant(1))->CreateRegion(Variant((IUnknown *)points), EmptyParam);//运行创建不成功
应该写为:
Map1->Layers->_Item(Variant(1))->CreateRegion(Variant((CMapXPoints*)points), EmptyParam);//运行创建不成功
而只好改用下面的两行代码:
feature = Map1->FeatureFactory->CreateRegion(EmptyParam, EmptyParam);
feature->Parts->Add(points);
2)下面的示例中保留了一个错误,就是用 下面的代码创建Feature时,程序退出会抛出异常。现在还没找到解决的方法,也只好改用其它的方法,如 CreateRegion中使用的方法
CMapXFeatureDisp line;
line.Bind(StringToOleStr("MapX.Feature.5"));
line.Attach(Map1->OleObject);
3)文本显示不能显示在层上(已解决):.
将原来的Variant("文本图元")改为Variant(WideString("文本图元"))就可以了,但如果有中文,则没了后面的四个字节,只显示“文本”。
示例代码:
void __fastcall TfrmFeature::Map1MouseUp(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{ //只向 动画层中加图元
if((Button != mbLeft) || (placeFeatureId == -1)) return;
if(Map1->Layers->Count == 0 ){
log("日志", "没有图层或动画图层, 不能完成添加Feature的工作");
placeFeatureId = -1;
return;
}
//动作名称
String strFeature;
CMapXPointDisp point;
//生成的图元
CMapXFeature * feature = NULL;
point.Bind(StringToOleStr("MapX.Point.5"));
point = Map1->ConvertCoordP(Variant(X), Variant(Y), miScreenToMap);
switch (placeFeatureId)
{
case 0:{
CMapXPointDisp p1;
CMapXPointDisp p2;
p1.Bind(StringToOleStr("MapX.Point.5"));
p2.Bind(StringToOleStr("MapX.Point.5"));
p1.Set_(point.get_X() -1.0, point.get_Y() + 0.2);
p2.Set_(point.get_X() + 0.4, point.get_Y() -0.4);
feature = Map1->FeatureFactory->CreateArc(p1, p2, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
Map1->Layers->_Item(Variant(1))->AddFeature(feature, EmptyParam);
strFeature = "形似弧的线图元";}
break;
case 1:{
feature = Map1->FeatureFactory->CreateCircularRegion(miCircleTypeMap, point, Variant(30), EmptyParam, Variant(99), EmptyParam);
Map1->Layers->_Item(Variant(1))->AddFeature(feature, EmptyParam);
strFeature = "似圆的区域";}
break;
case 2: {
//这样做, 在退出程序时,会报异常
CMapXFeatureDisp line;
line.Bind(StringToOleStr("MapX.Feature.5"));
line.Attach(Map1->OleObject);
line.Type = miFeatureTypeLine;
line.Style = Map1->DefaultStyle;
CMapXPointsDisp points;
points.Bind(StringToOleStr("MapX.Points.5"));
double x = point.get_X();
double y = point.get_Y();
points.AddXY(x - 1, y - 0.5);
points.AddXY(x - 0.5, y + 0.5);
points.AddXY(x, y);
points.AddXY(x + 0.5, y - 0.5);
points.AddXY(x + 1, y + 0.5);
line.Parts->Add(points);
//feature = Map1->FeatureFactory->CreateLine(EmptyParam, EmptyParam);
Map1->Layers->_Item(Variant(1))->AddFeature(line, EmptyParam);
line->Attach(NULL);
strFeature = "线, 退出会异常,请用添加区域的方法";}
break;
case 3: {
CMapXPointsDisp points;
points.Bind(StringToOleStr("MapX.Points.5"));
double x = point.get_X();
double y = point.get_Y();
points.AddXY(x - 1, y - 0.5);
points.AddXY(x - 0.2, y + 0.7);
points.AddXY(x + 0.3, y - 0.1);
points.AddXY(x + 0.8, y + 0.6);
feature = Map1->FeatureFactory->CreateRegion(EmptyParam, EmptyParam);
feature->Parts->Add(points);
Map1->Layers->_Item(Variant(1))->AddFeature(feature, EmptyParam);
strFeature = "区域图元";}
break;
case 4: {
feature = Map1->FeatureFactory->CreateSymbol(EmptyParam, EmptyParam);
feature->set_Point(point);
Map1->Layers->_Item(Variant(1))->AddFeature(feature, EmptyParam);
strFeature = "点图元";}
break;
case 5: {
Variant caption = "文本图元abcdefg";
caption.ChangeType(0x8);
feature = Map1->FeatureFactory->CreateText(EmptyParam, caption, EmptyParam, EmptyParam);
feature->set_Point(point);
Map1->Layers->_Item(Variant(1))->AddFeature(feature, EmptyParam);
strFeature = "文本图元";}
break;
default:
;
}
placeFeatureId = -1;
log("日志", strFeature + "位置 x:" + String(point.get_X()) + " y:" + String(point.get_Y()) +( feature == NULL ?" faile":" secc"));
1)无法将CMapX***Disp 转换成 tagVariant, 例如例子中,创建线及区域时, 无论你写成下面的任何一种,都创建不成功,
Map1->Layers->_Item(Variant(1))->CreateRegion(points, EmptyParam);//编译失败
Map1->Layers->_Item(Variant(1))->CreateRegion(Variant((IUnknown *)points), EmptyParam);//运行创建不成功
应该写为:
Map1->Layers->_Item(Variant(1))->CreateRegion(Variant((CMapXPoints*)points), EmptyParam);//运行创建不成功
而只好改用下面的两行代码:
feature = Map1->FeatureFactory->CreateRegion(EmptyParam, EmptyParam);
feature->Parts->Add(points);
2)下面的示例中保留了一个错误,就是用 下面的代码创建Feature时,程序退出会抛出异常。现在还没找到解决的方法,也只好改用其它的方法,如 CreateRegion中使用的方法
CMapXFeatureDisp line;
line.Bind(StringToOleStr("MapX.Feature.5"));
line.Attach(Map1->OleObject);
3)文本显示不能显示在层上(已解决):.
将原来的Variant("文本图元")改为Variant(WideString("文本图元"))就可以了,但如果有中文,则没了后面的四个字节,只显示“文本”。
示例代码:
void __fastcall TfrmFeature::Map1MouseUp(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{ //只向 动画层中加图元
if((Button != mbLeft) || (placeFeatureId == -1)) return;
if(Map1->Layers->Count == 0 ){
log("日志", "没有图层或动画图层, 不能完成添加Feature的工作");
placeFeatureId = -1;
return;
}
//动作名称
String strFeature;
CMapXPointDisp point;
//生成的图元
CMapXFeature * feature = NULL;
point.Bind(StringToOleStr("MapX.Point.5"));
point = Map1->ConvertCoordP(Variant(X), Variant(Y), miScreenToMap);
switch (placeFeatureId)
{
case 0:{
CMapXPointDisp p1;
CMapXPointDisp p2;
p1.Bind(StringToOleStr("MapX.Point.5"));
p2.Bind(StringToOleStr("MapX.Point.5"));
p1.Set_(point.get_X() -1.0, point.get_Y() + 0.2);
p2.Set_(point.get_X() + 0.4, point.get_Y() -0.4);
feature = Map1->FeatureFactory->CreateArc(p1, p2, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
Map1->Layers->_Item(Variant(1))->AddFeature(feature, EmptyParam);
strFeature = "形似弧的线图元";}
break;
case 1:{
feature = Map1->FeatureFactory->CreateCircularRegion(miCircleTypeMap, point, Variant(30), EmptyParam, Variant(99), EmptyParam);
Map1->Layers->_Item(Variant(1))->AddFeature(feature, EmptyParam);
strFeature = "似圆的区域";}
break;
case 2: {
//这样做, 在退出程序时,会报异常
CMapXFeatureDisp line;
line.Bind(StringToOleStr("MapX.Feature.5"));
line.Attach(Map1->OleObject);
line.Type = miFeatureTypeLine;
line.Style = Map1->DefaultStyle;
CMapXPointsDisp points;
points.Bind(StringToOleStr("MapX.Points.5"));
double x = point.get_X();
double y = point.get_Y();
points.AddXY(x - 1, y - 0.5);
points.AddXY(x - 0.5, y + 0.5);
points.AddXY(x, y);
points.AddXY(x + 0.5, y - 0.5);
points.AddXY(x + 1, y + 0.5);
line.Parts->Add(points);
//feature = Map1->FeatureFactory->CreateLine(EmptyParam, EmptyParam);
Map1->Layers->_Item(Variant(1))->AddFeature(line, EmptyParam);
line->Attach(NULL);
strFeature = "线, 退出会异常,请用添加区域的方法";}
break;
case 3: {
CMapXPointsDisp points;
points.Bind(StringToOleStr("MapX.Points.5"));
double x = point.get_X();
double y = point.get_Y();
points.AddXY(x - 1, y - 0.5);
points.AddXY(x - 0.2, y + 0.7);
points.AddXY(x + 0.3, y - 0.1);
points.AddXY(x + 0.8, y + 0.6);
feature = Map1->FeatureFactory->CreateRegion(EmptyParam, EmptyParam);
feature->Parts->Add(points);
Map1->Layers->_Item(Variant(1))->AddFeature(feature, EmptyParam);
strFeature = "区域图元";}
break;
case 4: {
feature = Map1->FeatureFactory->CreateSymbol(EmptyParam, EmptyParam);
feature->set_Point(point);
Map1->Layers->_Item(Variant(1))->AddFeature(feature, EmptyParam);
strFeature = "点图元";}
break;
case 5: {
Variant caption = "文本图元abcdefg";
caption.ChangeType(0x8);
feature = Map1->FeatureFactory->CreateText(EmptyParam, caption, EmptyParam, EmptyParam);
feature->set_Point(point);
Map1->Layers->_Item(Variant(1))->AddFeature(feature, EmptyParam);
strFeature = "文本图元";}
break;
default:
;
}
placeFeatureId = -1;
log("日志", strFeature + "位置 x:" + String(point.get_X()) + " y:" + String(point.get_Y()) +( feature == NULL ?" faile":" secc"));
相关文章推荐
- C++算法系列之日历生成的算法代码
- 谁来关心我们这些程序员
- ATL实现Connection Point的一种简单的方法
- 我的应聘总结!
- Microsoft Visual Studio .NET 2003制作安装程序
- javascript表单之间的数据传递!
- 我的发现!
- PHP 的 MySQL 操作类,跟手册上的函数一样用,但是更方便了。多说无益,看了就知道了。
- Java测试规范(引用)
- 在线等,一个十万火急的问题
- 独具量身定做特色的管理软件--数据大师
- oracle中的分页
- Java面试题目
- 新思创OA功能列表
- delphi中的时间操作技术(2)
- VB五子棋问题,请高手赐教
- 解析IP地址为主机域名
- 将某一主机域名解析为IP地址
- 输入输出流为什么要用缓冲区?
- 引用一个人的说法看中国软件需求基础