6

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

4

3 回答 3

13

使用 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我错误的解释。

于 2012-06-19T09:02:36.957 回答
1

If you double click on the edit box in the resource editor it automatically creates the OnEnChanged event for you.

于 2012-06-19T08:23:49.540 回答
1

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

可以通过右键单击启动类向导: 开始课堂向导

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

创建了新的提议变量

类和事件向导将更新类定义并添加一个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);
}
于 2017-07-11T16:43:09.537 回答