关于在对话框上按下回车键 在一个对话框上按下回车,默认响应按下“OK”,现在“OK”按钮已被删除,按下回车后,对话框依然响应它,在回车后对话框就消失了。如何防止这种现象?现在试图加入OnOK函数,在其中进行屏蔽,但因为“OK”已被删,也没法加上。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在PreTranslateMessage中拦载此键。BOOL CTestDialog::PreTranslateMessage(MSG* pMsg){if(pMsg->message==WM_KEYDOWN && pMsg->wParam=VK_ENTER && pMsg->hWnd==GetSafeHwnd())return TRUE;return CDialog::PreTrnalsateMessage(pMsg);} 在PreTranslateMessage中拦载回车BOOL CTestDialog::PreTranslateMessage(MSG* pMsg){if( pMsg->wParam=VK_ENTER ) return TRUE; return CDialog::PreTrnalsateMessage(pMsg);} 防止对话框程序按Enter和ESC退出的对策http://www.xiaozhou.net/cooldog/blogview.asp?logID=15&cateID=1在一般情况下编写的对话框程序,用户在运行的时候,如果不注意按下了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);} 一个很容易的办法你添加一个按钮,设ID为IDOK,然后把代码写好, 如果你不要这个按钮,最后删掉就行了。如果你不想做任何功能,就把CDialog::OnOk()删了就行了。 重载OnOK函数就可以了,.net里很容易做的,vc6就记不清楚了。 添加一个按钮设置为缺省按钮,之后隐藏它。把IDOK按钮删除 另外,删除OnCancel函数,会使对话框无法关闭,ALT+F4也无效,最好还是截获按键屏蔽好点。 搞得那么麻烦啊?按CTRL+W找到对话框类然后在MessageMap里面就有OnOK和OnCancel,然后把里面的 CDialog::OnOK()删除就行了。除非你的类不是对话框类,要不不会没有OnOK 重载的PreTranslateMessage函数中屏蔽回车和ESC的消息 重载的PreTranslateMessage函数是比较正规的做法,也能够理解程序的思路 汗,昨天正好看的是个CPropertyPage类,它的类向导里正好有OnOK,OnCancel.汗,真是汗到家了............ 在PreTranslateMessage中将VK_ENTER屏蔽掉就行了BOOL CTestDialog::PreTranslateMessage(MSG* pMsg){ if( pMsg->wParam = VK_ENTER ) return true; return CDialog::PreTrnalsateMessage(pMsg);} 重载CDialog的OnOk事件就行了。把void CMyDlg::OnOk(){//CDialog::OnOk();} 比较难的问题,求正确答案.100分 学习MFC,大家推荐点好的资料哇! 大厨做菜 和 英雄模式 字符串处理! MFC对话框的消息函数被重入的问题?可能跟系统有关 -- 有难度哦 谁有办法在WIN2000下锁定Ctrl+Alt+Del键啊? 真的没有人会吗?如何手动使得某一个菜单项的某一个子项变灰(失去功能),或者隐藏? 请问哪里有http的指令集? 一个有关DataGrid的问题 请问那里有《WINDOWS程序设计》的电子书?? UNICODE程序能否在WIN98下正常运行?(绝对高分) 简单问题,关于radio button
{
if(pMsg->message==WM_KEYDOWN && pMsg->wParam=VK_ENTER && pMsg->hWnd==GetSafeHwnd())
return TRUE;
return CDialog::PreTrnalsateMessage(pMsg);
}
{
if( pMsg->wParam=VK_ENTER )
return TRUE;
return CDialog::PreTrnalsateMessage(pMsg);
}
http://www.xiaozhou.net/cooldog/blogview.asp?logID=15&cateID=1在一般情况下编写的对话框程序,用户在运行的时候,如果不注意按下了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);
}
你添加一个按钮,设ID为IDOK,然后把代码写好, 如果你不要这个按钮,最后删掉就行了。如果你不想做任何功能,就把CDialog::OnOk()删了就行了。
把IDOK按钮删除
按CTRL+W找到对话框类然后在MessageMap里面就有OnOK和OnCancel,然后把里面的
CDialog::OnOK()删除就行了。除非你的类不是对话框类,要不不会没有OnOK
汗,真是汗到家了............
BOOL CTestDialog::PreTranslateMessage(MSG* pMsg)
{
if( pMsg->wParam = VK_ENTER )
return true;
return CDialog::PreTrnalsateMessage(pMsg);
}
CDialog的OnOk事件就行了。
把
void CMyDlg::OnOk()
{
//CDialog::OnOk();
}