一个Dialog上有3*3个Button。
PreTranslate中截获4个方向键,并在每次操作后用SetFoucs()来设定焦点。
发现设定后的焦点不能像以前TAB的默认焦点一样正常响应回车按下的Click事件。

解决方案 »

  1.   

    有点诡异的是如果在pretranslate中的pMsg->wParam == VK_RETURN判断下写个像MessageBox(L"XXX")
    之后反而可以正确响应 去掉就不行 。
      

  2.   

    pMsg->wParam == VK_RETURN;这个是TAB键??我记得怎么是Enter。。
      

  3.   

    没说是TAB键。。可能我没说清楚 
    我的意思是默认会给你一个焦点的移动顺序。
    如果按默认顺序走,没有问题。如果按照自己的顺序,就是SetFocus()才会出现上面的现象。
      

  4.   

    (CEdit*)GetDlgItem(IDC_BUTTON1)-> SetFocus(); 这样写不能实现?
    我试试
      

  5.   

    CButton* pButton = (CButton*)GetDlgItem(IDC_BUTTON1);
    pButton->SetButtonStyle(BS_DEFPUSHBUTTON);
    pButton->SetFocus();
      

  6.   


    CButton* pButton = (CButton*)GetDlgItem(IDCANCEL);
    SendMessage(WM_NEXTDLGCTL, (WPARAM)pButton->GetSafeHwnd(), TRUE);或者这个,这样可能会效果比较好一些
      

  7.   

    http://blog.csdn.net/VisualEleven/archive/2010/12/06/6058687.aspx
      

  8.   

    else if (pMsg->wParam == VK_UP )
    {
    m_pSelButton->SetFocus();
    CExBitmapButton *pButton = (CExBitmapButton*)m_pSelButton->GetFocus();
    long nIndex = GetButtonIndex(pButton);
    if (nIndex == 9)
    {
    m_pSelButton->SetButtonSel(FALSE);
    m_oMannualTest.SetButtonSel(TRUE);
    m_oMannualTest.SetFocus();
    m_pSelButton = &m_oMannualTest;

    }
    else if (nIndex > 4 && nIndex <= 8)
    {
    nIndex -= 4;
        CExBitmapButton *pButtonTemp = GetButton(nIndex);
    SelButton(pButtonTemp);
    pButtonTemp->SetFocus();
    }
    else if (nIndex <= 4)
    {
    m_pSelButton->SetButtonSel(FALSE);
    m_oExit.SetButtonSel(TRUE);
    m_oExit.SetFocus();
    m_pSelButton = &m_oExit;
    } }
    代码比较长 上个片段
      

  9.   

    很多是自己写的函数 忽略就是了
    这样SetFocus应该是没有问题的吧然后我希望它按下return时候响应对应的click事件。
    再默认顺序下是没有问题的。
    自己写的这种顺序会出现不响应click而去响应Onok
      

  10.   

    是不是你创建对话框最开始的那个OK按钮你没删除或者直接改为自己的键了,系统默认开始的焦点在那个键上,看是不是在那里调了ONOK()?
      

  11.   

    这个按钮我去掉了,我重载了OnOK() 并且在初始化时候就SetFocus到一个按钮上了
      

  12.   

    初始化SetFocus()时返回值要是 FALSE才行。你单步跟一下 看哪会进ONOK()
      

  13.   

    基本上稍微多按几下方向选择后就会进OnOK()
      

  14.   

    回车键会默认调用OnOK(),试试在哪里把回车键的消息截获了,让它不可能去调用OnOK(),而不是通过重载OnOK()的方式
    或者在OnOK()也加上特定的处理,模拟为按下了对应的Button,不过不是很好的解决办法
      

  15.   

    上面说的不准,不一定是截获消息,是在回车响应的函数执行链的某个环节进行截断或改向,让它不可能去调用OnOK()
      

  16.   

    在默认顺序下是没有问题的。
    自己写的这种顺序会出现不响应click而去响应Onok尝试了多次还是失败了。改回原来截获if(pMsg->wParam == VK_RETURN)的方式来处理了
    if (pMsg->wParam == VK_RETURN)
    {
    //m_pSelButton->SetFocus(); long nIndexTemp = GetButtonIndex(m_pSelButton);
    if (nIndexTemp == 1)
    {
    CDlg1 dlg;
    dlg.DoModal();
    }
    else if (nIndexTemp == 4)
    {
    CDlg2 dlg;
    dlg.DoModal();
    }
    else
    {
    return CDialog::PreTranslateMessage(pMsg);
    }
                            return TRUE; //对话框资源返回TRUE
    谢谢大家了