gis1117
  • 注册日期
  • 发帖数
  • QQ
  • 铜币
  • 威望
  • 贡献值
  • 银元
阅读:6060回复:34

在vc中作用mapx(从二次开发教程书本中扫描)[转帖]

楼主#
更多 发布于:2003-12-10 14:40


在VisualC++中使用MapX

    本章将通过一些实例来介绍如何在VisualC++中使用MapX。

    17.1  访问MapX的属性和方法
    在VisualC++中使用MapX的方法不同于VisualBasic和C++Buildel;在VisualC++中,每个MapX对象是一个C++类,这些类在MapX.h文件中声明,在MapX.cpp文件中实现
这些C++类的名称与MapX对象的名称相同,在对象名称前面加上CMapX就构成了类各例如,数据集(Dataset)对象对应的类名为CMapXDataset。

17.1.1  访问MapX的属性
    MapX对象的属性是通过C++类的成员函数来实现的。例如,像数据集对象的可读/写属性Name是由CMapXDataset类中的两个成员函数实现的:一个用于设置属性的值,另一个
用于得到属性的值。这些成员函数的名称是在属性名称前加Get或Set而成。
    例如:
    CString GetName();
    void SetName{LPCTSTR);
    只读属性只有Get成员函数,而没有Set成员函数。

17.1.2  访问MapX的方法
    MapX对象的方法通过与该方法同名的成员函数实现。许多方法的参数是const VARIANT&,这意味着成员函数要求传递一个类型为VARIANT的变量。
    同时许多方法的一些参数对于像VisualBasic或其他脚本语言来说是可选择的,但是在Visual C++中,当调用这些方法时,必须设置所有的参魏所有的可选参数都是VARIANT
类型。可以利用如下方法调用带可选参数的MapX方法:
    VARIANT vtOptional;
    vtOptional.Vt = VT_ERROR;
    vtOptional.scode = DISP_E_PARAMNOTFOUND;
    为了在方法中便于调用标准的C++类型而不是VARIANT,在MapX.h和MapX.cpp中重载了大多数MapX方法但是一些方法没有重载,如果需要使用,用户可以自己重载这些
方法。
    在MapX.h中的C++类都是从MFC的COleDispatchDriver类派生而米  所有的属性和方法最终都调用IDispatch->Invoke()来告诉MapX的OCX做什么COleDispatchDriver通常能正确调用从属性或方法返回的IDispatch指针的Release()函数,但是还是有一些需要特别
注意的地方。当一MapX对象通过它的IDispatch接口被传递给一事件句柄时,必须确保不
要释放该指针,因为传递给事件的对象没有调用AddRef函数来增加引用计数。

    17.2  创建MapX控件

    本节将通过创建一个MapX应用程序来介绍如何在VisualC++中创建MapX控件。
    [实例17.1]  首先选择File菜单中的New命令,弹出New对话框。选择MFCAppWizard(exe),并在ProjectName中输入MapxSample作为工程名称。然后单击OK按钮,进入应用程序向导的第一步。通过应用程序向导创建一多文档界面应用程序。
    在创建MapX控件之前,必须将MapX.h和MapX.cpp文件加入到工程中。对于Visual C++5.0及以上版本,从Project菜单中选择Add To Project > Files命令,打开InsertFiles into Project对话框,选择MapX.cpp和MapX.h文件加入到工程中。
    注意:不要选择Project菜单中的Add TO Project > Components And Controls命令。如果选择该命令加入MapX控件,将创建一新的.cpp丈件,但是该文本没有
    包括所有的MapX对象。
    在工程中加入MapX.h和MapX.cpp文件后,在包含该控件的MapxSarnpleView中加入MapX对象的头文件。如下所列:
    #include "MapX.h"
    ClaSS  CMapxSampleVieW : publiC  CView
    {
         protected;
         CMapX  m_ctrlMapX;
    }
    然后需要为MapX创建一资源ID来代表该控件。其步骤如下:
    (1)选择View菜单的ResourceSymbols命令,打开ResourceSymbols对话框。
    (2)在ResourceSymbols对话框中单击New命令按钮,弹出NewSymbol对话框。
    (3)在NewSymbol对话框中输入IDC_MAP作为名称。
    通过类向导创建CMapxSampleView类的WM_CREATE和WM_SIZE消息映射函数,然后切换到MapxSampleView.cpp中,在CMapxSampleView::OnCreate中加入如下所列的代码,用于创建地图;
    //--------------------------------------------------------------
    int CMapxSampleView::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
        if(CView::OnCreate(lpCreateStruct)  ==  -1)
        retrun -1;

//使用默认的大小创建地图,在resize消息影射函数中调整地图的大小,使它充满整个//客户区
        if(!m_ctrlMapX.Create(NULL,WS_VISIBLE,CRect(0,0,100,100),this,IDC_MAP))
                return -1;
    return 0;
   }

在CMapxSampleview::OnSize中加入如下所示的代码,用于调整地图的大小:
void CMapxSampleview::OnSize(UINT nType, int cx, int cy)
{
        CView::OnSize(nType, cx, cy);
        
        //调整地图的大小,使它充满整个客户区
        if(cx != 0 && cy != 0)
                m_ctrlMapX.MoveWindow(0,0,cx,cy,TRUE);
}

    同样通过类向导创建WM_SETFOCUS消息映射函数,在其中加入如下所列的代码,用于确保窗口获取焦点时,地图控件获得焦点:
void CMapxSampleview::OnSetFocus(CWnd* pOldWnd)
{
        CView::OnSetFocus(pOldWnd);
        
        m_ctrlMapX.SetFocus();
}

  至此,应用程序的基本框架已经完成。可以编译并运行程序了。其程序运行界面如图17.1所示。
    
但是上面的程序只能显示地图,除此之外没有其他任何功能。下面我们要加入放大、缩小、漫游、选择等功能。
    打开IDR_MAPXSATYPE菜单,在“查看”菜单中加入如下所列的菜单项:

      上一个视图,ID_CONTEXT_PREVIOUSVIEW
    整个地图,   ID_VIEW_VIEWENTIREMAP
    分隔符号
    属性... ,   ID_VIEW_PROPERTIES
    图层控制,  ID_VIEW_LAYERCONTROL
    分隔符号...
    然后加入一“工具”菜单,在该菜单中加入如下一些菜单项:
    箭头,      ID_MAP_TOOL_ARROW
    分隔符号
    放大,    ID_MAP_TOOL_ZOOMIN
    缩小,   ID_MAP_TOOL_ZOOMOUT
    漫游,    ID_MAP_TOOL_PAN
    居中,    ID_MAP_TOOL_CENTER
    分隔符号
    选择,    ID_MAP_TOOL_SELECT
    圆选,    ID_MAP_TOOL_RADIUSSELECT
    矩形选,  ID_MAP_TOOL_RECTANGLESELECT
    分隔符号
    距离,    ID_MAP_TOOL_DISTANCETOOL
    信息,    ID_MAP TOOL_INFOTOOL
    通过类向导,创建这些命令的ON_COMMAND消息映射函数,在其中加入如下所列的代码:
    //--------------------------------------------
    void CMapxSampleView :: OnViewViewentiremap()
    {
       m_ctrlMapX.SetZoom(m_ctrtMapX.GetGeoSetWidth());
喜欢0 评分0
echo2003
点子王
点子王
  • 注册日期2003-07-28
  • 发帖数2453
  • QQ76947571
  • 铜币5473枚
  • 威望1点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
1楼#
发布于:2003-12-10 15:55
UP!
举报 回复(0) 喜欢(0)     评分
party9ly
路人甲
路人甲
  • 注册日期2004-01-12
  • 发帖数17
  • QQ
  • 铜币56枚
  • 威望0点
  • 贡献值0点
  • 银元0个
2楼#
发布于:2004-01-12 14:48
顶!希望这种例子多以些!学习除了概念,例子也很重要。
举报 回复(0) 喜欢(0)     评分
collision
路人甲
路人甲
  • 注册日期2004-03-27
  • 发帖数3
  • QQ
  • 铜币117枚
  • 威望0点
  • 贡献值0点
  • 银元0个
3楼#
发布于:2004-05-16 15:23
<P>再将一些别的呀!!!!</P>
举报 回复(0) 喜欢(0)     评分
felong
路人甲
路人甲
  • 注册日期2004-08-02
  • 发帖数5
  • QQ
  • 铜币114枚
  • 威望0点
  • 贡献值0点
  • 银元0个
4楼#
发布于:2004-08-11 18:54
<img src="images/post/smile/dvbbs/em02.gif" />
举报 回复(0) 喜欢(0)     评分
zhengwenxin
路人甲
路人甲
  • 注册日期2004-07-18
  • 发帖数37
  • QQ
  • 铜币208枚
  • 威望0点
  • 贡献值0点
  • 银元0个
5楼#
发布于:2004-09-01 23:34
不懂
举报 回复(0) 喜欢(0)     评分
henan_lujun
路人甲
路人甲
  • 注册日期2004-08-19
  • 发帖数18
  • QQ
  • 铜币167枚
  • 威望0点
  • 贡献值0点
  • 银元0个
6楼#
发布于:2004-09-10 08:31
<P>你的贴子,我怎么看不到啊,哪位下了这本书的,就行行好,E我一份吧,我的地址是:<a href="mailthenan_lujun@163.com" target="_blank" >henan_lujun@163.com</A>   ,  多谢了,救命的!</P>
[此贴子已经被作者于2004-9-10 8:32:44编辑过]
举报 回复(0) 喜欢(0)     评分
party9ly
路人甲
路人甲
  • 注册日期2004-01-12
  • 发帖数17
  • QQ
  • 铜币56枚
  • 威望0点
  • 贡献值0点
  • 银元0个
7楼#
发布于:2004-09-10 22:36
<P>看不见</P>
举报 回复(0) 喜欢(0)     评分
sshj_mil
路人甲
路人甲
  • 注册日期2004-09-08
  • 发帖数62
  • QQ
  • 铜币131枚
  • 威望0点
  • 贡献值0点
  • 银元0个
8楼#
发布于:2004-09-13 14:18
怎么看不到啊?
举报 回复(0) 喜欢(0)     评分
henan_lujun
路人甲
路人甲
  • 注册日期2004-08-19
  • 发帖数18
  • QQ
  • 铜币167枚
  • 威望0点
  • 贡献值0点
  • 银元0个
9楼#
发布于:2004-09-13 20:18
真的看不到啊,那位楼主可否再来一次,或者说一下怎么看啊
举报 回复(0) 喜欢(0)     评分
上一页
游客

返回顶部