我在控件类中拦截了VK_TAB键的消息,然后做了以下的处理BOOL CDvrOcxCtrl::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->wParam == VK_TAB)
{
if(::IsDialogMessage(m_mainWnd.GetSafeHwnd(), pMsg))//这个是控件中加载的对话框
{
return m_mainWnd.SendMessage(pMsg->message, pMsg->wParam, pMsg->lParam); //拦截成功,这样处理对吗?    
}

} return COleControl::PreTranslateMessage(pMsg);
在控件加载的对话框中还有很多的对话框,都是子窗口了。(树形窗口架构)
那么我该怎么处理才可以让对应的窗口处理VK_TAB,包括接收处理

解决方案 »

  1.   

    m_mainWnd?是那个窗口啊?
    ::SendMessage(HWND,Msg,WPARAM,LPARAM); 你用这个SendMessage 然后制定好里面的HWND
      

  2.   


    m_mainWnd是控件中创建的窗口,而这个窗体的下面还有很多子窗口,我想让下面的窗口响应这个VK_TAB的消息,现在我在控件的最上层已经拦截到了这个VK_TAB的按键消息了,那么我该如何传递下来,传递下来后,子窗口又该怎么处理呢?
      

  3.   

    BOOL CDvrOcxCtrl::PreTranslateMessage(MSG* pMsg)
    {
        if(pMsg->wParam == VK_TAB)
        {
            if(::IsDialogMessage(m_mainWnd.GetSafeHwnd(), pMsg))//这个是控件中加载的对话框
            {
                return FALSE;//貌似应该这样
            }
            
        }    return COleControl::PreTranslateMessage(pMsg);}
      

  4.   

    5楼的方法行不通lz的m_mainWnd下面的子窗是模式的还是非模式的?lz是不是要子窗来处理tab,m_mainWnd不处理这个tab?按楼主的说法我觉得应该是非模式的,非模式窗口的消息在父窗m_mainWnd的消息循环中处理
      

  5.   

    m_mainWnd窗口是非模态的,我尝试了一下的方法,虽然是没成功,但是给大家留个思路我在控件最上层截获消息
    BOOL CDvrOcxCtrl::PreTranslateMessage(MSG* pMsg)
    {
    if(pMsg->wParam == VK_TAB)
    {
    if(::IsDialogMessage(m_mainWnd.GetSafeHwnd(), pMsg))//截获消息
    {
                            //WM_TABCTRL为自定义的消息
    return m_mainWnd.SendMessage(WM_TABCTRL, pMsg->wParam, pMsg->lParam);//把消息传递到m_mainWnd中,     
    }

    } return COleControl::PreTranslateMessage(pMsg);
    }
    m_mainWnd为控件中创建的主窗口,然后主窗口进行了消息摆渡 default:
    if(message == WM_TABCTRL)
    {
    ASSERT(m_hActiveWnd);
    ::SendMessage(m_hActiveWnd,WM_TABCTRL, wParam, lParam);//m_hActiveWnd:记录的当前子窗口的句柄
    }
    break;
    在子窗口中做了类似一下的处理(子窗口确认已经收到了如下的消息)LRESULT CUserLogin::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
    {
    if(message == WM_TABCTRL)
    {
    if(wParam == VK_TAB)//此消息确认收到
    {
    this->SendMessage(WM_KEYDOWN, VK_TAB, 0);//相当于按下了VK_TAB,结果没啥效果
    }
    } return CDialog::WindowProc(message, wParam, lParam);
    }
    页面是重载控件和MFC素控件的组合,不知道问题是咋回事了。