MFC软件运行时按下回车或ESC闪退问题的解决
2016-09-17 15:47
579 查看
之前在写IdGenerator工程的MFC软件是就发现按下Enter键,操作界面会自动退出的问题,当时没注意,指导最近在写一个串口调试终端的界面程序时又出现了类似问题,因此写下我是怎么解决这个问题的。
之所以按下Enter\ESC会自动退出,我也是从网上查到的: http://blog.sina.com.cn/s/blog_a3e5711601011y3e.html
在一般情况下编写的对话框程序,用户在运行的时候,如果不注意按下了ENTER或者ESC键,程序就会立刻退出,之所以会这样,是因为按下Enter键时,Windows就会自动去找输入焦点落在了哪一个按钮上,当获得焦点的按钮的四周将被点线矩形包围。如果所有按钮都没有获得输入焦点,Windows 就会自动去寻找程序或资源所指定的默认按钮(默认按钮边框较粗)。如果对话框没有默认按钮,那么即使对话框中没有OK按钮,OnOK函数也会自动被调用,对于一个普通的对话框程序来说,OnOK函数的调用,以为着程序会立刻退出。为了使Enter键无效,最简单的办法就是将CExDlg的OnOK函数写成空函数,然后针对OK按钮写一个新的函数来响应。ESC键的原理也是如此,它是默认和OnCancel函数映射在一起的。对于ESC键,需要自己重载CDialog类的PreTranslateMessage函数,当发现是ESC键的时候,过滤掉这个消息或者是替换掉这个消息。
我的解决方法是: 重载CDialog类的OnOK()方法和PreTranslateMessage(MSG *pMsg)方法
(1)首先在TerminalDlg.h文件CTerminalDlg类中添加: protected:
virtual void OnOK();
virtual BOOL PreTranslateMessage(MSG *pMsg);
(2) 在TerminalDlg.cpp中添加上面两个函数的实现:
之所以按下Enter\ESC会自动退出,我也是从网上查到的: http://blog.sina.com.cn/s/blog_a3e5711601011y3e.html
在一般情况下编写的对话框程序,用户在运行的时候,如果不注意按下了ENTER或者ESC键,程序就会立刻退出,之所以会这样,是因为按下Enter键时,Windows就会自动去找输入焦点落在了哪一个按钮上,当获得焦点的按钮的四周将被点线矩形包围。如果所有按钮都没有获得输入焦点,Windows 就会自动去寻找程序或资源所指定的默认按钮(默认按钮边框较粗)。如果对话框没有默认按钮,那么即使对话框中没有OK按钮,OnOK函数也会自动被调用,对于一个普通的对话框程序来说,OnOK函数的调用,以为着程序会立刻退出。为了使Enter键无效,最简单的办法就是将CExDlg的OnOK函数写成空函数,然后针对OK按钮写一个新的函数来响应。ESC键的原理也是如此,它是默认和OnCancel函数映射在一起的。对于ESC键,需要自己重载CDialog类的PreTranslateMessage函数,当发现是ESC键的时候,过滤掉这个消息或者是替换掉这个消息。
我的解决方法是: 重载CDialog类的OnOK()方法和PreTranslateMessage(MSG *pMsg)方法
(1)首先在TerminalDlg.h文件CTerminalDlg类中添加: protected:
virtual void OnOK();
virtual BOOL PreTranslateMessage(MSG *pMsg);
(2) 在TerminalDlg.cpp中添加上面两个函数的实现:
//重载OnOK函数 void CTerminalDlg::OnOK() { //空 } //重写虚函数PreTranslateMessage() 用于回车键确认 BOOL CTerminalDlg::PreTranslateMessage(MSG* pMsg) { // TODO: 在此添加专用代码和/或调用基类 if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN) { if(pMsg->wParam == VK_RETURN) { if (GetFocus()->GetDlgCtrlID() == IDC_EDIT_TXDATA)//按下回车,如果当前焦点是在自己期望的控件上 { UpdateData(TRUE); //获取编辑框内容 //m_edtTXData.GetWindowText(m_strTXData); m_strTXData += _T("\r\n"); m_edtTXData.SetWindowText(m_strTXData); //设置光标位置 int len = m_strTXData.GetLength(); m_edtTXData.SetSel(len,len); } return TRUE; } else return TRUE; } else if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE) return TRUE; else return CDialogEx::PreTranslateMessage(pMsg); }因为Terminal界面上有Edit空间,输入时不能屏蔽回车,所以上面的PreTranslateMessage(MSG* pMsg)函数中,添加了实现这部分功能的代码。
相关文章推荐
- MFC中解决回车和ESC关闭的问题,重载OnOk(),OnCancel()函数的正确做法
- MFC中解决回车和ESC关闭的问题,重载OnOk(),OnCancel()函数的正确做法
- MFC对话框模式解决,回车,esc问题
- 如何解决调试WEB页面时自动运行TerraExplorer软件的问题
- MFC 按回车或者Esc退出的解决办法
- 解决Skyline6.5多球对比时,自动运行TerraExplorer软件的问题
- MFC学习(13)解决回车键 ESC 默认关闭窗口的一般方法——续
- MFC(10)解决回车键 ESC 默认关闭窗口的一般方法
- MFC对话框按下回车和Esc键关闭的解决
- ubuntu 上面跑酷狗,哈哈,javafx 强悍啊,解决跨平台问题一软件多系统运行。
- 【游戏开发备注之一】关于Cocos2dx_v1.x版本iphone与Android运行出现图片白块、添加GameCenter报错问题及编译Android闪退的解决办法&&CCLOG与CClog的区别
- Xamarin安装破解后,在虚拟机中运行APP闪退问题的解决
- ESC键直接退出MFC对话框问题解决?
- U880不能线刷升级、升级按钮不亮、刷机软件不能运行等问题的解决办法
- MFC关于解决点击关闭,对话框仍有后台程序运行问题 .
- 解决VS2005编译的MFC在没有安装VS2005的机器上不能运行的问题
- 如何解决中文账户改为英文后软件无法运行的问题?
- MFC中默认回车或ESC会关闭对话框,解决办法:
- MFC对话框程序: 回车,ESC对话框消失解决办法总结
- Win7 VS2010下开发的CS软件,安装到XP下无法运行或者桌面快捷方式无法显示图标的问题解决方法