如何从“CEdit”框中获取通知?

时间:2012-06-16 09:19:28

标签: windows mfc desktop-application

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

3 个答案:

答案 0 :(得分: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
    }

或者,处理编辑框类的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);
    }

请注意,您可以使用VS IDE为处理程序覆盖放置存根,方法是使用“消息映射”块中的鼠标选择“属性”栏。

编辑:添加了示例代码,并更正了我错误的WM_CHAR的说明。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

以下假设您有一个MFC对话框应用程序。

可以通过右键单击启动类向导: Start class wizard

双击新编辑控件的控件ID(带有绿色加号的图标),将相应的成员变量添加到类中。

New proposed variable created

类和事件向导将更新类定义并添加CEdit成员:

afx_msg void OnEnChangeEdit1(); // Added by event wizard
CEdit m_edit1; // member added by class wizard

类向导将更新函数:

void CMFCApplication5Dlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_EDIT1, m_edit1); // new variable added with class wizard
}

双击控件或右键单击并选择添加事件向导将更新消息映射并创建函数声明和定义:

BEGIN_MESSAGE_MAP(CMFCApplication5Dlg, CDialogEx)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_EN_CHANGE(IDC_EDIT1, &CMFCApplication5Dlg::OnEnChangeEdit1) // new event handler added with wizard
END_MESSAGE_MAP()

最后,可以更新代码以与编辑控件进行交互:

void CMFCApplication5Dlg::OnEnChangeEdit1()
{
    // TODO:  Add your control notification handler code here
    CString text;
    m_edit1.GetWindowText(text);
    //m_edit1.SetWindowText(text);
}