||
设计菜单,分别实现 新建、打开和保存地图文档(.Mxd)的功能。
步骤:(1)定义一个NewMapDoc()方法;
(2)定义一个SaveMapDoc()方法;
(3)定义一个SaveMapDocAs()方法;
(4)定义一个OpenMapDoc()方法;
(5)新建一个菜单“新建地图文档”,调用NewMapDoc()。新建一个菜单“保存地图文档”,如果 当前是已经打开的Mxd,则调用SaveMapDoc();如果当前打开的不是Mxd而只是一些图层,则调用SaveMapDocAs()。新建一个菜单“地图文档另存为”,调用SaveMapDocAs()。
(6)新建一个菜单“打开地图文档”,根据不同的情况调用上述方法:
如果地图中没有文件,则直接调用OpenMapDoc()方法。
如果地图中有文件,可能是打开的Mxd,也可能不是Mxd而只是一些图层;询问是否保存,如果选择保存,则之前打开过Mxd的情况下调用SaveMapDoc()方法,之前打开的不是Mxd而只是图层的情况下调用SaveMapDocAs()方法,然后清除掉当前图层,调用OpenMapDoc()方法;
如果选择不保存,则清除掉当前图层,调用OpenMapDoc()方法。
可能出现的问题:
(1)新建的地图文档首先需要保存到一个位置,如D://engine//test.mxd,但后续操作修改了这个mxd后,无法通过SaveMapDoc()方法保存上。
原因是调用SaveMapDoc()方法时,axMapControl1.DocumentFilename中未存储之前NewMapDoc()或OpenMapDoc()时打开的mxd(D://engine//test.mxd)。
解决办法:NewMapDoc()或OpenMapDoc()方法需要返回axMapControl1.DocumentFilename值。见public string NewMapDoc().
(2)保存地图文档时,可能会出现“ 发生锁定冲突。(异常来自 HRESULT:0x80030021 (STG_E_LOCKVIOLATION)”。
原因是之前打开的mxd未关闭。
解决办法:NewMapDoc()和OpenMapDoc()中需要添加一句“pMapDocument.Close();”
代码如下:
public string NewMapDoc() { SaveFileDialog SaveFileDlg = new SaveFileDialog(); SaveFileDlg.Title = "输入需要新建地图文档的名称"; SaveFileDlg.Filter = "地图文件(*.mxd)|*.mxd"; SaveFileDlg.ShowDialog(); string strDocFileN = string.Empty; strDocFileN = SaveFileDlg.FileName; if (strDocFileN == string.Empty) return null; pMapDocument = new MapDocumentClass(); pMapDocument.New(strDocFileN); pMapDocument.Open(strDocFileN, ""); axMapControl1.Map = pMapDocument.get_Map(0); axMapControl1.DocumentFilename =pMapDocument.DocumentFilename; pMapDocument.Close(); return axMapControl1.DocumentFilename; }
public void SaveMapDoc() { if (axMapControl1.DocumentFilename != null) { if (axMapControl1.CheckMxFile(axMapControl1.DocumentFilename)) { pMapDocument = new MapDocumentClass(); pMapDocument.Open(axMapControl1.DocumentFilename, ""); if (pMapDocument.get_IsReadOnly(pMapDocument.DocumentFilename)) { MessageBox.Show("地图文档是只读的!"); pMapDocument.Close(); return; } pMapDocument.ReplaceContents((IMxdContents)axMapControl1.Map); pMapDocument.Save(pMapDocument.UsesRelativePaths, true); pMapDocument.Close(); MessageBox.Show("地图保存成功!"); } } else { SaveMapDocAs();; } }
public void SaveMapDocAs() { SaveFileDialog SaveFileDlg = new SaveFileDialog(); SaveFileDlg.Filter = "地图文档文件(*.mxd)|*.mxd"; SaveFileDlg.Title = "选择保存路径"; SaveFileDlg.OverwritePrompt = true; SaveFileDlg.RestoreDirectory = true; if (SaveFileDlg.ShowDialog() == DialogResult.OK) { string sMxdFileName = SaveFileDlg.FileName; pMapDocument = new MapDocumentClass(); pMapDocument.New(sMxdFileName); pMapDocument.ReplaceContents((IMxdContents)axMapControl1.Map); pMapDocument.Save(pMapDocument.UsesRelativePaths, true); pMapDocument.Close(); MessageBox.Show("保存完毕!"); } else { return; } }
public string OpenMapDoc() { //下面这几句是为了在“打开地图ToolStripMenuItem_Click”中少添加代码而放在这里的。 axMapControl1.Map.ClearLayers(); axMapControl1.Refresh(); axTOCControl1.Refresh(); OpenFileDialog OpenFileDlg = new OpenFileDialog(); OpenFileDlg.Title = "选择需要加载的地图文档文件"; OpenFileDlg.Filter = "地图文档文件(*.mxd)|*.mxd"; OpenFileDlg.ShowDialog(); string strDocFileN = OpenFileDlg.FileName; if (strDocFileN == string.Empty) return null; //将数据加载入pMapDocument并与map控件联系起来 pMapDocument = new MapDocumentClass(); pMapDocument.Open(strDocFileN); for (int i = 0; i < pMapDocument.MapCount; i++) { axMapControl1.Map = pMapDocument.get_Map(i); } axMapControl1.DocumentFilename = pMapDocument.DocumentFilename; pMapDocument.Close(); axMapControl1.Extent = axMapControl1.FullExtent; axMapControl1.Refresh(); return axMapControl1.DocumentFilename; }
在“打开地图文档”的菜单中添加如下代码:
private void 打开地图ToolStripMenuItem_Click(object sender, EventArgs e) { if (axMapControl1.LayerCount == 0)//如果当前地图中没有图层,就直接打开新mxd { //没有图层也可以先清除图层吧 OpenMapDoc(); } else //当前地图中有图层的情况。清除图层的代码放在OpenMapDoc()了, 否则每次都得把清除的代码放上。 { if (MessageBox.Show("是否保存当前地图?", "确认信息", MessageBoxButtons.OKCancel) == DialogResult.OK)//要保存当前地图 { if (axMapControl1.DocumentFilename == null) { SaveMapDocAs(); OpenMapDoc(); } else { if (axMapControl1.CheckMxFile(axMapControl1.DocumentFilename))//之前打开mxd { pMapDocument = new MapDocumentClass(); if (pMapDocument.get_IsReadOnly(axMapControl1.DocumentFilename)) { MessageBox.Show("本地图文档是只读,不能保存"); return; } else//之前打开的mxd不是只读,可以保存,保存后清除图层, { SaveMapDoc(); //再调用打开地图文档方法 OpenMapDoc(); } } } } else //当前有图层,但是不保存,就清除掉,然后打开新的mxd { OpenMapDoc(); } } }
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-9-25 09:13
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社