gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15945
  • QQ554730525
  • 铜币25337枚
  • 威望15352点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
阅读:3452回复:3

BBS问题集

楼主#
更多 发布于:2003-11-17 10:47
编辑、显示
Ø 悬挂线(不是弧段)如何检测,用哪个函数?
回复:使用CGisEditView::LineTopoCheck函数。
Ø 我想用一个子图把结点的位置表示出来,当结点距离较近时,放大图形,则子图跟着放大,但是我需要的是在放大时子图大小不变,如何实现?
回复:
可以在重绘函数中直接用设备坐标显示子图。实例代码如下:
void CTestEditDemoView::DispAllMap(MyDC mdc)
{
CGisEditView::DispAllMap(mdc);
D_DOT lp,dp;
double hei,wid;

lp.x = 100;
lp.y = 100;
hei = 12;
wid = 12;

_LpToDp(&lp,&dp);
_DispSubgr( mdc,1,dp.x,dp.y, hei, wid,0);

}
注意:DispAllMap是cgiseditview的虚函数,这里重载这个虚函数实现重绘。
Ø 怎样提取任意一条线转成弧段;另外,makeArc也是输入弧段,和makelineArc有什么区别?
答复:
1、您说的交互式的线提取弧段,弧段提取线的函数为:TakeArcFromLine()//线提取弧段 ,TakeLineFromArc()//弧段提取线
2、makelineArc函数即可以造线也可以造弧,它通过参数控制:arcflg == 0 造线, arcflg==1 造弧段。

Ø 从窗口点取打开的线文件中的线时不成功,代码如下,不知问题出在何处?
void CMyPrjEditView::OnLButtonDown(UINT nFlags, CPoint point) {  
//取线对应的工作区号
short i, ai ,an; long l; char mc;
AREA_HINST AHInst=GetAreaInst();
an=_GetAreaNumber(AHInst);
ai=_GetFirstAreaNo(AHInst);
// for(i=0;i……
答复:如果是独立打开点线面,您的代码没有问题,但是如果你想从工程中得到点线面,则上述代码不行,只需要修改工作区实例
{
....
MAPPROJECT prj;
prj = GetProject();
if(prj){AHInst = prj.paInst;}
...
}
Ø 用cgisview类库可调用属性数据库,而cgiseditview一些封装函数更方便使用,所以我用cgisview类库的例程替换为cgiseditview的类库,之后客户区显示图形空白,点菜单项属性数据库项能显示数据库,不知什么原因?(是否rect,draw的问题,如何解决)
答复:
出现问题是由于没有打开的工作区没有通知cgiseditview;解决的方法:
1、如果你只是处理一个点、一个线、一个面工作区,则只需要cgiseditview的函数 short SetEditArea(short ai);将工作区号设到cgiseditview中即可。以后作编辑操作都可以。
2、如果你是处理多个工作区,则我能提供的解决方案:
a、显示自己的工作区:重载CGisEditView的虚函数
void DrawBackground(MyDC dc)
{
//将自己打开的工作区显示在这里
_DispPntArea(mdc,m_mypai1);
_DispPntArea(mdc,m_mypai2);
_DispLinArea(mdc,m_mylai1);
_DispLinArea(mdc,m_mylai2);
_DispRegArea(mdc,m_myrai1);
_DispRegArea(mdc,m_myrai2);
}
b、想在自己的工作区中造点:
则重载
short GetCurrentPntArea()
{
 //将自己想编辑的点返回
  return m_mypai;//m_mypai自己打开的点工作区
}
Ø 请问二次开发中如何实现将工作区中的图转换成图像文件?
用程序开发实现,如由程序自动打开mapgis图转换为图像,实现批量转换

答复:
#include "win_out.h"
void CTestEditDemoView::OnGetgif()
{
// TODO: Add your command handler code here
MyDC mdc;
int wid,hei;
D_RECT drc;


CString fname = "d:\\temp\\creategif.gif";
CFile *pcfGifDraw = new CFile(fname, CFile::modeCreate|CFile::modeReadWrite);
wid = hei = 100;
if(!pcfGifDraw)
return;

if(!mdc)
  return;
//输入分辨率
int Resolution = 25;
_GetRange(GetEditArea(PNT),&drc);

//得到图像的高宽
wid = (int)((drc.xmax - drc.xmin)/25.4*Resolution);
hei = (int)((drc.ymax- drc.ymin)/25.4*Resolution);
//创建产生gif图像的设备场景
mdc = _GetGIFCFDC(pcfGifDraw,wid,hei);
//在设备场景中显示点(线、面)等文件
_DispPntArea(mdc,GetEditArea(PNT));
//清除设备场景
_DeleteMyDC(mdc);
//清除文件
delete pcfGifDraw;
return;


}

Ø 关于“网络编辑”和“网络分析”
我用下面的语句企图显示网络文件(.WN),弹出对话框后,选择某网络文件, 但是屏幕上没有显示出来,我已经在OnDraw函数里加入语句 CPrjEditView::OnDraw(pDC);请问问题出在哪里?
AREA_HINST m_AHInst=_InitWorkArea(NULL); short netai=_OpenNetArea(m_AHInst); _LoadFile(netai); 另外,关于网络编辑和分析的二次开发函数是哪些?怎么找不见? 比如"从线文件转成网络文件","删除网线","移动网线","列表网线属性结构", "条件编辑网线属性","自动平差建网","找最段路径","找最佳路径","上游追踪", "下游追踪","指定障碍","撤消障碍"等等这些函数是什么,在什么头文件里? 谢谢!
回复:
显示网文件:
---------------------------
#include “Net_Oper.h”
在你的视类文件头中声明成员
NET_DISP_OPT m_opt;
实现文件中
void CYourView::_OwnerDraw(MyDC mdc)
{
CPrjEditView::_OwnerDraw(mdc);
_nDispNetArea(mdc,netAi,&m_opt);
}

=================================================
有关网络分析的函数在”Net_Oper.h” 中
Ø 请教各位大虾flashpnt
    我用Gisview::_flashpnt()函数闪烁一个点时,发现闪烁的点总比图上位置高(闪烁了一个不存在的点).而且放大倍数越多两点越靠近.不知是为何,请高手解答
答复:
检查闪烁的点的图元号是否和你想要的图元号是否一致。
可以尝试在鼠标左键响应消息调用以下代码做测试:
::OnLButtonDown(UINT nFlags, CPoint point)
{
long  ptNo;
D_DOT  xy;
_WpToLp(&point,&xy);
ptNo = _NearPnt(ai,&xy);
if(ptNo>0)
 _FlashPnt(ai, &ptNo, 1);
}
Ø MakePoint()的使用?
装入“工程文件”后,如果执行窗口放大_OpenWindow()等改变窗口的命令的话,地图会消失的。我现在装入工程文件后都是正常的,各种操作能进行,只是我还想用装入文件(不是工程文件)的方式管理地图,想一次就装入指定的地图(点线区文件),不想选三次对话。
回复:
因为CPrjEditView只负责管理一个工程,所以你自己打开的工作区需要自己管理,除非你将打开的工作区添加到工程中。所以你想在自己的工作区中造点失败,也是这个原因。
我能提供的解决方案:
1、显示自己的工作区:
重载CGisEditView的虚函数
void DrawBackground(MyDC dc)
{
//将自己打开的工作区显示在这里
_DispPntArea(mdc,m_mypai);
_DispLinArea(mdc,m_mylai);
_DispRegArea(mdc,m_myrai);
}
2、想在自己的工作区中造点:
则重载
short GetCurrentPntArea()
{
 if(m_editmyarea) //变量控制是编辑自己的工作区还是工程中的工作区
 //将自己想编辑的点返回
  return m_mypai;//m_mypai自己打开的点工作区
 else
  return (CPrjEditView::GetCurrentPntArea());//返回工程中的工作区
}

Ø 再问MakePoint()的使用
在5.32版本下,无论在工程文件(.mpj)中的点线区文件中,还是在普通的点线区文件中造点,造线,造弧段都是可以的, 在6.0版本下,在普通的点线区文件中造点,造线,造弧段都是可以的,但是在工程文件中(.mpj)就不可以,只能拷贝,删除等。是不是因为上述原因,造成了在二次开发时,我以前的帖子提到的用 MakePoint()函数出现的一些现象:“用LoadPoint()——装入点文件时,造点函数MakePoint()完全正常。然后退出程序,重新编译,选择 _PRJLoadAProject(...)——装入工程文件后,地图出现在屏幕上,工程文件中的点文件已经处在编辑状态下。使用MakePoint(),弹出对话框,供选择点图元的颜色,大小等各种属性,“确定”后,弹出长条对话框,供输入注释内容,至此,与装入点文件 LoadPoint()产生的效果相同。输入完内容确定后,屏幕上没有任何反应(而在装入点文件的状况下,输入的注释马上写在屏幕上了)。这时的点文件应该是在编辑状态下,因为我选择复制,删除点等菜单,功能执行正常。请指教。  
答复:
在工程中若要添加一个元素,对应的工作区必须是"当前可编辑状态",而不仅仅是“编辑状态”(“编辑状态”下可以复制,删除操作,但不能做添加操作)
Ø 颜色库、系统库不能即时刷新  
当更换了slib库时,GISEDIT下的工作区不能即时刷新,除非退出程序后重启,怎样解决?
答复:
如果是用vc++开发,更换了slib库后,调用_ChangeMAPGISLib();(map_out.h)
如果是用vb开发,更换了slib库后调用Declare Function bChangeMAPGISLib Lib "mapdsp60" Alias "#12" () As Integer(map_out.bas). 它将及时刷新系统库。
Ø 请问在程序中用函数“short _PRJDelete(MAPPROJECT prj,int index);”删除工程文件后,如何从PrjListView视中删除相应的Item项?  
答复:
PrjListView中有一个函数 void ReloadPrjItems(); //重新更新显示
Ø 如何取得CPrjEditView视窗口的背景色
答复: CGisEditView::中的成员变量long DeleteCollor;就是当前窗口背景的颜色号

Ø 从prjeditvie派生的类如何使窗口中没有十字丝
我想从cprjeditview中派生一个视类,但又不想窗口中总是出现一个随着鼠标的十字丝,该如何处理?
答复:这个问题很容易解决:调用CGisEditView中的函数SelectSysSelectParm(),将“使用大十字光标”的勾去掉即可。
Ø 能否讲讲OnDraw和_OwnerDraw这两个虚函数?
答复:
OnDraw()是MFC提供的虚函数,_OwnerDraw()是Mapgis提供的虚函数。
_OwnerDraw(MyDC mdc)给开发者提供了一个更加简洁的重绘方法,它将设备场景(mydc)都准备好,开发者可以直接调用mapgis相应的显示函数。
Ø 我的地图怎么每次总要复位一次才显示好啊
内  容: 我的视图类不管是从CGisView派生还是从CPrjEdit中派生,怎么一开始显示时总是很小,非要复位一下才能够正常大小,应该怎么做使程序一开始运行显示的地图就是正常大小啊,而不需要每次都调_RestoreWindow()
答复:每次重新装入新数据时调用复位函数,并更新窗口即可。
Ø 请教光标的问题
内容:在移动窗口时,我想用自己的手型光标代替MapGIS的缺省手型光标,不知是否可行?
 我是继承CGisEditView来做开发的。谢谢!
答复:可以。具体步骤如下:
1、mapgis的移动窗口的消息宏为#define IDMN_GisView_MOVE              0xDFFB
因此你可以直接截获此消息,自己进行相应处理。首先增加一个菜单项,此菜单项的值需和mapgis的移动窗口的消息宏相同。
2、在消息列表中添加
BEGIN_MESSAGE_MAP(CTool_DemoView, CGisEditView)
..
ON_COMMAND(IDMN_GisView_MOVE, OnMovewindow)//添加

3、添加相应的响应函数:
CTool_DemoView::CTool_DemoView()
{
// TODO: add construction code here
m_myCursor = LoadCursor(NULL,IDC_IBEAM);
}

CTool_DemoView::~CTool_DemoView()
{
  DestroyCursor(m_myCursor);
}
//移动窗口
void CTool_DemoView::OnMovewindow()
{
CGisEditView::OnMoveWindow();
SetClassLong(m_hWnd,GCL_HCURSOR,(long)m_myCursor);
}
Ø 有关打印的问题
我是用从CGisEditView派生类的方法进行二次开发的,您能指导给我一个最简单的方法,把视类中点线面工作区的内容打印下来吗? 最好是不另外生成文件。谢谢!
答复:直接调用CGisEditView中的函数:
void PrintRectPartMap();//打印输出
void PrintMap();
Ø 请教一个最基本问题:初始化工作区实例后,打开并装入一个文件,图形不显示,是何原因?
内容: //初始化工作区实例
if ((m_ahInst=_InitWorkArea(m_hInstance))<= 0)
{
  AfxMessageBox("初始化工作区实例失败!");
  return 0;
}
_GetEnv();
_SetEnv();
//打开工作区,装入文件
if ((ai=_OpenArea(myApp->m_ahInst,REG))<=0)
{
  AfxMessageBox("打开工作区失败!");
  return;
}
if (_LoadFile(ai)<=0)
{
  _CloseArea(ai);
  return;
}
 //_AppendFile(ai);
if (_AppendArea(ai)<=0)
{
  return;
}
//SetEditArea(ai);
_RestoreWindow();
答复:如果您是继承CGisView的画,需要在OnDraw函数中加上一句话
CGisView::OnDraw(pDC);
例如:
void CBBSTstView::OnDraw(CDC* pDC)
{
CBBSTstDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CGisView::OnDraw(pDC);
}
&Oslash; 请问函数_GetAreaList()函数的用法?
答复:
该函数是取出工作区号的列表,添加工作区号到列表中用函数_AppendArea,_SetAreaList
举例:
  _AppendArea(a1);
  _AppendArea(a2);
short *aiLst;
_GetAreaList(&aiLst);
如果调用函数成功,aiLst[0]中存放工作区的数目,aiLst[1]...aiLst[n]中存放的为工作区号。可用循环语句得到工作区号:
for(i=1;i<=aiLst[0];i++)
{
  ai = aiLst;
}
&Oslash; 怎样在资源管理器下双击“.MPJ”文件能在我得程序中直接打开工程文件,请教老师该怎样修改才能达到目的?谢谢!
在文档类中打开工程文件的函数如下:
BOOL CLxDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if(!CDocument::OnOpenDocument(lpszPathName))
return FALSE;
m_Prj = _PRJLoadAProject((char *)lpszPathName);
if(!m_Prj)
return FALSE;
return TRUE;
}


喜欢0 评分0
gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15945
  • QQ554730525
  • 铜币25337枚
  • 威望15352点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
1楼#
发布于:2003-11-17 10:47
回复:
  需要在你的应用程序的实例初始化的地方加几行代码来支持此功能:
  DragAcceptFiles和EnableShellOpen的详细说明可以看MSDN的相关文档。

  代码:
  BOOL CLxApp::InitInstance()
  {
// create main MDI Frame window
CMainFrame* pMainFrame = new CMainFrame;
if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
return FALSE;
m_pMainWnd = pMainFrame;
...


//支持用户在资源管理器中把相应的文件直接拖放到你的应用程序中,并自动打开
m_pMainWnd->DragAcceptFiles();

//支持用户在资源管理器中双击文件,直接启动你的应用程序中,并自动打开文件
EnableShellOpen();
RegisterShellFileTypes(TRUE);


...
// Parse command line for standard shell commands, DDE, file open
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
  }
&Oslash; 如何屏蔽CGISEDITVIEW类中的右键菜单
内容: 我想用自己的内容去替换CGISEDITVIEW类中的右键菜单中的内容。如何实现在误差校正中的右键复位窗口时选择显示工作区的功能。
答复:CGisView中有成员变量:m_hGisViewPopMn,通过它你可以直接控制右键菜单(利用windows对菜单处理函数)。
&Oslash; 我怎样实现街道名称定位的功能:即把所查街道及周围的地图挪到屏幕中间,并闪烁地名。
回复:
下面的例程为将一个点图元挪到屏幕中间
//处理底图跳转
D_DOT fxy;
D_RECT frc;
double w,h;
WIN_ORG wxy;  

_GetWinDispParam(hGrpWnd,&wxy);
frc=wxy.frc;
_GetPntPos(Arrayglt_Pntai,pArrayglt_noPi[1],&fxy); if((fxy.x<frc.xmin)||(fxy.x>frc.xmax)||(fxy.y<frc.ymin)||(fxy.y>frc.ymax)) //跳!
{
w=frc.xmax-frc.xmin;
h=frc.ymax-frc.ymin;
frc.xmin=fxy.x-(w/2.0);
frc.xmax=fxy.x+(w/2.0);
frc.ymin=fxy.y-(h/2.0);
frc.ymax=fxy.y+(h/2.0);
_ResetWinDispRange(hGrpWnd,&frc);
UpdateWindow();
  }

&Oslash; 为何例子VCPRJDEMO.DSP的菜单更改编译二次后资源文件已修改,而执行程序中仍显示以前的内容。
答复:
  因为这个例子用到了客户化菜单功能,解决办法:点击例子中的"设置/用户定制菜单"菜单项,弹出对话框,点击“装入原始值”按钮,即可解决。
&Oslash; 请教装入文件的几个函数的问题
ENGview.h中已定义如下:
public: short ai,pi,li;
AREA_HINST m_AHInst;
HINSTANCE hInst;
ENGview.cpp中,
void CENGTRYView::OnLoadallfile(){ MyDC pdc; pdc=_GetMyDC(); /// p467 hInst=AfxGetInstanceHandle();m_AHInst=_InitWorkArea(hInst);///p101 ai=_OpenRegArea(m_AHInst); //ai:p103打开区区工作区 pi=_OpenPntArea(m_AHInst); //pi:p103点工作区 li=_OpenLinArea(m_AHInst); //li:p103线工作区 _LoadFile(ai); _LoadFile(pi); _LoadFile(li); // _LoadAFile("C:\\mapgis60\\sample\\testlayer206\\region.wp",ai); //ai:区工作区 // _LoadAFile("c:\\mapgis60\\sample\\testlayer206\\point.wt",pi); //pi:点工作区 // _LoadAFile("c:\\mapgis60\\sample\\testlayer206\\line.wl",li); //li:线工作区 _DispRegArea(pdc,ai); /// P250显示区工作区 _DispPntArea(pdc,pi); _DispLinArea(pdc,li); _DeleteMyDC(pdc); ///P242 }
问题:1.上述语句能够弹出对话框,选择三个文件,但是窗口最大化后,地图消失? 该怎么办?
2.如果换成注释中装入指定文件的函数,弹出对话框,说:执行了非法操作, 错在哪里?这在5.32版本时,运行正常的啊! 注:如果改成只用LoadLine(); LoadPoint(); LoadRegion(); //497 这三个函数,则运行正常。  

回复:
1、没有显示是因为你没有通知CGisView哪些工作区需要重画。
解决办法:将打开的工作区成功后,调用_AppendArea(short ai)即可:
例如:

ai=_OpenRegArea(m_AHInst);
_LoadFile(ai);
_AppendArea(ai);
 
2、_LoadAFile("c:\\mapgis60\\sample\\testlayer206\\line.wl",li)异常是因为不能直接将字符串常量作为参数传入(VC6 版本原因),修改方法:
char fileName[MAX_PATH];
lstrcpy(fileName,"c:\\mapgis60\\sample\\testlayer206\\line.wl");
_LoadAFile(fileName,li);

&Oslash; 安装MAPGISSDK60出问题
请中地人回答,俺安装MAPGISSDK60时出现找不到子图库和汉字库并且用其API编一个程序运行时也出现上述问题我已经安装了MAPGIS60且和MAPGISSDK60在同一个盘上俺急着等坐使用,HELP ME
答复:
找到将你安装的mapgis60\program目录下的mconfig.gis文件,拷贝到你的开发程序的运行目录下即可。

&Oslash; _ViewStruct()没有文件显示?
_ViewStruct(m_hWnd,ahInst); 我企图使用此函数浏览指定工作区的属性结构,可是弹出的“选择文件属性类型”对话框中,只有文件“NONAME0.WL",“NONAME0.WT",“NONAME0.WP"三个文件,我的工程文件中的所有文件都没有显示,该怎么办?代码如下: void CMyView::OnViewstruct() { ahInst=GetAreaInst(); _ViewStruct(m_hWnd,ahInst); }
回复:
你是想取工程中的工作区列表,需这样调用:
{
_ViewStruct(m_hWnd,m_Prj->paInst);
}
并且将头文件project.h包含。


&Oslash; 文件图层信息问题
    如何将mapgis文件中的图层信息读出,我在二次开发帮助中找不到相关的函数.
回复:
图层操作在头文件"win_area.h",如
/*取当前层号
参数:入口  ai   - 工作区号
     出口  *curlay -当前层号
返回: 成功1,失败则返回0
*/
    short WINAPI _GetCurLayer(short ai,short *curLay);
//取当前层名
    /*layName 必须至少有LAYER_NAME_LEN个字节*/
    short WINAPI _GetCurLayerName(short ai,char *layName);

/*判断某一层是否有图元*/
    short WINAPI _IsALayHasElement(short ai,short layer);
&Oslash; 请问在VC6.0中进行MAPGIS6.0二次开发环境如何设置?
    我的开发环境是windows98、mapgis6.0 、mapgissdk6.0和vc6.0。希望能够详细讲解,
答复:
1、vc的环境配置:
假设你的开发动态库在目录c:\sdk\dll下;lib库在:c:\sdk\lib下;头文件在:c:\sdk\include下。
假设你开发的工程应用程序为:MyTry.exe
对应vc的设置为:
vc菜单[project]->[project setting]->[general]->[output files]: c:\sdk\dll
vc菜单[project]->[project setting]->[link]->[output file name]: c:\sdk\dll\mytry.exe
vc菜单[tools]->[options]->[directories]->{include files}:c:\sdk\include
vc菜单[tools]->[options]->[directories]->{library files}:c:\sdk\lib
2、再将mapgis的系统环境(工作目录、系统库目录、临时目录)配置好。
其它
&Oslash; 怎样统计出区工作区中均具有某一指定属性的所有区实体中的点实体
答复:
用属性检索函数:
long *lpool;
lpool = _AttAskToList(rai,REG);
返回检索到的实体数:其中lpool[0]中放实体数目,lpool[1],..放对应的实体号。

&Oslash; _SelectFileAttType(...)函数显示的“选择工作区”、“属性”两栏中为空白,_EditAtt(...)函数无功而返,不知应如何操作?
答复:
1、_SelectFileAttType(...)没有效果,最大的可能是此函数的第一个参数AREA_HINST ahInst对应没有工作区。你应该将你用来打开工作区的实例句柄传到这个函数中,举例:
short ai,type;
AREA_HINST ahInst =  _InitWorkArea(NULL);
short pai  = _OpenArea(ahInst,PNT);
_SelectFileAttType(ahInst,m_hWnd,1,&ai,&type);
_EditAtt(m_hWnd,ahInst );
......
&Oslash; 二次开发程序编译连接无错误,运行后出现提示:不能打开子图、图案、线形、颜色及汉字库,这是为什么,请指教。
答复:
如果提示是:“不能打开子图库,不能打开线型库..“等类似的描述,那么它并不是错误,解决的方法是:将mapgis运行程序目录下的mconfig.gis文件拷贝到你的开发库目录下
&Oslash; 怎样取出属性字段的名称,利用((**stru).fldEntry[]).fieldname 没有返回值,不知为何?
答复:你对属性字段的操作的理解应该没有问题,但注意一下指针使用,如果您定义
CATT_STRU *stru,想得到属性的第一个字段,用((*stru).fldEntry[0]).fieldname;如果您定义CATT_STRU stru,想得到属性的第一个字段,用stru.fldEntry[0].fieldname;
&Oslash; 如何读取图元的属性数据
内容:我用_GetAttr()函数得到了属性结构,函数说明上说能够得到属性记录数据,但我怎么也弄不出来给定实体的属性记录,这个函数应该怎么用啊,是否能得到,如果不能应该用什么函数啊,最好给一小段例程

答复:其实属性纪录数据已经以二进制代码形式放入到_GetAtt的第四个参数中,接下来只需要解析第四个参数即可。mapgissdk提供了对应的函数:比如_CvtFldToString,它是将某一字段的内容以字符串形式返回。以下为简单的实例代码,它实现了把当前的线工作区中的第一号元素的第一条纪录的值取出来:
CATT_STRU * stru;
char* att;
char* pstruBuf;
short fldType;
long lno;
short fldi;
lno = 1;//第一号元素
fldi = 1;//第一条纪录
if(_GetLinAtt(ai,lno,&stru,&att)<=0)
   return ;
pstruBuf = new char[256];
_CvtFldToString(stru,att,fldi,pstruBuf,256,&fldType,NULL);
AfxMessageBox(pstruBuf);
delete[]pstruBuf;
&Oslash; 如何使用函数_GetAreaFileName1(short ai,char *fname,short len);参数fname和len怎么设置?请指教,谢谢!
答复:
_GetAreaFileName1的功能是取工作区文件名(不包括路径)其中: fname - 文件名字符串地址,  len   - fname长度 ; 成功返回1,失败返回0。比如:
char fname[MAX_PATH];
      short len;
      fname[0] = 0;
     _GetAreaFileName1(ai,fname,MAX_PATH*sizeof(char));
&Oslash; 功能类似于_SelectAreaList()函数,但每次只能选择单个文件,mapgissdk60中有这样的现成函数吗?另外,怎样获得图幅范围,类似于_SelectAreaList()生成的选择文件对话框的下部显示的那样?请指教,谢谢!
答复:1、每次只选择单个文件的函数名为_SelectArea();
  2、获得图幅范围的函数为:short WINAPI _GetRange(short ai,D_RECT *rect);
&Oslash; 怎样使用函数_DelStruFldOnNumb(short ai,short aType,short fldi),执行完后,本该删除掉的字段还保留在属性结构中,为什么?请指教,谢谢!
答复:你是否是用循环来操作此函数,如果是的需要从属性结构的尾部进行删除。打个很简单的例子:如果有四个属性结构,删除了第二个属性结构后,则原来第四个属性结构变成了第三个属性结构。所以for(i=0;i<Num;i++){_DelStruFldOnNumb(..i);}和for(i=Num-1;i<=0;i--){_DelStruFldOnNumb(..i);}是不相同的。

&Oslash; 用sdk60开发,编译连接时出现下面错误:
内容:我遇到下面的问题请您帮助解决,谢谢!用sdk60开发,编译连接时出现下面错误:
c:\MAPGISSDK60\LIB\w60operD.lib : fatal error LNK1106: invalid file or disk full: cannot seek to 0x39859ffe
答复:您可以通过vc帮助查询LNK1106错误的原因,有可能是:
(1)你的磁盘太满以至不能完成编译。清出一些空间重新编译联结。
(2)是否通过网络进行了共享动态库,lib,h等操作,vc编译器不支持这种模式下的编程。
(3)您的硬盘可能有坏磁道;
以上的情况是通过您提供的LNK 1106得出的结论,希望能尽快帮您找到问题。
&Oslash; 我想在一个条件查询对话框中打开数据库,找出满足条件的记录号,在调用程序中对这些记录进行处理,为了简化,写了以下一个小程序不知为什么,无法得到相应的记录号,请指正。
void get(int* ii)
{
int* nn;
nn=new int[5];
for(int m=0;m<5;m++)
  nn[m]=m;
ii=nn;
}

void test()
{
int* p;
test(p);

CString s;
s.Format("p=%d",p[0],p[1],p[2],p[3],p[4]);
AfxMessageBox(s);
}
答复:主要是指针的原因,您可以参考c语言教程。
void get(int** ii)
{
int *nn;
nn=new int[5];
for(int m=0;m<5;m++)
  nn[m]=m;
*ii=nn;//!!
}

void test()
{
int* p;
get(&p);//送指针的地址

CString s;
s.Format("p=%d,%d,%d,%d,%d",p[0],p[1],p[2],p[3],p[4]);
AfxMessageBox(s);
delete[]p;
}
&Oslash; 请教输入表达式函数_InputExpresion(....)的用法。尤其是参数char *expStr的设置。
答复:_InputExpresion(....)是输入表达式
参数含义:hWnd:父窗口句柄
expStr:表达式缓冲区(可以初始给定一个表达式)
        len:缓冲区长度
        title:窗口标题          
ptFldAlias:字段别名数组;
如果按下OK按钮则函数返回IDOK,输入的表达式由expStr传出。
//示例代码
char expStr[128];
CATT_STRU *stru;
short flg=0;

expStr[0]=0;
ai = _OpenArea(ahInst,REG);
_LoadFile(ai);
_GetAttStru(ai,REG,&stru);
strcpy(expStr,"面积>=0"); //该句可要可不要(只是对话框弹出来时的初始表达式)
if(_InputExpresion(m_hWnd,stru,expStr,128,"表达时",NULL)==IDOK)
{
   //......
}

_CloseArea(ai);
&Oslash; 在用mapgis二次开发进行距离的计算时(《mapgis开发手册》,函数中的参数如何使用:_CalculateLength(D_DOT *xy,long len)
答复:D_DOT *xy--点坐标序列
      long -len --点序列的数目
举例:
  D_DOT *xy;
  xy = new D_DOT[5];
  xy[0].x = 10;xy[0].y = 19;
  xy[1].x = 20;xy[1].y = 29;
  xy[2].x = 30;xy[2].y = 39;
  xy[3].x = 40;xy[3].y = 49;
  xy[4].x = 50;xy[4].y = 59;
  _CalculateLength(xy,5);
  delete[]xy;
&Oslash; 我在利用函数_LoadFile(short ai)向一个工作区添加文件时,如果在工作区实例中已经打开了这个文件,就会出现"文件不能重复装入"的错误提示,请问我该如何判断用户是否又打开已经打开的文件呢,在利用_LoadFile()函数时?
答复:short WINAPI _IsOpenArea(short ai);是判断工作区是否打开(1-打开,0-没打开)
&Oslash; _LoadAFile对话框中文件类型选择中又乱码。不知怎么回事?
short WINAPI _LoadAFile(char *datName,short ai,char *szDSN=NULL,char *szLOG=NULL,char *szPSW=NULL);
答复:此函数没有对话框显示,如果出现乱码,考虑:
1、是否是一字节对齐;
2、字符串是否初始化。
 
作  者:
 DZYW
 发言时间:
 01-8-29 22:05
 
&Oslash; 在mapgis6.1版本中,输出成EPS文件,为何出现aihead.ps文件打不开的错误提示,而文件中的确有此文件,请问这是为什么?注:mapgis6.1为下载版本,原为6.0版本。
答复:6.1版中应该使用aihead.eps文件。

&Oslash; 如何在MAPGIS内核之前获得当前工作目录  
内容:最近这几天一直在为获得自已程序起动时的所在目录烦恼,直到今天才查出原因所在。
按常规,在CWinApp::InitInstance() 中调用 ::GetCurrentDirectory() API 函数可以取得程序起动时的目录,但是,当引用MAPGIS的CGisView后,MAPGIS内核提前把当前目录改成了MAPGIS系统环境目录中的工作目录。当你不使用MAPGIS的类,把CMyView:CGisView 改成CMyView:CView之后,编译重运行,立即可以获得正确的程序启动目录。因此,在InitInstance()中不能再使用::GetCurrentDirectory() AIP 函数取当前目录了。在特定场合下,是必需要获得程序启动的初始目录的。在这里请教mapgis,如何在MAPGIS内核之前获得当前工作目录?,希望获得mapgis或各位高手指导。
回复:
char szBuff[_MAX_PATH];
VERIFY(::GetModuleFileName(m_hInstance, szBuff, _MAX_PATH));
long len = lstrlen(szBuff);
char ch = szBuff[len-1];
do
{
len--;
ch = szBuff[len-1];
}while(ch!='\\');

szBuff[len-1]='\0';

&Oslash; 现在有如下的问题是:
&Oslash; 1.我能否可以从当前打开的文件中提取出只属于该文件的图层名称或序号,如果可以该如何实现?
&Oslash; 2._TurnLayerSwitch(),_TurnOnOffAllLayer(),自己进行调用后,例如将层开关设为Off后,仍然显示.
&Oslash; 3.有关取图层信息板和图层开关板函数如何使用!请举例
答复:
1、可通过函数实现:
for(short i=0;i<MAX_LAYNUM;i++)
{/*判断某一层是否有图元*/
    short HaveElement =  _IsALayHasElement(ai,i);
    if(HaveElement)
TRACE( "area is %d at layer = %d has element\n", ai, i );
else
TRACE( "area is %d at layer = %d has not element\n", ai, i );

}
2、3 图层的函数普遍较为简单,尝试调用下面的函数
void CloseAllLay()//关闭所有图层
{
    _TurnOnOffAllLayer(GetCurrentLinArea(),0);
    _TurnOnOffAllLayer(GetCurrentPntArea(),0);
    _TurnOnOffAllLayer(GetCurrentRegArea(),0);
}

举报 回复(0) 喜欢(0)     评分
peng8748
论坛版主
论坛版主
  • 注册日期2003-08-07
  • 发帖数1712
  • QQ
  • 铜币52枚
  • 威望0点
  • 贡献值0点
  • 银元0个
2楼#
发布于:2003-11-17 21:41
顶,想问楼主,可有VB方面的?我十分想学.
有什么要求PM我 email : peng8748@163.com
举报 回复(0) 喜欢(0)     评分
gis1117
  • 注册日期
  • 发帖数
  • QQ
  • 铜币
  • 威望
  • 贡献值
  • 银元
3楼#
发布于:2003-11-18 09:53
有些培训教程和例子,可以联系我,发给你
举报 回复(0) 喜欢(0)     评分
peng8748
论坛版主
论坛版主
  • 注册日期2003-08-07
  • 发帖数1712
  • QQ
  • 铜币52枚
  • 威望0点
  • 贡献值0点
  • 银元0个
4楼#
发布于:2003-11-19 14:26
以下是引用gis1117在2003-11-18 9:53:38的发言:
有些培训教程和例子,可以联系我,发给你


我想要一个完整的.
有什么要求PM我 email : peng8748@163.com
举报 回复(0) 喜欢(0)     评分
游客

返回顶部