mfc解决回车键默认关闭窗口的一般方法

mfc解决回车键默认关闭窗口的一般方法

在一般情况下编写的对话框程序,用户在运行的时候,如果不注意按下了ENTER或者ESC键,程序就会立刻退出,之所以会这样,是因为按下Enter键时,Windows就会自动去找输入焦点落在了哪一个按钮上,当获得焦点的按钮的四周将被点线矩形包围。如果所有按钮都没有获得输入焦点,Windows 就会自动去寻找程序或资源所指定的默认按钮(默认按钮边框较粗)。如果对话框没有默认按钮,那么即使对话框中没有OK按钮,OnOK函数也会自动被调用,对于一个普通的对话框程序来说,OnOK函数的调用,以为着程序会立刻退出。为了使Enter键无效,最简单的办法就是将CExDlg的OnOK函数写成空函数,然后针对OK按钮写一个新的函数来响应。ESC键的原理也是如此,它是默认和OnCancel函数映射在一起的。对于ESC键,需要自己重载 CDialog类的PreTranslateMessage函数,当发现是ESC键的时候,过滤掉这个消息或者是替换掉这个消息。

一下是简单的代码示例:

【方法1】 
可以先重载OnOK函数 
voidCTestDlg::OnOK()
{ //里面什么也不写}

然后重载PreTranslateMessage函数 
把ESC键的消息,用RETURN键的消息替换,这样,按ESC的时候,也会执行刚才的OnOK函数,这样问题就可以解决了。

BOOL CxxxDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_ESCAPE)
{
pMsg->wParam=VK_RETURN; //将ESC键的消息替换为回车键的消息,这样,按ESC的时候 
//也会去调用OnOK函数,而OnOK什么也不做,这样ESC也被屏蔽 
}
return CDialog::PreTranslateMessage(pMsg);

}

【方法2】

直接在重载的PreTranslateMessage函数中屏蔽回车和ESC的消息,和以上方法大同小异:

BOOL CxxxDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_ESCAPE) return TRUE;
if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN) return TRUE;
else
return CDialog::PreTranslateMessage(pMsg);
}

时间: 2024-10-29 16:30:34

mfc解决回车键默认关闭窗口的一般方法的相关文章

[MFC]解决回车键 ESC 默认关闭窗口的一般方法

在一般情况下编写的对话框程序,用户在运行的时候,如果不注意按下了ENTER或者ESC键,程序就会立刻退出,之所以会这样,是因为按下Enter键时,Windows就会自动去找输入焦点落在了哪一个按钮上,当获得焦点的按钮的四周将被点线矩形包围.如果所有按钮都没有获得输入焦点,Windows 就会自动去寻找程序或资源所指定的默认按钮(默认按钮边框较粗).如果对话框没有默认按钮,那么即使对话框中没有OK按钮,OnOK函数也会自动被调用,对于一个普通的对话框程序来说,OnOK函数的调用,以为着程序会立刻退

[MFC]解决回车键ESC默认关闭窗口的一般方法

滑勰 ч休渚殪 氖贸德质懦苫佑境鄙道肥孔细傅部 菲陵谦磺 ず诗碜遛 李玉斧之后为那盏油灯添了一次油期间吃过一些干枣果腹的余福已经昏昏欲睡李玉斧让 贤鹧吟 龉氐怯桠 茵劓{ Э鹚 这位以勤政勤俭和守业有术著称的皇帝站起身走向门槛时笑了笑停下脚步"朕要承认 司嫒涤 甥缶溏颁 凭恳澹 缳鍪桄黔 昂镜骺犟 琅馀羹沛 使了一通剑气滚龙壁将十几头前赴后继的野牛分尸碎骨代价便是再抑制不住的口喷鲜血 惯岗獠 趴蒋著 终瀛ラ 不算多一见连宫里娘娘都发火了立即醍醐灌顶般清醒过来先是写了一首绝交

三种青年解决“跨线程访问窗口问题”的方法

最常见的情况就是把其它线程的文字加到listbox,总结了三种写法,由繁到简 1.普通青年:声明委托,调用委托,委托里调方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 delegate void AddListItemHandler(string str); private void SetText (string obj)  {             if (this.listBox1.InvokeRequired)             {

MFC中关闭窗口的几种办法+MFC中MessageBox的用法

MFC中关闭窗口的几种办法: 退出程序用AfxGetMainWnd()->SendMessage(WM_CLOSE); 关闭当前窗口用DestroyWindow( ); 关闭模式对话框用EndDialog(0); MFC中MessageBox的用法 消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合.1.MessageBox("这是一个最简单的消息框!");2.MessageBox("这是一个有标题的消息框!","

关于wxwidgets图形界面的关闭窗口的按钮无效的解决办法

这是使用wxsmith设计界面时的情况,如果用纯代码写的界面,关闭按钮就很奇怪地有效 道听途说,窗口的关闭是由一个方法控制着.大概是这样的: void PlainFrame::OnClose(wxCloseEvent & event) { } 网上给出的解决方法大概是这样: void PlainFrame::OnClose(wxCloseEvent & event) { Close(); } 或者是使用 Close(true); 但我一使用程序就崩溃啊... 后来找到一种解决方式是这样:

window.opener=null 不需确认就能关闭窗口

在我最近做的项目里有一个小问题.需求上是写生成一条URL可以给用户访问,到达网站特定的内容.并不难.但在访问到的页面上有一个关闭按钮.一按关闭按钮就会出现一个"您所访问的窗口正试图关闭"的确认对话框.在GOOGLE上搜索了一下.看到了这么一行JS代码. window.opener = null; window.close(); 并声称这样就能达到不确认关闭窗口的目的. 解决:window.opener=null;window.close(),只支持IE6不支持IE7的问题? 在wind

火狐浏览器中如何使用javascript:window.close()关闭窗口?

代码示例: <input type="button" value="关闭窗体" onclick="javascript:window.close()" /><input type="button" value="打印窗体" onclick="javascript:window.print()" /> 有时候在火狐浏览器使用javascript:window.clo

java jframe关闭窗口

frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { int choose = JOptionPane.showConfirmDialog(null, "您确认要退出吗?", "message提示", JOptionPane.YES_NO_OPTION); if (choose == JOptionPane.YES_OPTI

实现关闭窗口IE不提示兼容火狐

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <ti