【发布时间】:2012-06-19 04:55:15
【问题描述】:
我有一个CEdit 框,用户可以在其中输入相关信息。一旦他\她开始在盒子里写字,我需要一个通知,以便我可以致电doSomething() 执行其他任务。 Windows 是否提供回调,如果提供,我该如何使用?
【问题讨论】:
标签: windows mfc desktop-application
我有一个CEdit 框,用户可以在其中输入相关信息。一旦他\她开始在盒子里写字,我需要一个通知,以便我可以致电doSomething() 执行其他任务。 Windows 是否提供回调,如果提供,我该如何使用?
【问题讨论】:
标签: windows mfc desktop-application
使用 MFC,没有回调,而是通过为适当的事件实现处理程序来实现。您需要处理以下两个事件之一:WM_CHAR 或 EN_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 的解释。
【讨论】:
如果您双击资源编辑器中的编辑框,它会自动为您创建 OnEnChanged 事件。
【讨论】:
以下假设您有一个 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);
}
【讨论】: