Editor: 地图的编辑
一、功能描述
本工程主要演示地图几何对象的编辑,即添加、编辑、删除、移动几何对象,添加、删除、编辑节点等。二、类及方法
用到的类方法
CSeWorkSpace Close、GetDataSourceAt、GetDataSourceCount、GetMaps、IsOpen、Open
CSeMapWnd AddLayer、Close、GetAction、GetLayer、GetLayerAt、GetLayerCount、
InitialEditTextStyle、MoveBottom、MoveDown、MoveTop、MoveUp、OnDraw、
OnInitialUpdate、OnLButtonDblClk、OnLButtonDown、OnLButtonUp、
OpenMap、Refresh、RemoveLayerAt、SaveToMap、SetAction、SetEditableLayer、
ViewEntire
CSeDataSource GetAlias、GetDatasetCount、GetDataset、GetDatasetAt
CSeDataset GetName、GetType
CSeMaps AddMap、GetMapCount、GetMap、GetMapAt 、GetMapCount、GetMapNameAt、
SetMap
CSeLayer GetDataset
CSeLayerDef IsEditable、IsSelectable、IsSnapable、IsVisible、SetSelectable、SetSnapable、
SetVisible
三、说明及约定
1、工程说明
本工程为单文档类型的工程,提供菜单和工具条两种操作方式
菜单中提供“文件、地图和编辑”三组菜单,其中:
“文件”中提供“打开地图、添加图层、关闭和退出”四个菜单项;
“地图”中除了放大、缩小、平移、点选、框选、整幅显示和刷新外,还提供“图层管理”功能;
“编辑”中有“选择编辑层、添加点、添加线、添加面、添加文本、文本编辑、移动对象、删除对象、增加节点、编辑节点和删除节点”十一个菜单项。
工具条除地图基本操作功能外,增加了对象编辑工具条,提供的功能分别与菜单中“编辑”中的功能和资源相对应。
2、打开地图文件的约定
判断是否已经有地图文件打开,有则关闭;
打开地图文件后,就判断有没有地图,如果有地图,弹出打开地图对话框,选择打开地图,然后刷新地图窗口,显示地图;如果没有地图,新建一个地图Untitled,等待添加地图(文件—添加图层);
对图层的操作,可通过“地图—图层管理”菜单进行。
3、编译程序的约定
eSuperMap 类库支持VC++、EVC++ 3.0 和 EVC++ 4.0三种开发环境,同时支持PDA的各种设备类型、
各种CPU类型的动态连接库和静态连接库,在编译的时候,需要指定eSuperMap类库的头文件和库文件的搜索路径。
在EVC集成开发环境中,设置搜索路径方法,选择ToolsÆ Options Æ Directories选中指定的运行平台、CPU类型,然后开始设置包含头文件和库文件的路径:
1、设置头文件的搜索路径,选择Include Files , 添加一个路径搜索项,把eSuperMap类库的头文件目录SeRSFC选进来即可;
2、设置库文件的搜索路径,选择Library Files , 添加一个路径搜索项,把eSuperMap类库的相应的库文件目录选进来即可,比如:
具体设置请参见联机帮助中的开发环境设置。
四、实现过程
注:本工程是在地图基本操作工程MapOperation基础上进行的对象编辑,它的一些实现步骤和MapOperation相同,这里只介绍重要的实现步骤和方法,详细的对象编辑参见editor工程和MapOperation 工程(有详细的注释)。
1、新建一个单文档界面的工程,命名为editor;
2、改造原有的菜单,按“三、说明及约定”中第一条所说的设置;
3、改造原有的工具条,按“三、说明及约定”中第一条所说的设置;
4、添加三个对话框类:CDlgSelect、CDlgLayerManager、CDlgSelectLayer,其中:
CDlgSelect是在选择要打开的地图或选择要添加的数据集时使用,添加的成员变量和函数如下:
定义变量:
CComboBox m_cmbDataSource;  //数据源列表
CListCtrl m_lstDataset; //数据集列表
CImageList m_ImageList; //数据集类型图像列表
bool        m_bMap; //列表框中是否显示地图名【输入】
m_strMapName; //地图名【输出】
CString
CString  m_strDatasourceAlias; //数据源别名【输出】
m_strDatasetName; //数据集名【输出】
CString
成员函数:
void AddMap(); //将地图名加入列表框中
void BuildColumns(int nCols, int *nWidth, CString *csCol); //创建列表框的列
void BuildRows( int nRows, CString *pcValue, int nImage ); //创建列表框的行
void AddDataset();  //将数据集信息加入列表框中
OnInitDialog();      //初始化对话框
BOOL
virtual
virtual void OnOK(); //响应确定按钮操作
afx_msg void OnCancel(); //响应取消按钮操作
OnSelchangeComboDatasource(); //更新数据集列表
afx_msg
void
使用说明:
当点击“文件—打开地图”时,如果文件存在地图,则打开该对话框,该对话框中显示的是地图名称列表,选择相应的地图名,就可以打开了,如果没有地图,则新建一个地图,再点击“文件—添加图层”,弹出该对话框,这时对话框显示的是当前工作空间的所有数据源及其相应的数据集列表,选择要添加的数据集即可。
***************************************************************************************** CDlgLayerManager是图层管理对话框类,可以实现图层的移动、属性的设置等功能,添加的成员变量和函数如下:
成员变量:
CSeMapWnd  *m_pMapWnd;  //用以显示地图【输入】
Int  m_nCurRow;  //当前选中的行
BOOL  m_bLstClicked;
//当显示比例Edit聚焦后判断,失去焦点后,是否点击了listLayer 成员函数:
BOOL FillList();            //将图层名添加到列表中
void SetMoveButtonState(int nRow); //设置移动按钮的状态
void CSeDlgLayerManager::OnButtonDelete() //删除图层
void CSeDlgLayerManager::OnButtonMoveBottom()  //移动图层到最底层
void CSeDlgLayerManager::OnButtonMoveDown() //图层下移
void CSeDlgLayerManager::OnButtonMoveTop() //移动图层到最顶层
void CSeDlgLayerManager::OnButtonMoveUp() //图层上移
void CSeDlgLayerManager::OnCheckSelectable() //设置图层是否可选择
void CSeDlgLayerManager::OnCheckSnapable() //设置图层是否可捕捉
void CSeDlgLayerManager::OnCheckVisible() //设置图层是否可见
//点击图层列表,显示图层的属性信息(如可编辑等)
void CSeDlgLayerManager::OnClickListLayer(NMHDR* pNMHDR, LRESULT* pResult)
BOOL CSeDlgLayerManager::OnInitDialog() //初始化
void CSeDlgLayerManager::OnKillfocusEditMaxscale() //设置最大比例
void CSeDlgLayerManager::OnKillfocusEditMinscale() //设置最小比例
CSeDlgLayerManager::OnOK() //关闭对话框,保存地图
void
void CSeDlgLayerManager::OnSetfocusEditMaxscale()  //判断显示最大比例文本框是否聚焦
void CSeDlgLayerManager::OnSetfocusEditMinscale() //判断显示最小比例文本框是否聚焦使用说明:
点击“地图—图层管理”菜单时,显示该对话框,对话框中将列出当前地图中图层的名字,提供图层移
动的按钮和图层属性的设置选择按钮等功能。
***************************************************************************************** CDlgSelectLayer是选择可编辑图层对话框类,添加的成员变量和函数如下:
成员变量:
CSeMapWnd  *m_pMapWnd;//用以显示地图【输入】
CString      m_strLayerName; //可编辑图层名【输出】
成员函数:
void SetLayerName();    //设置图层名
CString GetLayerName(); //得到图层名
BOOL CDlgSelectLayer::OnInitDialog(); //初始化
void CDlgSelectLayer::OnOK();      //关闭对话框,并将选择的图层名赋给m_strLayerName变量void CDlgSelectLayer::OnSelchangeComboLayername(); //更新图层列表
使用说明:
在编辑几何对象前,需要选择可编辑图层,点击“编辑—选择编辑层”菜单时,显示该对话框,对话框中将列出当前地图中图层的名字。
5、在editorView.h中定义成员变量,并在构造函数中初始化:
CSeMapWnd  m_MapWnd; //用以地图显示
BOOL m_bFileOpened; //地图是否打开
CString  m_strEditableLayer; //可编辑图层名
CEditorView::CEditorView()
{//初始化一些成员变量
m_bFileOpened = false;
m_strEditableLayer="";
}
6、在editorView.cpp中实现具体函数(按照菜单和工具条):
文件—打开地图
void CEditorView::OnFileOpen()
{
//默认打开第一幅地图,否则新建Untitled地图,等待添加图层
_T("pmw|pmw|*.*"), NULL, OFN_HIDEREADONLY |
dlgFile(true,
CFileDialog
OFN_OVERWRITEPROMPT,_T("WorkSpace Files (*.pmw)|*.pmw") );
if( dlgFile.DoModal() == IDOK )
{
//如果已经打开工作空间文件,则关闭
if(theApp.m_WorkSpace.IsOpen())
{
theApp.m_WorkSpace.Close();
m_MapWnd.Close();
false;
m_bFileOpened
=
}
/
/获得图形文件的完整路径及文件名
CString strFileName = dlgFile.GetPathName();
//打开工作空间
if( theApp.m_WorkSpace.Open( strFileName ) )
{
theApp.m_WorkSpace.GetMaps();
=
CSeMaps
*pMaps
)
pMaps
if(
{
CSeMapDef MapDef;
//有地图,则打开
if ( pMaps->GetMapCount() != 0 )
{
CDlgSelect dlg;
editor at largedlg.m_bMap = true;
IDOK
)
=
if
=
(
dlg.DoModal()
{
if( pMaps->GetMap( dlg.m_strMapName, MapDef ) )
{
if(m_MapWnd.OpenMap(MapDef))
{
m_MapWnd.Refresh();
}
}
}
}
//没有默认地图,则新建地图
else
{
_T("Untitled");
=
MapDef.m_strMapName
);
MapDef
pMaps->AddMap(
}