【问题标题】:How can I handle the Return key in a CEdit control?如何处理 CEdit 控件中的 Return 键?
【发布时间】:2010-10-07 04:41:01
【问题描述】:

如何处理 CEdit 控件中的 Return 键 (VK_RETURN)? CEdit 控件的父级是 CDialog。

【问题讨论】:

    标签: c++ windows mfc cedit


    【解决方案1】:

    确保在控件的对话框资源中设置了编辑控件样式 ES_WANTRETURN

    【讨论】:

    • 这不起作用。这不是我想要的。我想得到 RETURN 键并做点什么。不只是允许输入 RETURN 键。
    • 然后您需要对编辑控件进行子类化并处理在其他 SO 问题中回答的 WM_CHAR 或 KeyDown 消息。或在对话框的 MessageMap 中,处理来自控件的 Edit Change 消息(针对每个字符发送)。
    • ES_WANTRETURN 仅适用于多行文本框。
    • 虽然不是 op 想要的(也许编辑答案以反映这一点),但这正是我想要的。谢谢。
    【解决方案2】:

    您还可以过滤对话框的 PreTranslateMessage 中的键。如果您收到WM_KEYDOWN 的VK_RETURN,请致电GetFocus。如果焦点在您的编辑控件上,请调用您对编辑控件中按下的返回的处理。

    注意 if 中的子句顺序依赖于短路是有效的。

    BOOL CMyDialog::PreTranslateMessage(MSG* pMsg)
    {
        if (pMsg->message == WM_KEYDOWN &&
            pMsg->wParam == VK_RETURN &&
            GetFocus() == m_EditControl)
        {
            // handle return pressed in edit control
            return TRUE; // this doesn't need processing anymore
        }
        return FALSE; // all other cases still need default processing
    }
    

    【讨论】:

      【解决方案3】:

      正确答案是处理WM_GETDLGCODE / OnGetDlgCode 消息。在那里你可以指定你希望你的类处理所有的键。

      UINT CMyEdit::OnGetDlgCode()
      {
          return CEdit::OnGetDlgCode() | DLGC_WANTALLKEYS;
      }
      

      【讨论】:

        【解决方案4】:

        默认情况下,Return 键关闭 MFC 对话框。这是因为 Return 键会导致调用 CDialog 的 OnOK() 函数。您可以覆盖该函数以拦截 Return 键。我从this article 得到了基本的想法(见最后的方法3)。

        首先,确保您已使用Class Wizard 将编辑控件的成员添加到对话框中,例如:

        CEdit m_editFind;
        

        接下来,您可以将以下函数原型添加到对话框的头文件中:

        protected:
            virtual void OnOK();
        

        然后您可以将以下实现添加到对话框的 cpp 文件中:

        void CMyDialog::OnOK()
        {
            if(GetFocus() == &m_editFind)
            {
                // TODO: Add your handling of the Return key here.
                TRACE0("Return key in edit control pressed\n");
        
                // Call `return` to leave the dialog open.
                return;
            }
        
            // Default behavior: Close the dialog.
            CDialog::OnOK();
        }
        

        请注意:如果您的对话框中有一个 OK 按钮,其 ID 为 IDOK,那么它也会调用 OnOK()。 如果这对您造成任何问题,那么您必须将按钮重定向到另一个处理函数。 如何做到这一点在我上面提到的the article的方法3中也有描述。

        【讨论】:

          【解决方案5】:

          我自己也遇到过这个问题。经过一些实验后,如果您只想在返回时执行某些操作(经过一些编辑等)(不特定于您所关注的编辑器),则存在一种简单的方法 - 我将创建一个不可见的默认按钮,然后让它按钮处理'return'键而不是默认的Ok按钮(当然,Ok按钮应该设置默认键为false)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-01-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多