1. 用vc2005创建一个ATL复合控件,不写任何代码直接编译后在容器中运行,按下ESC键窗口消失,点一下鼠标又出现窗口.
跟踪发现反复调用UIDeactivate, 不知道该如何屏蔽啊?2. ATL控件中所有消息是从哪个函数中转发过来的呢?能不能重写, 就像MFC中的PreTranslateMessage一样,可以在传递消息前过滤, 而不是在各个窗口分开处理?

解决方案 »

  1.   

    没有ATL的经验,哪位大侠来解释一下。
      

  2.   

    1 ESC键是容器处理的,不能在控件中屏蔽
    2 ATL控件中所有消息是从容器发过来的,不能在传递消息前过滤,因为你没有办法控制容器的消息循环。
      

  3.   

    ATL没有消息过滤机制,要自己写,但WTL有,就是PreTranslateMessage。
      

  4.   

    ActiveX测试容器是已经写好的,当然无法屏蔽消息,而且也无需屏蔽消息。在你的控件实际使用中肯定要使用其它容器,比如IE浏览器,你可以实现IDocHostUIHandlerDispatch接口,并把这个接口通过调用SetExternalUIHandler方法连接到浏览器容器控件上,在TranslateAccelerator方法里实现消息屏蔽。我提供的基于ATL的CDHtmlDialog类里面已经实现了此功能,可以参考一下代码