zoukankan      html  css  js  c++  java
  • 事件槽 拦截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,且调试看到了效果才晃然大悟。不得不讲,茫茫然探索的过程对于成年人来说是真的亚力山大,问不鸟,实现看不到,资料很难查,“闯”出了困境也不过份吧

  • 相关阅读:
    Android模拟器操作快捷键
    【从零之三(更)】自定义类中调用讯飞语音包错误解决办法
    解决Please ensure that adb is correctly located at 'D:javasdkplatform-toolsadb.exe' and can be executed.
    辛星浅析同源策略
    Java读源代码学设计模式:适配器Adapter
    iOS 隐藏NavigationBar的方法
    Odoo(OpenERP)开发实践:数据模型学习
    Android软键盘状态的切换及其强制隐藏
    用python阐释工作量证明(proof of work)
    基于spark1.4的Spark-Sql
  • 原文地址:https://www.cnblogs.com/ice-arrow/p/12108331.html
Copyright © 2011-2022 走看看