用VC进行MapX二次开发响应鼠标消息

用VC进行MapX二次开发时,鼠标消息(如单击,双击,移动等)被MapX屏蔽了,所以这时,为WM_MOUSEMOVE等消息添加处理函数时,这些函数并不会被调用。当又需要对这些消息添加处理函数时,通常的做法是把这些鼠标消息作为“事件”(当然是MapX的事件了),为这些事件添加事件处理函数。
(1)当将MapX.h和MapX.c文件添加到工程后,为MapX控件指定一个资源ID,如IDC_MAP。添加资源ID的方法是 VIEW-->RESOURCE SYMBOL,然后点击新建.. 。
(2)在视图文件的头文件(如ButtonView.h)中,找到DECLARE_MESSAGE_MAP(),在它下面添加DECLARE_EVENTSINK_MAP()。
(3)在视图类的实现文家ButtonView.cpp中,找到BEGIN_MESSAGE_MAP(CButtonView,CView)和END_MESSAGE_MAP(),在消息MAP下面添加事件MAP,
BEGIN_EVENTSINK_MAP(CButtonView, CView)
   ON_EVENT(CButtonView, IDC_MAP, DISPID_MOUSEMOVE,
      OnMouseMoveInMap,VTS_I2 VTS_I2 VTS_XPOS_PIXELS VTS_YPOS_PIXELS)
//鼠标移动
   ON_EVENT(CButtonView, IDC_MAP, DISPID_MOUSEUP,
      OnMouseUpInMap, VTS_I2 VTS_I2 VTS_XPOS_PIXELS VTS_YPOS_PIXELS)
//鼠标左键弹起
   ON_EVENT(CButtonView, IDC_MAP,DISPID_DBLCLICK,
      OnMouseDblC,VTS_NONE)
//鼠标双击
END_EVENTSINK_MAP()
(4)为视图类CButtonView分别添加鼠标事件处理函数void OnMouseMoveInMap(short Button, short Shift, OLE_XPOS_PIXELS x, OLE_YPOS_PIXELS y),void OnMouseUpInMap(short Button, short Shift, OLE_XPOS_PIXELS x, OLE_YPOS_PIXELS y) 和 void OnMouseDblC()。
(5)上面的x,y为光标的坐标,不难发现鼠标双击事件并不传送鼠标位置坐标。如果想在鼠标双击事件里获得鼠标坐标,可用函数GetCursorPos(),但它获得的坐标是屏幕坐标,如果想用MapX里的Map.ConverCoord()方法把坐标转换为经纬度,需要先用ScreenToClient()函数,把屏幕坐标转换为绘图区坐标。如下所示:
CPoint point;
GetCursorPos(&point);
ScreenToClient(&point);
float x=(float)point.x;
float y=(float)point.y;
double Mapx,Mapy;
m_controlMapx.ConvertCoord(&x,&y,&Mapx,&Mapy,miScreenToMap);

本文出自 “代志强” 博客,谢绝转载!

你可能感兴趣的:(开发,VC,二次开发,鼠标消息,MapX)