在上一篇文章中,对如何将MapWinGIS控件引入到VC++6.0环境中使用,做了个详细介绍。 这一篇日志我将针对如何在VC++6.0环境中处理MapWinGIS的对象事件进行说明(该篇主要针对文档——视图结构的程序有用,因为涉及到控件的动态创建,如果是基于对话框的应用程序,那就不必这么麻烦,直接使用ClassWizard为控件添加事件即可)。 上一篇文章里提到,事件的处理,需要创建一个事件槽(eventsink),这其实是一个宏,实现原理跟我们熟悉的消息映射宏(DECLARE_MESSAGE_MAP())一样,用法也基本相同。可以参照系统自动生成的消息映射宏进行添加。 例如,我们要为Map控件的OnMouseUp()事件添加处理代码,需要做如下几步工作: 1、在View类的头文件中,加入事件槽的声明: DECLARE_EVENTSINK_MAP(); 2、在View类的实现文件中,加入事件槽的实现: BEGIN_EVENTSINK_MAP(CTestMapWinGISView,CView) END_EVENTSINK_MAP() 3、在事件槽的实现部分(BEGIN...与END...之间)添加下面一行: ON_EVENT(CTestMapWinGISView,IDC_MAP,2,OnMouseUpMap,VTS_I2 VTS_I2 VTS_I4 VTS_I4) (这个宏内部参数意义分别是:该事件属于哪个类;控件的ID;事件的ID;事件的处理函数指针;事件的参数队列,参数之间用空格格开) 4、在View类的头文件中,消息函数的声明部分,加入事件处理函数的声明: afx_msg void OnMouseUpMap(short _button,short _shift,long _x,long _y); (该函数的参数与第3步中的参数队列相对应) 5、在View类的实现文件中,加入事件处理函数的实现: void CTestMapWinGISView::OnMouseUpMap(short _button,short _shift,long _x,long _y) { AfxMessageBox("鼠标松开"); }
这几步的关键点在于: A.如何知道事件的ID,即ON_EVENT()的第3个参数; B.如何获得事件的参数,即ON_EVENT()的第5个参数; 这里介绍一个比较好的方法:新建一个基于对话框的应用程序,在窗体上添加一个Map控件,用ClassWizard为控件添加需要的事件,然后查看向导生成的代码,直接拷贝过来就行了。 |