MFC回车键不关闭对话框.docx
文本预览下载声明
/cseries/mfcreturnkeyshutdialog.htmlMFC回车键不关闭对话框以及变成TAB键效果之前在弄完这个十六进制字符串异或的工具后,发现直接按回车键就直接关闭了工具。网上搜了下解决方案,然后自己的总结如下4种方法:1 设置一个默认按钮(不推荐)如/cseries/studymfchexstrxortool1.html前文小节5中所述,只要将“进行异或”这个按钮属性中的Default Button设置为TRUE就行了。但是这样就直接触发这个按钮对应的事件OnBnClickedButton1,而不是对输入的数据进行合法性检查。2 比较推荐的是重载OnOK()函数或者PreTranslateMessage()函数首先我们需要找到这两个函数的位置,方法有两种,效果都是殊途同归:在类视图中点击对话框类(CHexStrXorDlg),然后在“属性”中点击菜单栏上的“重写”按钮,可以选择需要重写的函数。或者直接点击“项目”——“类向导”,“类名”选择对话框类(CHexStrXorDlg),点击“虚函数”就可以看到可以被重载的函数了,右侧是已经被重载了的函数。3 取消回车的效果通过重载OnOK()函数,然后函数体内不做任何处理,这样就可以直接屏蔽回车键的效果了。void CHexStrXorDlg::OnOK(){ //CDialog::OnOK(); return;}4 获取焦点位置,根据是否在Button按钮资源上做相应处理通过重载PreTranslateMessage()消息函数,可以改变MFC的消息控制流程,能自主处理键盘和鼠标消息。于是,先捕捉到回车键所在的控件焦点,然后判断是否是Button按钮。如果焦点在Button按钮上,则给资源ID为i的Button按钮发送点击消息,否则设置下一个控件得到输入焦点。BOOL CHexStrXorDlg::PreTranslateMessage(MSG* pMsg){ // TODO: 在此添加专用代码和/或调用基类 if ((pMsg-message == WM_KEYDOWN (int)pMsg-wParam == VK_RETURN)) { CWnd * wind = GetFocus(); if (wind) { //判断焦点是否在Button按钮上 char str[50]; CString ClassName = _T(Button); GetClassName(wind-m_hWnd, str, 50); if (ClassName == str) { UINT i = wind-GetDlgCtrlID(); SendMessage(WM_COMMAND, i, (LPARAM)wind-m_hWnd); return TRUE; } } //获取当前焦点所在控件的下一个控件的句柄 wind = GetNextDlgTabItem(GetFocus()); if (wind) { //设置下一个控件得到输入焦点 wind-SetFocus(); return TRUE; } } return CDialogEx::PreTranslateMessage(pMsg);}5 直接把回车键的效果替换成TAB键的效果同小节4中一样,先要获取焦点位置信息,但是直接将回车的效果替换成TAB键的效果。BOOL CHexStrXorDlg::PreTranslateMessage(MSG* pMsg){ if ((pMsg-message == WM_KEYDOWN (int)pMsg-wParam == VK_RETURN)) { //把回车效果替换成TAB键的切换效果 if( GetFocus-GetDlgCtrlID() != IDOK ) { pMsg-wParam = VK_TAB; } } return CDialogEx::PreTranslateMessage(pMsg);}
显示全部