MAPX在VC中的开发

// -----------------------------------------------------------------------
// Reference: <MapInfo MapX 5.0 开发人员指南>
// -----------------------------------------------------------------------

<1> 控件加入到工程:

MapInfo MapX 5.0 开发人员指南指出, 不应该采用的方法:Project –> Add To Project –> Components and Controls,找到Registered ActiveX Controls –> MapInfo MapX V5,单击Insert。但是这插入的将是不完整的,不应该采用。

正确的方法:在项目中包含控件示例程序中提供的MapX.cpp和MapX.h文件。把这两个文件拷贝到工程目录下,Project –> Add To Project –> Files,找到MapX.cpp和MapX.h,单击OK。

<2> 控件的创建

假定,工程类型为MFC exe工程,sdi类型,工程向导各选项采用默认设置。注意需要选中ActiveX Control一项。

首先在CView或其派生类中声明成员变量CMapX m_ctrlMap;

然后为控件提供一个资源ID,如IDC_MAP。View –> Resource Symbols,选择New…

重载视图类的OnCreate()函数,也就是创建WM_CREATE消息处理程序。在创建视图时创建MapX控件。

MapX控件的Create()函数有两个原型(见MapX.h),这里我们采用后一个,即非虚函数的那个。

if (!m_ctrlMap.Create(NULL, WS_VISIBLE, CRect(0, 0, 100, 100), this, IDC_MAP))

{return –1;}

为保证控件的大小随着CView窗口的大小变化而变化,重载视图类的OnSize()函数,也就是创建WM_SIZE消息处理程序。可使用m_ctrlMap.MoveWindow(0, 0, cx, cy, TRUE)。

为保证控件可靠地获得焦点,可以重载CView的OnSetFocus(),使控件在视图获得焦点的同时也获得焦点。可使用m_ctrlMap.SetFocus()。

从上面几项操作我们可以注意到:由于CMapX的基类是CWnd,所以窗口的操作和特性等对于MapX控件也是通用的。

// -----------------------------------------------------------------------
// Reference: <MapInfo MapX 5.0 开发人员指南>
// -----------------------------------------------------------------------

<1> 控件加入到工程的方法(续)

MapX开发人员指南指出, 通过Project –> Add To Project –> Components and Controls这种方法来将MapX控件加入VC++工程是不可行的. 但是如果硬要试一试, 会怎么样呢?

在\Registered ActiveX Controls中找到MapInfo MapX V5, 并点击"Insert", 在弹出对话框中选择"确定", 则会出现一个Confirm Classes对话框. 此对话框的列表中包含了好几十个CCMapX类; 每个类前面的单选框, 表示要生成对应的.cpp和.h文件(在下方有提示).

对比MapX开发人员指南, 我们知道, 在正确的做法下, 工程里应该只有mapx.cpp和mapx.h两个文件. 现在却多出来这么多文件, 显然是不行的. 我们只要设法得到MapX.h和MapX.cpp两个文件就好, 具体做法, 就是把Confirm Classes对话框里所有其他类前面的单选框勾号都去掉, 只保留最上面的一个CCMapX; 其次, 要在下面的三个输入框里分别把Class name改为CMapX(这是为了和MAPX.H声明的类名保持一致), 把Header file改为MapX.h, 把Implementation file改为MapX.cpp. 点击"OK".

这时我们在对话框资源编辑器的Control工具条里就能看到MapX的图标了. 并且, VC也为我们在工程文件夹里生成了对应的文件MapX.h和MapX.cpp.

<1> - A:

不过还没完. 下一步是用正确的头文件和实现文件去替换VC生成的那个. 先关闭工程, 从MapX例程文件夹里里把MAPX.H和MAPX.CPP拷贝出来, 到工程文件夹里覆盖掉MapX.h和MapX.cpp; 其次把工程里的.aps, .clw, .ncb文件删除.

再打开工程, 这时在左侧的类视图ClassView里就看到多出来好多个CMapX类, 而不是先前的只有CMapX一个类了. VC会自动生成新的.aps和.ncb文件.

这时再通过Ctrl + W调出类向导Class Wizard. 由于删除了.clw文件, 会弹出对话框询问你是否要build之, 选择"是". 此后在Select Source Files对话框里单击右下角的"Add All", 再单击"OK". 这样类向导就出来了. VC会自动生成新的.clw文件.

<1> - B:

对于上面的<1> - A, 一个不那么繁琐的方法(避免删除.aps和.clw文件)是这样: 在生成了MapX.h和MapX.cpp之后, 首先在VC工作区左侧的FileView里将MapX.h和MapX.cpp删除(按delete); 然后在工程文件夹里, 用MAPX.H和MAPX.CPP覆盖掉MapX.h和MapX.cpp; 第三步, 在工程文件夹里删除.ncb文件; 最后在VC中, 通过选择Project -> Add To Project -> Files选项, 把MAPX.H和MAPX.CPP再添加到工程中.

<1> - C:

下一步就是使用. 如果要在CView里使用MapX, 则方法和<MapX控件的使用(1)>中叙述的相同;

而如果要在对话框资源模板里使用它, 比如CFormView, 或者CDialog, 只要在对话框资源编辑器里, 把MapX图标拖进去并调整即可; 其次, 要为其添加适当的变量并建立对话框DDX, 由于做了前面的工作, 这时我们可以直接利用类向导来完成.

<2> 实际上, MapInfo MapX 5.0 开发人员指南也提供了在对话框资源模板里使用MapX控件的方法.

不是通过从控件工具栏里拖拽来实现(因为根本没有MapX图标), 开发人员指南指出:

在对话框资源编辑器里右击 -> 插入OLE控件(实为插入ActiveX控件Insert ActiveX Control, 因为ActiveX控件本质就是OLE控件) -> 在列表里找到"MapInfo MapX V5" -> 单击"OK".

完成了这一步, MapX控件就会在对话框模板里显示出来, 但要为其添加变量, 却无法使用类向导来做, 而是要按照开发人员指南里的方法手动添加: 1 - include头文件; 2 - 成员变量声明; 3 - 对话框DDX.

殊途同归, 笔者认为, 按照开发人员指南的方法, 和前面<1>中叙述的方法, 效果相同.

怎样验证呢? 编译, 链接并运行, 看起来一切正常. 但功能上是不是也完全相同呢? 就要看以后实际的编程使用了.

posted @ 2010-12-15 13:42  frogrocket  阅读(1073)  评论(0编辑  收藏  举报