事件槽 拦截activeX控件的事件
今天重新掳了一下阁置一个多月的项目时,突然发现一段关于sink的代码,想不起来自己用这个东西的意图了。于是注释了,继续看。
原来是想:在不继承某个控件的回调基类的前提下,响应他若干事件。例如mousedown等。
为了弄清自己的添加的事件槽为啥会在超出该组件范围的整个对框都响应添加的函数,查找了相关资源。以下文字截自网络,但与自己处理方法相同。以下MapWinGIS代表上文的组件。
要处理MapWinGIS的事件,需要创建一个事件槽(eventsink)。具体方法如下:
1.在CTestMapWindowView类(自己的处理类中)的头文件中,在DECLARE_MESSAGE_MAP()行下加入"DECLARE_EVENTSINK_MAP()" ;
2.在CPP文件中加入如下代码:
MFC版
BEGIN_EVENTSINK_MAP(CTestMapWindowView,CView)
END_EVENTSINK_MAP()
ATL版
BEGIN_SINK_MAP(CTestMapWindowView)
END_SINK_MAP()
本人使用的CDiaglog类,更改为CView类之后在ActiveX组件范围内正常响应
3.为了响应MouseMove事件,在上述两行代码中加入如下代码
MFC版
ON_EVENT(CTestMapWindowView, IDC_MAP, DISPID_MOUSEMOVE, OnMouseMove, VTS_I2 VTS_I2 VTS_I4 VTS_I4)
ATL版
SINK_ENTRY(IDC_MAP, DISPID_MOUSEMOVE, OnMouseMove)
后部依消息个数添加对应参数占位符,注意仅使用空格分隔,前边的DISPID必须要用对。
4.然后对CTestMapWindowView 类增加一个方法,函数声明为:
afx_msg void OnMouseMove(short _button,short _shift,long _x,long _y);
需要说明的是,在MapWinGIS中,为了能够响应事件,必须在调用SetSendMouseMove(true)后才能响应鼠标移动事件,其他响应事件也是如此类推。(仅限MapWinGIS中,本人的组件未做此处理)。且本人在使用时,想当然将后边的参数使用逗号分隔开,以及使用了错误的DISPID等看不到效果的情况,一脸懵B,在这儿一连徘徊了两个小时,终于无意中碰对了参数以及DISPID,且调试看到了效果才晃然大悟。不得不讲,茫茫然探索的过程对于成年人来说是真的亚力山大,问不鸟,实现看不到,资料很难查,“闯”出了困境也不过份吧