首先创建了个父窗口对话框,然后又创建了个无标题栏的子窗口贴在父窗口上,这样的效果看起来就像一个窗口,但是,tab按键却无法在父子窗口中切换,比如我把焦点放在子窗口的任何一个控件上,按tab,则焦点会跳转到父窗口的控件上,再也不会回到子窗口。如何能做到tab消息在窗口间能自由的切换? thx

解决方案 »

  1.   

    我觉得应该在PreTranslateMessage里判断吧
      

  2.   

    这个程序是windows sdk做的,没有PreTranslateMessage的函数。
      

  3.   

    void CTestHartDlg::OnSelchangeTabMain(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    CTestHartDlg *pthis=this;
    int iSel;
    m_InfoDlg.ifSave();
    m_InchingDlg.ifSave();
    m_AdvanceDlg.ifSave();
    m_AdvanceDlg.ifJLSave();
    m_ManufAdjustDlg.ifSave();
    CRect ret=pthis->m_retTab;

    //如果是监测变量界面先停止线程
    if(&(pthis->m_InspectDlg)==pthis->m_pCurrentDlg)
    {

    if(!pthis->m_InspectDlg.ThreadStop())
    {
    return ;
    }
    }
    //如果正在进行增益测试,则退出增益测试。
    if(pthis->m_IncreaseTest.m_Exit.IsWindowEnabled()==TRUE)
    {
    pthis->m_IncreaseTest.OnButton2();
    }
    iSel=pthis->m_tabMain.GetCurSel();
    pthis->m_pCurrentDlg->ShowWindow(SW_HIDE);
    int n=-2;
    switch(iSel)
    {
    case 0:
    UpdateData(FALSE);
    DoEvent();
    pthis->m_InfoDlg.ReadInfo();
    pthis->m_pCurrentDlg=&(pthis->m_InfoDlg);
    break;
    case 1:
    pthis->m_ConfigurationDlg.SetWindowPos(&(pthis->wndTop),ret.left,ret.top-n,ret.right-ret.left-5,ret.bottom-ret.top-25,SWP_SHOWWINDOW);
    UpdateData(FALSE);
    DoEvent();
    pthis->m_ConfigurationDlg.ReadInfo();
    pthis->m_pCurrentDlg=&(pthis->m_ConfigurationDlg);
    break;
    case 2:
    pthis->m_InchingDlg.SetWindowPos(&(pthis->wndTop),ret.left,ret.top-n,ret.right-ret.left-5,ret.bottom-ret.top-25,SWP_SHOWWINDOW);
    pthis->m_pCurrentDlg=&(pthis->m_InchingDlg); break;
    case 3:
    pthis->m_InspectDlg.SetWindowPos(&(pthis->wndTop),ret.left,ret.top-n,ret.right-ret.left-5,ret.bottom-ret.top-25,SWP_SHOWWINDOW);
    UpdateData(FALSE);
    DoEvent();
    pthis->m_InspectDlg.ReadInfo();
    pthis->m_pCurrentDlg=&(pthis->m_InspectDlg);
    pthis->m_InspectDlg.ThreadRun();
    break;
    case 4:
    pthis->m_IncreaseTest.SetWindowPos(&(pthis->wndTop),ret.left,ret.top-n,ret.right-ret.left-5,ret.bottom-ret.top-25,SWP_SHOWWINDOW);
    pthis->m_pCurrentDlg=&(pthis->m_IncreaseTest);
    break;

    case 5:
    pthis->m_UserAdjustDlg.SetWindowPos(&(pthis->wndTop),ret.left,ret.top-n,ret.right-ret.left-5,ret.bottom-ret.top-25,SWP_SHOWWINDOW);
    UpdateData(FALSE);
    DoEvent();
    pthis->m_pCurrentDlg=&(pthis->m_UserAdjustDlg);
    pthis->m_UserAdjustDlg.InitData();
    break;

    case 6:
    pthis->m_ManufAdjustDlg.SetWindowPos(&(pthis->wndTop),ret.left,ret.top-n,ret.right-ret.left-5,ret.bottom-ret.top-25,SWP_SHOWWINDOW);
    UpdateData(FALSE);
    DoEvent();
    pthis->m_ManufAdjustDlg.ReadInfo();
    pthis->m_pCurrentDlg=&(pthis->m_ManufAdjustDlg);
    pthis->m_ManufAdjustDlg.bValChange=FALSE;
    break;
    case 7:
    pthis->m_AdvanceDlg.SetWindowPos(&(pthis->wndTop),ret.left,ret.top-n,ret.right-ret.left-5,ret.bottom-ret.top-25,SWP_SHOWWINDOW);
    UpdateData(FALSE);
    DoEvent();
    pthis->m_AdvanceDlg.ReadInfo();
    pthis->m_pCurrentDlg=&(pthis->m_AdvanceDlg);
    m_AdvanceDlg.bValChange=FALSE;
    break;
    case 8:
    pthis->m_AdditionFun.SetWindowPos(&(pthis->wndTop),ret.left,ret.top-n,ret.right-ret.left-5,ret.bottom-ret.top-25,SWP_SHOWWINDOW);
    UpdateData(FALSE);
    DoEvent();
    pthis->m_pCurrentDlg=&(pthis->m_AdditionFun);
    break;
    }
    return ;}
      

  4.   

    SDK的话就更简单咯,直接拦截WM_CHAR消息不就行了,TAB的虚拟键码应该是9吧
      

  5.   

    奇怪,我用CreateDialogParam创建的对话框,他的消息回调函数怎么收不到任何有关键盘消息。我直接在消息回调中判断的if (WM_KEYFIRST <= uMsg && uMsg <= WM_KEYLAST)
    这个都进不去
      

  6.   

    非模态对话框要在消息循环里这样判断:
    if (hDlgModeless /*全局保存非模态句柄*/== 0 || !IsDialogMessage (hDlgModeless, &msg))