VC、OpenGL、ArcGIS Engine开发的二维三维结合的GIS系统
2009-01-16 19:39:17 来源:WEB开发网2、动态加载ActiveX控件。首先如上节的方法插入三维ActiveX控件;然后在COpenGL类的OnCreate函数中使用CWnd类的CreateControl动态的加载ActiveX控件。
2 二维与三维互通信
二维视图与三维视图的互通信是实现二维与三维的互动的基础,二维与三维互通信分为以下两步。
1、视图间互通信。它不是简单的函数调用问题,因为MFC的默认视图类(CView)并不能安全的与除文档类(CDocument)以外的其余视图类进行通信,所以,必须使得所有视图类均先与文档类进行通信,这就需要重载CDocument::OnOpenDocument函数,将COpenGL类的指针加入其中即可以实现视图间的通信。
2、MFC视图与ActiveX控件通信。ActiveX控件所提供的方法均没有返回值,而实现MFC视图与ActiveX控件的通信又必须得到方法的返回值,解决这个矛盾有三种方法:
一是将方法的参数设置为指针类型;
二是提供相应方法的属性,在属性内部调用ActiveX的类函数;
三是将方法声明成事件,并可以与默认的ActiveX事件挂钩。
这三种方法各有千秋,需要结合应用,如:坡度坡向计算时,需要得到该点的坡度坡向两个数值,即可将该方法的参数声明为指针类型;距离量算时,只需得到距离一个参数值,即可将其声明为属性;坐标查询时,需要在MFC视图中截获鼠标单击的消息,因此要将该方法声明为响应鼠标单击的事件。
添加ActiveX事件是一项非常困难的工作,需要用接口定义语言—IDL(Interface Definition Language)手动编写接口定义文件(*.idl)。下面以添加鼠标单击事件Click为例说明添加事件的步骤。首先,应用guidgen.exe获得一个唯一标识码作为Click事件的接口_IEvent的ID,然后将_IEvent声明为[default, source]dispinterface,编译idl文件,并添加该_IEvent的Click事件的连接点(Connection Point),系统会自动产生一个继承自IConnectionPointImpl接口的CProxy_IEvents类,并在该类中加入Fire_Click方法,该方法即为Click事件。这样只是添加了Click事件,还必须将其与ActiveX默认的鼠标单击事件OnLButtonDown挂接,才能响应鼠标单击的消息,因此必须在OnLButtonDown中调用Fire_Click方法,一切处理均在OnLButtonDown中实现,而后传入Fire_Click中。
更多精彩
赞助商链接