如何从"CEdit"框中获取通知?

ash*_*sh2 2 windows mfc desktop-application

我有一个CEdit框,用户可以在其中输入相关信息.一旦他开始在盒子里写字,我就需要一个通知,以便我可以打电话doSomething()来执行其他任务.Windows是否提供回调,如果是,我该如何使用它?

acr*_*075 8

使用MFC时,没有回调,而是通过为适当的事件实现处理程序来实现.您需要处理以下两个事件之一:WM_CHAREN_CHANGE

处理对话框EN_CHANGE,例如实时复制对话框中其他位置输入的文本.您需要首先在对话框的消息映射中添加一个条目,然后覆盖相应的处理程序:

BEGIN_MESSAGE_MAP(CstackmfcDlg, CDialog)
    ON_EN_CHANGE(IDC_EDIT1, &CstackmfcDlg::OnEnChangeEdit1)
END_MESSAGE_MAP()

void CstackmfcDlg::OnEnChangeEdit1()
    {
    CString text;
    m_edit.GetWindowText(text);
    m_label.SetWindowText(text); // update a label control to match typed text
    }
Run Code Online (Sandbox Code Playgroud)

或者,处理editbox类WM_CHAR,例如阻止某些字符的输入,例如忽略除数字以外的任何数字输入.从CEdit派生一个类,处理该类的WM_CHAR事件(不是对话框)并使编辑控件成为该类的实例.

BEGIN_MESSAGE_MAP(CCtrlEdit, CEdit)
    ON_WM_CHAR()
END_MESSAGE_MAP()

void CCtrlEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
    {
    // Do nothing if not numeric chars entered, otherwise pass to base CEdit class
    if ((nChar >= '0' && nChar <= '9') || VK_BACK == nChar)
        CEdit::OnChar(nChar, nRepCnt, nFlags);
    }
Run Code Online (Sandbox Code Playgroud)

请注意,通过在消息映射块中使用鼠标选择的"属性"栏,可以使用VS IDE为处理程序覆盖放入存根.

编辑:添加了示例代码,并纠正了WM_CHAR我错误的解释.

  • WM_CHAR是不够的,因为您可以粘贴到控件中. (4认同)

小智 1

如果双击资源编辑器中的编辑框,它会自动为您创建 OnEnChanged 事件。