2012-06-16 144 views
0

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

回答

1

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

4

有了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派生类,处理该类的事件(不是对话框),并使您的编辑控件成为该类的一个实例。

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解释。

+0

WM_CHAR是不够的,因为你可以粘贴到例如控制。 –

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 
} 

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

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); 
}