我在OCX中建立了一个FORMVIEW,FORMVIEW中有一个对话框,对话框中建立了一个属性页。程序执行的一切正常。
但是程序中的一切消息处理和响应都和普通MFC程序不一样。我在VIEW中、属性页中的PreTranslateMessage函数中一个消息也捕获不到。只有通过classwizard映射的键盘消息才能捕获。我之所以要用到PreTranslateMessage函数,是因为我需要捕获属性页中的各个控件的消息。
还有,属性页中的EDIT控件只能输入字符,却不能响应上下左右键和回退键。我想这可能也是消息的问题。
我想问问,是不是OCX控件的消息处理有什么特殊步骤?我也看了MSDN的控件事件的文章,但我的英语水平不高,没看明白,按照MSDN说的,为控件添加了键盘事件,可是系统只为键盘事件自动添加了一个事件映射,却没有相应的处理函数,是不是有什么其它步骤?

解决方案 »

  1.   

    请先响应, WM_DLGGETCODE这个消息
      

  2.   

    不对吧?大哥,我试过了。系统里没有WM_DLGGETCODE这个消息的定义啊?
      

  3.   

    在atl中建立一个对话框对象,将ACTIVEX控件插入其中。由对话框来接收分发消息。
      

  4.   

    http://expert.csdn.net/Expert/topic/2002/2002541.xml?temp=5.070132E-02
      

  5.   

    TO maohj1699(山豆根) 原文说:
    void CAXListViewCtrl::OnSetFocus(CWnd* pOldWnd)
    {
    COleControl::OnSetFocus(pOldWnd); // TODO: 在此处添加消息处理程序代码
    m_wndMyReportCtrl.SetFocus();
    }不行的话,再试试这个:BOOL CAXListViewCtrl::PreTranslateMessage(MSG* pMsg)
    {
    // TODO: 在此添加专用代码和/或调用基类
       if( pMsg->message == WM_LBUTTONDOWN  )
        {
            m_wndMyReportCtrl.SendMessage(pMsg->message, pMsg->wParam, pMsg->lParam); 
            return TRUE;
        } return COleControl::PreTranslateMessage(pMsg);
    }
    我重载了OnSetFocus函数,可这个函数根本就没有触发呀?
      

  6.   

    to ldsjlzy(小李) :你的方法我还得试试,要费一些时间。
      

  7.   

    MFC的PretranslateMessage只适用于MFC用你的代码创建的窗口,其他消息不能被预处理的
    去看CWinApp的消息处理……
      

  8.   

    http://www.codetools.com/useritems/connection.asp
      

  9.   

    to jiangsheng(蒋晟.Net) :那就没有办法了吗?再说,为什么我的控件中的编辑框不能响应《回退键》和《上下左右键》呢?
      

  10.   

    Knowledge Base  
    PRB: MFC ActiveX Control in IE Doesn't Detect Keystrokes
    This article was previously published under Q168777
    PRB: TranslateAccelerator() Not Called for ActiveX Controls
    This article was previously published under Q183167
    HOWTO: Add Toolbars and Tooltips to ActiveX Controls
    This article was previously published under Q194294
    PRB: Enabling Menu Mnemonics in an MFC ActiveX Control
    This article was previously published under Q199431
    PRB: MFC ActiveX Control Ignores ARROW Keys on VB Container
    This article was previously published under Q180402
    PRB: ActiveX Control Is the Parent Window of Modeless Dialog
    This article was previously published under Q187988
      

  11.   

    这个问题我也遇到过,真是很头疼,弄了好久也没有解决。最后只能避开它,如果你是在做项目,建议你不要使用PropertySheet和PropertPage,换成TabCtrl和Dialog来自己控制吧,如果单单是研究,我也很想知道解决办法,关注中................
      

  12.   

    to  jiangsheng(蒋晟.Net) :您要说什么?
      

  13.   

    to  kulukyo(飞翔的菜鸟) :我是要解决这个问题,这虽然不是项目,但困扰了我很长时间。
      

  14.   

    to: jiangsheng(蒋晟.Net) 
    怎样适用于不是用MFC的代码创建的窗口呢?
      

  15.   

    // Trap keys and forward on to the control.
       BOOL CMyEditCtrl::PreTranslateMessage(MSG* pMsg)
       {
          switch (pMsg->message)
          {
             case WM_KEYDOWN:
             case WM_KEYUP:
                switch (pMsg->wParam)
                {
                   case VK_UP:
                   case VK_DOWN:
                   case VK_LEFT:
                   case VK_RIGHT:
                   case VK_HOME:
                   case VK_END:
                      SendMessage (pMsg->message, pMsg->wParam, pMsg->lParam);
                      // Windowless controls won't be able to call SendMessage.
                      // Instead, just respond to the message here.
                      return TRUE;
                }
                break;
          }
          return COleControl::PreTranslateMessage(pMsg);
       } 
    因为容器处理了一些本来是控件应该处理的消息,所以PreTranslateMessage没有被调用
    以上转自
    Q180402 PRB: MFC ActiveX Control Ignores ARROW Keys on VB Container 
    现在的人连MSDN都不看……
      

  16.   

    to  jiangsheng(蒋晟.Net) :
    我已经在CMyEditCtrl类中重载了PreTranslateMessage,但别说是WM_KEYDOWN消息,
    我在调试中,根本就无法进入PreTranslateMessage,也就是说,包括OnPant消息都无法截获。
    这是怎么回事呢?
      

  17.   

    不行的话就Hook消息吧,但是可能造成宿主程序消息处理出错
      

  18.   

    把要收消息的控件加上notify属性
      

  19.   

    rowanrowan(rowan)兄的办法我试过了,
      

  20.   

    to  wzfree(肿眼泡) :看看派生类:COleControl::PreTranslateMessage(pMsg);
      

  21.   

    可否在active复合控件中使用动态创建控件呢,哥哥们
      

  22.   

    今天误打误撞,试了一种方法,把我自己的问题解决了,不知道对大家有没有帮助,
    假设在ocx中加入一个对话框m_dlg,作为ocx的child
    BOOL CMyCtrl::PreTranslateMessage(MSG* pMsg) 
    {
    // TODO: Add your specialized code here and/or call the base class//其实方法很简单,就是ocx控件捕获到消息后,然后手工把消息分发给需要这些消息的控件。
    //这里可以进行消息的过滤,比如只要键盘消息等等,还可以加入一些判断,把不同的消息
    //发给不同的目的地
             SendMessage(m_dlg.GetSafeHwnd(),pMsg->message,pMsg->wParam,pMsg->lParam); return COleControl::PreTranslateMessage(pMsg);
    }