免费视频|新人指南|投诉删帖|广告合作|地信网APP下载

查看: 3616|回复: 9
收起左侧

MAPGIS二次开发类库VC开发示例

[复制链接]

1986

主题

10万

铜板

98

好友

技术员

Network change life, change t

积分
17879

斑竹勋章地信元老

QQ
发表于 2009-12-15 08:47 | 显示全部楼层 |阅读模式
  目前mapgis二次开发库主要以API函数、MFC(Microsoft Foundation Class)类库、Com组件、ActiveX 控件四种方式提供。通常开发库以动态链接库(DLL)的形式封装。
  MAPGIS类库是为基于MFC类库的C++开发者提供的多个可重用基类,它是建立在MAPGIS API之上的一个类库层,用于支持基于MFC类库的面向对象的Windows程序设计。MAPGIS二次开发类库,提供了一套强有力的C++类,它屏蔽了基于MAPGIS API之上开发MAPGIS 实用程序的许多复杂性,同时仍然允许有经验的程序员使用底层的MAPGIS API功能。
它将应用程序所需的常见基本功能作了封装,使用便利,改动灵活。开发者只需从类库派生即可使自己的程序获得从窗口显示控制到图形查询编辑的各项功能。
  CGisView类继承了Visual C++的CView类,它封装了窗口管理的各种功能及操作,它管理了窗口的图形显示参数、操作状态,滚动条的位置、范围等基本窗口属性,具有放大窗口、缩小窗口、移动窗口、显示范围、显示比例、坐标转换等功能。CGisView 类还支持窗口的保护和快速恢复等功能。CGisView类是MAPGIS类库中大多数类的基类。
  使用VC++开发MAPGIS应用程序的最快速有效的方法就是使用MAPGIS类库。这些类已经为用户的程序与MAPGIS操作平台的接口做好了准备,用户可以体会到使用这些类可以很容易地实现MAPGIS系统里的功能,而且在实现MAPGIS系统功能的基础上用户还可以随意地添加自己想要的功能。下面我们讲述构造一个简单的MAPGIS图形显示程序的方法和基本步骤。
  首先建一个Visual C++的项目(project)。打开Visual C++工作环境,选择File菜单New命令,在弹出的对话框中选择Projects页的MFC AppWizard(EXE)项并在Project name编辑框中敲入工程名(例如:engineer),然后单击OK。这样便进入了AppWizard(向导)的第一步,在这一步里用户要选择工程类型,可以选择单文档或多文档工程,初学者最好选单文档类型;单击Next进入向导的第二步、第三步、直到完成(Finish之后OK),这几步用户可以采用默认设置。到此为止一个VC的项目已建好,然后用户的工作就是在这个项目中实现MAPGIS平台中的功能及自己想要的其他功能。
  现在我们已经建立了一个基本的基于MFC的Windows应用程序,接下来要将工程中的视(View)类改为继承CGisView类。具体操作是打开工程中的视图类的两个文件(*View.h、*View.cpp),用Visual C++查找替换功能(Edit菜单下的Rplace命令或热键Ctrl+H)分别将这两个文件中的CView字符串全部替换为CGisView,替换完毕,在工程中视图类的定义前面加入#include “cgisview.h”,这样就完成了CGisView类的继承。
  然后调用视类中的OnDraw(pDC)函数,以完成绘图工作的预先处理。在视图类的OnDraw(CDC* pDC)函数中加语句CGisView::OnDraw(pDC)。见下面示例:
   void CEngineerView::OnDraw(CDC* pDC)
   {
    CEngineerDoc* pDoc=GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    CGisView::OnDraw(pDC);
   }
  接着添加视的成员函数void _OwnerDraw(MyDC mydc)以完成MAPGIS图形显示工作。在MapGis系统中的图形显示是在_OwnerDraw(MyDC mydc)函数中完成的,而不是在OnDraw(CDC* pDC)函数中完成。对于简单的应用,直接调用基类CGisView中的_OwnerDraw(MyDC mydc)函数更方便,它会自动完成点、线、区的显示;当然用户也可以在调用_OwnerDraw(MyDC mydc)函数的基础上再添加自己的显示语句。见下面示例:
  void CEngineerView::_OwnerDraw(MyDC dc)
  {
   CGisView::_OwnerDraw(dc) ;
  }
  最后对项目配置(Setting)和Visual C++的工作环境进行必要的设置,这些设置几乎对所有MAPGIS程序(不管它是否使用类库)都很重要。
  项目配置:
  1.选择Project菜单下的Settings命令,将数据结构成员对齐方式设定为1字节,如图。
  2.把生成的可执行文件输出到MAPGIS动态连接库所在的目录下。
8.1.5 VC环境设置:
  设置头文件及库文件的路径。选择Tools菜单下的Options命令,选择Directories标签。把MAPGIS开发库头文件所在路径加入“Include files”;把MAPGIS开发引入库所在目录加入“Library Files”。
  完成这几步就可以进行编译连接,执行,在客户区单击鼠标右键你会发现弹出一个有关MAPGIS显示窗口操作的快捷菜单。但是现在建立的程序是一个“Do Nothing”的程序,在显示窗口中什么也见不到。要看到实在的图形,还得打开图形文件。下面简单介绍进一步要做的工作。
  1. 在为视类增加一个私有成员变量:
  AREA_HINST m_ahinst;
  在视类构造函数中添加语句:
  m_ahinst=_InitWorkArea(AfxGetInstanceHandle());
  在视类析构函数中添加语句:
  if(m_ahinst>0)
  _FreeWorkArea(m_ahinst);
  2. 在“文件”菜单中加入“打开点文件”、“打开线文件”、“打开区文件”菜单项,并利用ClassView在视类中增加相应的菜单命令处理函数,在命令处理函数增加语句,打开相应类型工作区,装入图形文件,把工作区加入CgisView所管理的显示工作区列表中。以“打开线文件”为例,应加入以下语句:
short lai;
if(!m_ahinst)
return;
lai=_OpenLinArea(m_ahinst);
if(lai<1)
return;
if(_LoadFile(lai)<1)
  {
   _SetChangeFlag(lai,0);
   _CloseArea(lai);
   return;
  }
_AppendArea(lai);
  这样,一个可查看图形的MAPGIS应用程序就完成了,程序运行后,可通过菜单调入多个图形文件,在程序客户区单击鼠标右键,在弹出的快捷菜单中选择“复位窗口”,就能看到全部图形。今天就讲到这里,下次再会。
轻轻的我来签到了,想带走一堆铜板...

3

主题

3305

铜板

9

好友

高级工程师

签个名儿  呆

Rank: 9Rank: 9Rank: 9

积分
684
QQ
发表于 2010-9-11 10:44 | 显示全部楼层
~~~~~~~~学习下

0

主题

378

铜板

0

好友

助理工程师

Rank: 5Rank: 5

积分
117
发表于 2012-5-12 09:44 | 显示全部楼层
学习了:lol:lol:lol
回复 支持 反对

使用道具 举报

0

主题

3830

铜板

2

好友

工程师

Rank: 7Rank: 7Rank: 7

积分
498
发表于 2012-5-12 12:15 | 显示全部楼层
貌似我们的见习就是学的楼主所讲的。。。。。。
回复 支持 反对

使用道具 举报

0

主题

183

铜板

1

好友

技术员

Rank: 3Rank: 3

积分
13
发表于 2017-1-22 21:58 | 显示全部楼层
非常感谢,谢谢分享
回复 支持 反对

使用道具 举报

0

主题

5232

铜板

1

好友

地信院士

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分
2351
QQ
发表于 2022-3-25 11:40 | 显示全部楼层
学习一哈
回复

使用道具 举报

0

主题

234

铜板

1

好友

技术员

Rank: 3Rank: 3

积分
12
发表于 2022-4-20 14:32 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

1

主题

1万

铜板

2

好友

黄金会员

Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23

积分
4853
发表于 2022-11-30 20:03 | 显示全部楼层
谢谢分享
回复

使用道具 举报

0

主题

722

铜板

1

好友

助理工程师

Rank: 5Rank: 5

积分
272
发表于 2023-5-13 15:13 | 显示全部楼层
感谢分享
回复

使用道具 举报

1

主题

725

铜板

10

好友

钻石会员

Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26

积分
8831
发表于 2023-5-24 21:23 | 显示全部楼层
感谢分享,支持一下~~~~~~~~~~~~~~~~~~~~~~~~~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
快速回复 返回顶部 返回列表