MFC输入密钥作为“应用”按钮

时间:2013-09-06 15:15:00

标签: c++ windows mfc

在某个对话框中,我希望当用户按下回车键以使其充当“应用”按钮时。到目前为止,我至少能够通过覆盖CWnd :: PreTranslateMessage按下输入来关闭对话框,所以目前它什么也没做,我不知道如何从那里发送应用命令。

5 个答案:

答案 0 :(得分:4)

每个对话框都应该只有一个带有BS_DEFPUSHBUTTON style的按钮,它向对话框指示这是使用Enter键激活的按钮。通常这是OK按钮,但如果您愿意,可以将其设为“应用”按钮。

答案 1 :(得分:2)

正如Mark上面指出的那样,对话管理器已经内置了所有逻辑来通过调用与默认按钮关联的命令来处理 Enter 键。您可以静态分配BS_DEFPUSHBUTTON样式或处理DM_GETDEFID消息。

前者非常简单,后者实施起来相当简单。确保为对话框中的所有按钮将默认按钮属性设置为 False 。现在为DM_GETDEFID消息添加消息处理程序。此消息没有专用宏,因此您必须使用通用处理程序:

BEGIN_MESSAGE_MAP(CMyDialog, CDialogEx)
    ...
    ON_MESSAGE(DM_GETDEFID, OnGetDefId)
END_MESSAGE_MAP()

消息处理程序同样简单,并使用默认的消息处理程序签名:

LRESULT CMyDialog::OnGetDefId(WPARAM wParam, LPARAM lParam)
{
    return MAKELRESULT(ID_APPLY, DC_HASDEFID);
}

消息处理程序必须返回一个值,其高位字包含DC_HASDEFID,而低位字包含控件ID。

如果您浏览对话框的控件,您会看到 Apply 按钮具有典型的默认按钮视觉提示,而焦点不在另一个命令按钮上。当非按钮控件具有输入焦点时,按 Enter 将调用默认按钮的命令处理程序。无需其他代码。

答案 2 :(得分:1)

如果您的意图是在不关闭对话框的情况下处理Enter键,您可能会错误地进行操作。请查看this MSDN文章。虽然使用PreTranslateMessage应该可行,但它不是处理这些类型事件的最佳方式。

答案 3 :(得分:0)

您需要处理OnKeyDown消息,并处理该函数内的VK_RETURN字符。

void MyCtrl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
    if(nChar == VK_RETURN)  
    {       
        // Do Stuff 
        return; 
    }   

    CWnd::OnKeyDown(nChar, nRepCnt, nFlags);
}

答案 4 :(得分:0)

Another way to overwrite the message.

BOOL CMyDialog::PreTranslateMessage(MSG* pMsg)
{
    if (pMsg->message == WM_KEYDOWN)
    {       
        switch (pMsg->wParam)
        {   
        case VK_RETURN:
            {
               UINT nID = ::GetDlgCtrlID(pMsg->hwnd);       

                if (nID == ID_APPLY)
                { 
                   //DO YOUR STUFF HERE
                }        
            }
            break;
        default:
            break;
        }
    }
    return CDialog::PreTranslateMessage(pMsg); 
}

此外,如果您正在使用:: OnKeyDown

,则无需使用PreTranslateMessage