MFC EDIT 回车事件响应之 OnChar() 实现
MFC EDIT 回车事件响应之 OnChar() 实现
最近,维护一个年久失修的项目,源程序使用VC++6.0开发的,由于时间太久远,开发文档全无,要命的是涉及到硬件的控制部分,用户要求修改更新OS系统,增加新功能。
新功能部分,要求实现键盘触发事件,这个功能用MFC实现。我需要温习一下,查阅相关资料,发现不同程度的出现BUG,于是找度娘,做法五花八门,但我不满意,经过思考和多次尝试后,实现了,经过测试,目前还很稳定,分享出来,希望对大家有所帮助。
一、创建项目
在VS2008创建MFC项目,安装向导创建“MFC_EDIT_OnChar”,如下:
二、添加EDit
在对话框中添加三个 edit ,ID使用默认即可。如下图:
三、对话框添加事件
1.添加虚方法PreTranslateMessage,并重写此方法。
资源视图—-Dialog—-指定界面—-类向导—-虚函数—-PreTranslateMessage
下一步,选择需要添加此方法的类,单击右键选择属性,打开如下图:
下一步,单击“重写”按钮,
如图
找到PreTranslateMessage方法,添加即可。
2. 添加WM_CHAR事件
资源视图—-Dialog—-指定界面 ,如图:
选择“消息”按钮,添加WM_CHAR函数。
PreTranslateMessage方法和WM_CHAR函数添加完成。
四、编写代码
1、PreTranslateMessage方法下面写面代码:
SendMessage(pMsg->message,pMsg->wParam,pMsg->lParam);
return 0;
SendMessage函数功能:该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。
在这里的目的是把消息转到OnChar事件,并由OnChar事件处理。
1、OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)下面添加如下代码:
HWND hwnd = ::GetFocus();//获取焦点控件
int my_ID = ::GetDlgCtrlID(hwnd);
CString aaa;
if(nChar==13){
if(my_ID==IDC_EDIT1)
{
UpdateData(TRUE);
GetDlgItem(my_ID)->GetWindowText(aaa);
GetDlgItem(IDC_STATIC)->SetWindowTextW(aaa);
UpdateData(FALSE);
}
else if(my_ID==IDC_EDIT2)
{
UpdateData(TRUE);
GetDlgItem(my_ID)->GetWindowText(aaa);
GetDlgItem(IDC_STATIC)->SetWindowTextW(aaa);
UpdateData(FALSE);
}
else if(my_ID==IDC_EDIT3)
{
UpdateData(TRUE);
GetDlgItem(my_ID)->GetWindowText(aaa);
GetDlgItem(IDC_STATIC)->SetWindowTextW(aaa);
UpdateData(FALSE);
}
GetNextDlgTabItem(GetFocus())->SetFocus();
}
代码添加完成。
五、测试
经过多次测试,比较稳定。
六、总结
通过这种方式,在EDIT控件中输入字符后按“ENTER”,后实现EDIT分别响应ENTER事件,经测试使用扫描枪输入也很稳定,但扫描枪输入字符必须有“回车符”。
本文的代码是经过实际测试的,测试环境Win10+VS2008。分享出来,希望能帮助大家,少走弯路,也欢迎拍砖。HAHA。