BOOL CDlgzl::PreTranslateMessage(MSG* pMsg) 
{
    if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN)   
    {
int nID = GetFocus()->GetDlgCtrlID(); 
if (nID==IDC_EDIT_SSJE)
{
GetDlgItem(IDC_BUTTON_JZ)->SetFocus();
        }
    }
return CDialog::PreTranslateMessage(pMsg);
}以上代码按下回车键,将焦点设置在按钮(IDC_BUTTON_JZ)上面,然后再按一次回车键,执行按钮里面的代码,因为焦点在按钮上面,按第二次回车应该是执行按钮的代码吧?但第二次回车没有任何反应,但是通过用TAB键把焦点移动到按钮,然后再按回车,按钮的代码就执行了,请教如何解决上述问题

解决方案 »

  1.   

    GetFocus 设置成功的话,会返回焦点窗口的指针,你可以通过这种方式来验证。比如直接用这个指针来改变按钮上面的caption来验证焦点是否获取成功。另外,在第二点击的时候,也可以提前用GetFocus()来提前验证是否焦点还是在这个控件上,增强验证。就容易找到错误了CWnd::SetFocusCWnd* SetFocus( );返回值:
    原来拥有输入焦点的窗口对象的指针。如果没有这样的窗口,则返回值为NULL。返回的指针可能是临时的,不应被保存。说明:
    这个函数要求得到输入焦点。输入焦点将随后的所有键盘输入定向到这个窗口。原来拥有输入焦点的任何窗口都将失去它。
    SetFocus成员函数项失去输入焦点的窗口发送一条WM_KILLFOCUS消息,并向接收输入焦点的窗口发送一条WM_SETFOCUS消息。它还激活该窗口或它的父窗口。
    如果当前窗口是激活的,但是不具有输入焦点(这意味着,没有窗口具有输入焦点),则任何按下的键都将产生WM_SYSCHAR,WM_SYSKEYDOWN或WM_SYSKEYUP消息。CWnd::GetFocusstatic CWnd* PASCAL GetFocus( );返回值:
    指向拥有当前焦点的窗口的指针,如果没有焦点窗口,则返回NULL。这个指针可能是临时的,不能被保存以供将来使用。说明:这个函数获得指向当前拥有输入焦点的CWnd的指针。请参阅:
    CWnd::GetActiveWindow, CWnd::GetCapture, CWnd::SetFocus, ::GetFocus 
      

  2.   

    我做了测试,焦点确实是在按钮上,通过SetFocus设置焦点后,按钮是一点反应都没有,但通过TAB把焦点移动到按钮上,按上回车就马上执行,究竟为什么呢?
      

  3.   

    在对话框按Return建,相当于执行缺省按钮的功能。你用TAB移动焦点到按钮,按钮此时具有BS_DEFPUSHBUTTON(记得似乎是这样)属性,所以按Return执行了。当你用程序SetFocu设置焦点的时候,最好也把按钮的BS_DEFPUSHBUTTON也设置下。再试试。
      

  4.   

    但是通过SetFocus设置焦点后,按"空格"键是可以执行的,就是ENTER键不行
      

  5.   


            if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN)

    int nID = GetFocus()->GetDlgCtrlID();
    if (nID==IDC_EDIT_WUYA)
    {
    CButton* pButton = (CButton*)GetDlgItem(IDC_BUTTON_WUYA);
    pButton->SetFocus();
    DWORD dwStyle = pButton->GetStyle();
    dwStyle |= BS_DEFPUSHBUTTON; pButton->SetButtonStyle(dwStyle);
    return TRUE;
    }
    } return CDialog::PreTranslateMessage(pMsg);
    参照Lin 的说法修改,可以得到正确结果! 这样看应该是Tab切换时给 Button设置了BS_DEFPUSHBUTTON属性?