页面载入中....
如何在VC++6.0中使用MapWinGIS控件(之一)
By  小鱼 发表于 2008-3-27 19:11:00 

    对于MapWinGIS控件的介绍,以及怎样在.Net环境和其他RAP语言环境(如VB、Delphi等)下使用该控件,网上的资料已经很多了,在此我不再罗嗦,直接进入主题,介绍一下如何在VC++6.0环境下使用MapWinGIS(PS:万里云的博客里对MapWinGIS有些介绍,在那里他曾提到过在VC++6.0环境下使用MapWinGIS有些问题,单并未进行介绍,在此写一篇东西,把自己的学习过程和大家一起探讨一下)。

    用过超图的组件式开发平台(SuperMap Objects)的朋友,可能对下面介绍的方法会有印象,SuperMap是通过两步来将控件完全添加到工程中的:一、通过【Project---Add To Project---Components and Controls…--- Registered ActiveX Controls---SuperMap Control】的方法将注册的ActiveX控件插入到工程中,形成封装类;二、通过【View---ClassWizard---Add Class---From a type library】的方法,从外部类型库文件(*.tlb),将其他剩余的对象引入到工程中,形成封装类。(上述操作包括菜单、窗体按钮等操作,熟悉 VC++6.0的朋友都能看懂,否则就不要继续往下看了,呵呵)。

    问题便在此提出了,SuperMap Objects是用C/C++开发的,对于VC++6.0是可以完美结合的,但MapWinGIS是在Visual Studio 2003.net环境下开发的,所以上面的第二步便会出现问题(编译MapWinGIS源码工程,在工程目录下会产生一个MapWinGIS.tlb文件,这就是该COM对象的类型库),编译程序会出现如下错误提示:
D:\Test\mapwingis.cpp(3530) : error C2082: redefinition of formal parameter 'result'
D:\Test\mapwingis.cpp(3535) : error C2440: 'return' : cannot convert from 'struct tagVARIANT *' to 'int'
 This conversion requires a reinterpret_cast, a C-style cast or function-style cast

    暂且不管这两个错误是什么原因,以及如何进行解决。我们将采用另一种方式进行处理,这里又将引入第二个相关知识面——ADO (在此对ADO就不进行详细介绍了,我将在另一篇文章里介绍它的使用,敬请关注我的博客http://yunaoting.gissky.net) 。其用法为,在stdafx.h文件中加入如下几行代码:
#import "c:\\program files\\common files\\system\\ado\\msado15.dll" no_namespace rename(EOF, EndOfFile)

两者有异曲同工之处,对MapWinGIS的引入方法为:
       #import "MapWinGIS.ocx" rename_namespace("MapWinGIS") rename("GetObject", "MapWinGISGetObject")
    之后变可以用智能指针(smart pointer)的方式来使用MapWinGIS中的对象了。所以总结出的步骤仍是两步:

一、通过【Project---Add To Project---Components and Controls…--- Registered ActiveX Controls---Map Control】的方法将Map控件插入到工程中,形成封装类;

二、在stdafx.h文件中引入MapWinGIS控件库,将其他的对象引入工程中(MapWinGIS.ocx需要在工程目录下,否则请指定全路径):#import "MapWinGIS.ocx" rename_namespace("MapWinGIS") rename("GetObject", "MapWinGISGetObject");

有以下几点需要注意:
1、  如果工程是文档---视图结构的话,就要用到控件的动态创建;
     a.选择View菜单中的Resource Symbols,创建一个新的资源ID,命名为IDC_MAP;
     b.调用Create函数进行动态创建对象m_mapMain.Create(NULL, WS_VISIBLE, CRect(0,0,100,100), this, IDC_MAP)
2、  控件的事件处理,需要创建一个事件槽(eventsink),这也是在VC6环境下使用MapWinGIS复杂性的主要表现。具体方法如下:

    a.在View类的头文件中,在DECLARE_MESSAGE_MAP()行下加入DECLARE_EVENTSINK_MAP();

    b.在View类的实现文件中加入如下代码:
BEGIN_EVENTSINK_MAP(CTestMapWinGISView,CView)
END_EVENTSINK_MAP()
需要响应的事件便在上两行代码之间进行映射。

如,鼠标松开事件,加入下面一行代码:
ON_EVENT(CTestMapWinGISView,IDC_MAP,2,OnMouseUp,VTS_I2 VTS_I2 VTS_I4 VTS_I4) 然后在类的头文件中增加函数声明:
    afx_msg void OnMouseUp(short _button,short _shift,long _x,long _y);
最后在类的实现文件中增加函数实现即可;

这里的事件处理只是做个了简单说明,将在下一篇文章中详细介绍事件处理的使用方法。(未完,待续... ...)

 
阅读全文 | 回复(0) | 引用通告 | 编辑
  • 标签:MapWinGIS VC 6.0 
  • 发表评论:
    页面载入中....

     
    站点公告
    页面载入中....
    站点日历
    页面载入中....
    最新日志
    页面载入中....
    最新评论
    页面载入中....
    最新留言
    页面载入中....
    友情链接
    站点统计
    页面载入中....
    日志搜索
    用户登陆
    页面载入中....



     
    Powered by Oblog.