CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

再议对话框回车键的问题

楼主lgxysl(我心欲静【我的软件:http://lgxyslldw.512j.com】)2005-05-03 18:06:02 在 VC/MFC / 基础类 提问

VC什么都好,但也有一些问题令人很头痛!突出的如:  
  如果应用程序是用基于对话框的方式时,如果用户按下回车键,对话框就会关闭!  
  为了解决这个问题,大家都想了很多方法,主要有两种  
  (1)改写OnOK()和OnCancel()函数,这种方法可以防止对话框关闭,但是正常的回车的消息却被截断,无法在对话框中影响回车键  
  (2)重载并改写PreTranslateMessage(MSG*   pMsg)函数,在这个函数里检测回车键是否按下,如是,执行一些想要的操作,这种方法比第一种方法好些,但也是没有最终解决问题,回车键的消息在执行自定义的操作之后,依然被截断。用这种方法不能解决如下的问题:  
          例如,在一个对话框程序中,应用了一个第三方的控件,这个控件是封装的,它要接受回车键处理一些它内部定义的一些操作,因为封装,程序员不能通过代码在PreTranslateMessage函数中处理这个第三控件对回车键的响应。用简单的处理移动焦点之类的处理办法已不能解决这个问题了,这个控件必须接收到回车键,而不是其它的键。这就要求必须在不执行CDialog::PreTranslateMessage(pMsg)的情况下,要把回车键的消息传送给对话框内的第三方控件。显然这第二种方法对实现这们的操作有些困难。  
   
  我现在想要认大家讨论的是:  
          如何能在不执行CDialog::PreTranslateMessage的情况下,把回车键的消息传播给对话框内的所有控件呢? 问题点数:20、回复次数:25Top

1 楼lgxysl(我心欲静【我的软件:http://lgxyslldw.512j.com】)回复于 2005-05-03 18:22:29 得分 0

我已想到了一个办法,就是如果回车的消息句柄是对话框本身时,就立即还回,如果是其内部的控件就不直接返回。不知可行不可行。  
  但不我知道如何获得对话框本身的句柄。Top

2 楼42252343(大跃进的猪)回复于 2005-05-03 18:49:54 得分 5

不改写PreTranslateMessage   在CDialog中你根本就不能捕捉到回车消息Top

3 楼zx_sanjin(www.chmbook.com - CHM电子书网)回复于 2005-05-03 19:35:56 得分 3

不知楼主是否还有其他特殊要求?  
   
  重载OnOK,只要把CDialog::OnOK()去掉就可以了吧~~   对话框内部的控件能够获得键盘回车事件。  
  至于OnCancel我觉得挺好的,按Esc就退吧,也没什么啊Top

4 楼sboom(+-LingCh-+)(爱美人不爱VC)回复于 2005-05-03 20:18:35 得分 3

如何能在不执行CDialog::PreTranslateMessage的情况下,把回车键的消息传播给对话框内的所有控件呢?  
  ///////////////////////////  
  PreTranslateMessage是一定会执行的了,问题只是你重写不重写而已.  
   
  非要不写PreTranslateMessage的话,你就重写CWinApp的Init方法,对话筐默认是摸态的,你改成非摸态,然后在run()中自己写消息循环吧.Top

5 楼gamezealot([窮書生]: 小生...)回复于 2005-05-03 20:23:27 得分 1

同意楼上的~Top

6 楼1983lx(1983lx)回复于 2005-05-03 20:42:18 得分 1

将某个按钮设为default   button就行了Top

7 楼anlywei(建安)回复于 2005-05-03 21:33:00 得分 0

学习Top

8 楼virtualfunction(virtualfunction)回复于 2005-05-03 22:00:43 得分 1

用SubClass技术把回车键的消息传送给对话框内的第三方控件,这是第三方控件二次开发的常用办法!  
  Top

9 楼lgxysl(我心欲静【我的软件:http://lgxyslldw.512j.com】)回复于 2005-05-03 22:02:29 得分 0

不知楼主是否还有其他特殊要求?  
   
  重载OnOK,只要把CDialog::OnOK()去掉就可以了吧~~   对话框内部的控件能够获得键盘回车事件。  
  至于OnCancel我觉得挺好的,按Esc就退吧,也没什么啊  
  ______________________________________________________________  
  无论是把OnOK()去掉还是PreTranslateMessage里截获回车消息,可以达到对话框不被回车键直接关闭,但都会使其内部的控件不能接收回车事件.  
  >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  
   
  非要不写PreTranslateMessage的话,你就重写CWinApp的Init方法,对话筐默认是摸态的,你改成非摸态,然后在run()中自己写消息循环吧.  
  __________________________________________________  
  是重写CDialog类的Run,还是重写CWinApp的Run?能否具体给一段代码?  
   
   
   
  Top

10 楼lgxysl(我心欲静【我的软件:http://lgxyslldw.512j.com】)回复于 2005-05-03 22:03:26 得分 0

用SubClass技术把回车键的消息传送给对话框内的第三方控件,这是第三方控件二次开发的常用办法!  
  _______________________________________________  
   
  请说说如何具体实现?Top

11 楼reesoft(Ree)回复于 2005-05-03 22:44:45 得分 1

重载对话框的OnOK()函数,判断当前光标焦点位于哪个控件上,可以作出不同的处理。  
   
  ...  
  CWnd   *pFocusControl   =   GetFocus();  
  if   (*pFocusControl   ==   m_btnOK)  
  {  
          ...  
  }  
  else   if   (GetFocus()   ==   m_editName)  
  {  
          ...  
  }  
  else  
  ...  
   
  m_btnOK、m_editName为控件变量。  
  Top

12 楼surstar(我要写个操作系统出来……)回复于 2005-05-03 22:47:19 得分 0

对于对话框的,我一般一新建就删掉上面两BUTTON,这样就没有什么事了,弄得这么复杂~Top

13 楼surstar(我要写个操作系统出来……)回复于 2005-05-03 22:49:35 得分 0

重发一个贴吧,这个问题越讨论越乱了,   你要用最简单的语言来描述问题  
   
  你上面说的   会把大家引导错误方向~Top

14 楼lgxysl(我心欲静【我的软件:http://lgxyslldw.512j.com】)回复于 2005-05-03 23:10:08 得分 0

哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈!  
  问题解决,原来竟是如此的简单!!!!!!!!!!!!!!!!!!!!!!!!  
   
  代码如下:  
   
  BOOL   CDhkDlg::PreTranslateMessage(MSG*   pMsg)  
  {  
          if(pMsg->message   ==   WM_KEYDOWN)  
          {  
  if   (pMsg->wParam   ==   VK_ESCAPE) //Esc键不退出程序  
  {  
  return   TRUE;  
  }  
  else   if(pMsg->wParam   ==   VK_RETURN)  
  {  
        return   FALSE;//对话框内部控件可以接收到回车消息!!  
        //return   TRUE;//对话框内部控件不可以接收到回车消息!!  
                                            //原因原来在这里,难为我困惑了那么久!!!  
  }  
        }  
   
  return   CDialog::PreTranslateMessage(pMsg);  
  }Top

15 楼lgxysl(我心欲静【我的软件:http://lgxyslldw.512j.com】)回复于 2005-05-03 23:13:33 得分 0

对于对话框的,我一般一新建就删掉上面两BUTTON,这样就没有什么事了,弄得这么复杂~  
  _____________________________________________________  
  这完全是错误的!!!看来有几个角的对这个问题还是很模糊呀!  
   
  我的方法,绝对是正解!  
  我终于摆脱对话框的这个阴影,能随心所欲地开发基于对话框的应用程序了!  
   
  高兴!!!!!!!!!!!Top

16 楼alaisalaix(天上人间)回复于 2005-05-04 00:23:53 得分 0

对于楼主的帖子,我无语  
  对于楼主本人,我更无语Top

17 楼alaisalaix(天上人间)回复于 2005-05-04 00:24:43 得分 0

还是说一点吧:  
  谦虚一点,你是来学习的。Top

18 楼zx_sanjin(www.chmbook.com - CHM电子书网)回复于 2005-05-04 21:24:48 得分 0

>>无论是把OnOK()去掉还是PreTranslateMessage里截获回车消息,可以达到对话框不被回车键直接关  
  >>闭,但都会使其内部的控件不能接收回车事件.  
  只要焦点在控件上,就能够接收到回车事件,问题是你想怎么做?  
   
  你的那个方法会使该对话框不能够再处理回车和Esc事件,除非你确定这样做。Top

19 楼lgxysl(我心欲静【我的软件:http://lgxyslldw.512j.com】)回复于 2005-05-04 21:43:50 得分 0

对于楼主的帖子,我无语  
  对于楼主本人,我更无语  
  ____________________________________  
  什么意思呀?Top

20 楼zx_sanjin(www.chmbook.com - CHM电子书网)回复于 2005-05-04 21:56:00 得分 2

我来解释!  
   
  >>这完全是错误的!!!看来有几个角的对这个问题还是很模糊呀!  
  >>我的方法,绝对是正解!  
   
  即使是你对了,也没必要说出这样的话。  
  不要轻易否定别人的话!  
  不要轻易对别人下结论!  
  不要过分相信自己!  
   
  >>我终于摆脱对话框的这个阴影,能随心所欲地开发基于对话框的应用程序了!  
  >>     return   FALSE;//对话框内部控件可以接收到回车消息!!  
  >>     //return   TRUE;//对话框内部控件不可以接收到回车消息!!  
  >>     //原因原来在这里,难为我困惑了那么久!!!  
   
  单凭以上的注释,我并不认为你完全理解了,有想过为什么吗?至少我没看到。  
  Top

21 楼lgxysl(我心欲静【我的软件:http://lgxyslldw.512j.com】)回复于 2005-05-04 22:45:50 得分 0

1、  
  对于对话框的,我一般一新建就删掉上面两BUTTON,这样就没有什么事了,弄得这么复杂~  
  _____________________________________________________  
  这完全是错误的!!!看来有几个角的对这个问题还是很模糊呀!  
   
  ______________________________________________________________  
  难道我说得不对吗?不信你删了两个BUTTON后按回车键试试,对话不照样关掉才怪呢!对就是对,错就是错,不用含糊。  
   
  2、  
  >>我终于摆脱对话框的这个阴影,能随心所欲地开发基于对话框的应用程序了!  
  >>     return   FALSE;//对话框内部控件可以接收到回车消息!!  
  >>     //return   TRUE;//对话框内部控件不可以接收到回车消息!!  
  >>     //原因原来在这里,难为我困惑了那么久!!!  
   
  单凭以上的注释,我并不认为你完全理解了,有想过为什么吗?至少我没看到。  
  _________________________________________________________________________  
  这我的确没有深究,也觉得没有必要再深究。我想大概是如此,如果返回TRUE,那么系统会认为消息已被处理,不再向下发送,所以控件便收不到消息;如果返回FALSE,系统会认为消息没有得到处理,继续向下一层次传送,控件就可以收到消息。  
  有许多问题也不要太钻牛角尖,能解决问题主是了。MFC及API本身就很复杂,每样都钻到牛角尖里去的话,那什么程序都不用编了。不过,有兴趣的高手当然你可以去钻钻这个牛角尖,有了成果不忘告诉我一声,而我就没有这份闲心了。  
   
  我都把我的经验这么无私地告诉大家,不知为什么还会招来这些非议。你可以搜搜相关的贴子,看看有那一个像我这样说到了问题的点子上了的!  
  Top

22 楼zx_sanjin(www.chmbook.com - CHM电子书网)回复于 2005-05-05 08:59:11 得分 1

引用alaisalaix(流水落花春去也,天上人间)   的话:  
  对于楼主的帖子,我无语  
  对于楼主本人,我更无语  
   
  再次引用alaisalaix(流水落花春去也,天上人间)的话:  
  谦虚一点,你是来学习的。  
   
  尤其是:  
  >>你可以搜搜相关的贴子,看看有那一个像我这样说到了问题的点子上了的!  
   
  太自以为是了~~Top

23 楼yifanlxj(微观工作室)回复于 2005-05-05 09:40:11 得分 2

不要争了,解决问题才是正确。Top

24 楼mynamelj(风动,帆动,仁者心动)回复于 2005-05-05 12:46:00 得分 0

去掉Default   button属性就可以了Top

25 楼lgxysl(我心欲静【我的软件:http://lgxyslldw.512j.com】)回复于 2005-05-08 18:46:53 得分 0

想不到发这个贴还招骂!  
  明天结贴算了。Top

相关问题

  • 回车键关闭对话框!
  • 奇怪的对话框回车键
  • 请问如何屏蔽掉对话框的回车键?
  • 关于在对话框上按下回车键
  • 模式对话框中关于回车键的问题!
  • 为什么我在嵌入视图的对话框中按下回车键,对话框就消失了。
  • 请教,关于在子对话框中控制回车键的问题。
  • 请问对话框程序中如何屏蔽“回车”键和“ESC”键
  • ********救急啊*********对话框程序怎么一按回车键就没了??
  • 如何使对话框里的EDIT控件响应键盘的回车键????????????????????????

关键词

  • 控件
  • 消息
  • 函数
  • 应用程序
  • 执行
  • 解决
  • 对话框
  • 回车键
  • 回车
  • pretranslatemessage

得分解答快速导航

  • 帖主:lgxysl
  • 42252343
  • zx_sanjin
  • sboom
  • gamezealot
  • 1983lx
  • virtualfunction
  • reesoft
  • zx_sanjin
  • zx_sanjin
  • yifanlxj

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo