请问在对话框程序中怎么才能做到按下Enter键程序不退出? 我的程序经常无意中按了一下enter键,程序就退出了。我不想这样呀,有那位知道是怎么回事吗?谢了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 OK按纽的Defualt button属性去掉就好了 你重写Default button的响应函数就行了,OK 把你的按钮的默认ID名改掉.如果是IDOK就一定要改啦.可能就是这个原因! 重载PreTranslateMessage函数,把enter屏蔽掉,哈哈 错了,等我改好不再给大家算帐呀.不过我的程序已经把OK和Cancel按钮都删掉了,肯定没有IDOK的ID不.我看看哪个按钮有Default Button属性吧,还有怎么写Default Button的相应函数呀?能给段代码吗? 如果你想要disable回车键,最简单的方法是重载OnOK函数,这固然是个不坏的主意,但如果你重载OnOK,让它什么事情也不干,那麽当用户用鼠标按下回车键想真正做些什么的时候怎么办呢?你可以改变回车键的ID,如:ID_MY_OK,并写一个调用EndDialog的处理器,这个方法虽然也能行得通,但显得有点不专业。 另外一种方法是disable回车键的“默认”属性。这也是之前开始所提出的方法,之所以没有成功,是因为仅仅uncheck 回车键的 BS_DEFPUSHBUTTON 属性是不够的,你可以利用Spy++仔细地观察控制和实验就能发现回车键仍然我行我素发送退出消息。 问题出在哪呢?你必须区分OK键和回车键,你可以写一个OnOK处理器调用GetCurrentMessage函数获取最后发送的消息,应该是WM_COMMAND,再检查WPARAM的低位字(low-order word)看看命令来自何处。 要解决问题,必须搞清楚背后所发生的一切,在Spy++中可以看到,当用户按下回车键时,Windows发送一个特殊的WM_GETDEFID消息来获得缺省的命令ID,Windows再将它作为WM_COMMAND发送。所以,你要做的就是重载WM_GETDEFID消息,在有关Windows的文档中是这样描述WM_GETDEFID返回值的:“如果有缺省得按钮,则返回值的高位字包含DC_HASDEFID,低位字包含控制的标识符。否则,返回值是零。” 根据这段描述,假设如果没有缺省得按钮,则返回值应该是零。如果想要disable缺省得ID,必须在高位字中返回DC_HASDEFID。 BEGIN_MESSAGE_MAP(CMyDlg, CDialog) ON_MESSAGE(DM_GETDEFID, OnGetDefID) ...END_MESSAGE_MAP()LRESULT CMyDlg::OnGetDefID(WPARAM wp, LPARAM lp) { return MAKELONG(0,DC_HASDEFID); } http://www.vckbase.com/document/viewdoc/?id=481 BOOL CMyDlg::PreTranslateMessage(MSG* pMsg){ if( pMsg->message == WM_KEYDOWN ) { switch( pMsg->wParam ) { case VK_RETURN: //屏蔽回车 return TRUE; } } return CDialog::PreTranslateMessage(pMsg);} 同上,要屏蔽ESC就加入一条case VK_ESCAPE: return TRUE; 新手怎样将16进制字符转成汉字 调用DLL,被卡住了,求帮忙 关于三态树的简单问题 VC2003或2005编译的代码能否改到VC6.0使用? SetScrollInfo 运行不成功 怎样写这条sql语句? 帮我一下! 2个简单的送分的基于MFC的小问题 用ADO连接SQL SERVER,如何知道SQL SERVER数据库服务器关闭了? 毕业设计~~!大家进来看看。 前辈们好:如何在document和modeless dialog中获得view的指针? InstallShield的问题,急...在线等待
另外一种方法是disable回车键的“默认”属性。这也是之前开始所提出的方法,之所以没有成功,是因为仅仅uncheck 回车键的 BS_DEFPUSHBUTTON 属性是不够的,你可以利用Spy++仔细地观察控制和实验就能发现回车键仍然我行我素发送退出消息。
问题出在哪呢?你必须区分OK键和回车键,你可以写一个OnOK处理器调用GetCurrentMessage函数获取最后发送的消息,应该是WM_COMMAND,再检查WPARAM的低位字(low-order word)看看命令来自何处。
要解决问题,必须搞清楚背后所发生的一切,在Spy++中可以看到,当用户按下回车键时,Windows发送一个特殊的WM_GETDEFID消息来获得缺省的命令ID,Windows再将它作为WM_COMMAND发送。所以,你要做的就是重载WM_GETDEFID消息,在有关Windows的文档中是这样描述WM_GETDEFID返回值的:“如果有缺省得按钮,则返回值的高位字包含DC_HASDEFID,低位字包含控制的标识符。否则,返回值是零。”
根据这段描述,假设如果没有缺省得按钮,则返回值应该是零。如果想要disable缺省得ID,必须在高位字中返回DC_HASDEFID。
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
ON_MESSAGE(DM_GETDEFID, OnGetDefID)
...
END_MESSAGE_MAP()LRESULT CMyDlg::OnGetDefID(WPARAM wp, LPARAM lp)
{
return MAKELONG(0,DC_HASDEFID);
}
{
if( pMsg->message == WM_KEYDOWN )
{
switch( pMsg->wParam )
{
case VK_RETURN: //屏蔽回车
return TRUE;
}
} return CDialog::PreTranslateMessage(pMsg);
}
return TRUE;