再议对话框回车键的问题

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

我现在想要认大家讨论的是:
如何能在不执行CDialog::PreTranslateMessage的情况下,把回车键的消息传播给对话框内的所有控件呢?
...全文
456 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
lgxysl 2005-05-08
  • 打赏
  • 举报
回复
想不到发这个贴还招骂!
明天结贴算了。
mynamelj 2005-05-05
  • 打赏
  • 举报
回复
去掉Default button属性就可以了
yifanlxj 2005-05-05
  • 打赏
  • 举报
回复
不要争了,解决问题才是正确。
zx_sanjin 2005-05-05
  • 打赏
  • 举报
回复
引用alaisalaix(流水落花春去也,天上人间) 的话:
对于楼主的帖子,我无语
对于楼主本人,我更无语

再次引用alaisalaix(流水落花春去也,天上人间)的话:
谦虚一点,你是来学习的。

尤其是:
>>你可以搜搜相关的贴子,看看有那一个像我这样说到了问题的点子上了的!

太自以为是了~~
alaisalaix 2005-05-04
  • 打赏
  • 举报
回复
还是说一点吧:
谦虚一点,你是来学习的。
alaisalaix 2005-05-04
  • 打赏
  • 举报
回复
对于楼主的帖子,我无语
对于楼主本人,我更无语
lgxysl 2005-05-04
  • 打赏
  • 举报
回复
1、
对于对话框的,我一般一新建就删掉上面两BUTTON,这样就没有什么事了,弄得这么复杂~
_____________________________________________________
这完全是错误的!!!看来有几个角的对这个问题还是很模糊呀!

______________________________________________________________
难道我说得不对吗?不信你删了两个BUTTON后按回车键试试,对话不照样关掉才怪呢!对就是对,错就是错,不用含糊。

2、
>>我终于摆脱对话框的这个阴影,能随心所欲地开发基于对话框的应用程序了!
>> return FALSE;//对话框内部控件可以接收到回车消息!!
>> //return TRUE;//对话框内部控件不可以接收到回车消息!!
>> //原因原来在这里,难为我困惑了那么久!!!

单凭以上的注释,我并不认为你完全理解了,有想过为什么吗?至少我没看到。
_________________________________________________________________________
这我的确没有深究,也觉得没有必要再深究。我想大概是如此,如果返回TRUE,那么系统会认为消息已被处理,不再向下发送,所以控件便收不到消息;如果返回FALSE,系统会认为消息没有得到处理,继续向下一层次传送,控件就可以收到消息。
有许多问题也不要太钻牛角尖,能解决问题主是了。MFC及API本身就很复杂,每样都钻到牛角尖里去的话,那什么程序都不用编了。不过,有兴趣的高手当然你可以去钻钻这个牛角尖,有了成果不忘告诉我一声,而我就没有这份闲心了。

我都把我的经验这么无私地告诉大家,不知为什么还会招来这些非议。你可以搜搜相关的贴子,看看有那一个像我这样说到了问题的点子上了的!
zx_sanjin 2005-05-04
  • 打赏
  • 举报
回复
我来解释!

>>这完全是错误的!!!看来有几个角的对这个问题还是很模糊呀!
>>我的方法,绝对是正解!

即使是你对了,也没必要说出这样的话。
不要轻易否定别人的话!
不要轻易对别人下结论!
不要过分相信自己!

>>我终于摆脱对话框的这个阴影,能随心所欲地开发基于对话框的应用程序了!
>> return FALSE;//对话框内部控件可以接收到回车消息!!
>> //return TRUE;//对话框内部控件不可以接收到回车消息!!
>> //原因原来在这里,难为我困惑了那么久!!!

单凭以上的注释,我并不认为你完全理解了,有想过为什么吗?至少我没看到。
lgxysl 2005-05-04
  • 打赏
  • 举报
回复
对于楼主的帖子,我无语
对于楼主本人,我更无语
____________________________________
什么意思呀?
zx_sanjin 2005-05-04
  • 打赏
  • 举报
回复
>>无论是把OnOK()去掉还是PreTranslateMessage里截获回车消息,可以达到对话框不被回车键直接关
>>闭,但都会使其内部的控件不能接收回车事件.
只要焦点在控件上,就能够接收到回车事件,问题是你想怎么做?

你的那个方法会使该对话框不能够再处理回车和Esc事件,除非你确定这样做。
lgxysl 2005-05-03
  • 打赏
  • 举报
回复
对于对话框的,我一般一新建就删掉上面两BUTTON,这样就没有什么事了,弄得这么复杂~
_____________________________________________________
这完全是错误的!!!看来有几个角的对这个问题还是很模糊呀!

我的方法,绝对是正解!
我终于摆脱对话框的这个阴影,能随心所欲地开发基于对话框的应用程序了!

高兴!!!!!!!!!!!
lgxysl 2005-05-03
  • 打赏
  • 举报
回复
哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈!
问题解决,原来竟是如此的简单!!!!!!!!!!!!!!!!!!!!!!!!

代码如下:

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);
}
surstar 2005-05-03
  • 打赏
  • 举报
回复
重发一个贴吧,这个问题越讨论越乱了, 你要用最简单的语言来描述问题

你上面说的 会把大家引导错误方向~
surstar 2005-05-03
  • 打赏
  • 举报
回复
对于对话框的,我一般一新建就删掉上面两BUTTON,这样就没有什么事了,弄得这么复杂~
Reesoft 2005-05-03
  • 打赏
  • 举报
回复
重载对话框的OnOK()函数,判断当前光标焦点位于哪个控件上,可以作出不同的处理。

...
CWnd *pFocusControl = GetFocus();
if (*pFocusControl == m_btnOK)
{
...
}
else if (GetFocus() == m_editName)
{
...
}
else
...

m_btnOK、m_editName为控件变量。
lgxysl 2005-05-03
  • 打赏
  • 举报
回复
用SubClass技术把回车键的消息传送给对话框内的第三方控件,这是第三方控件二次开发的常用办法!
_______________________________________________

请说说如何具体实现?
lgxysl 2005-05-03
  • 打赏
  • 举报
回复
不知楼主是否还有其他特殊要求?

重载OnOK,只要把CDialog::OnOK()去掉就可以了吧~~ 对话框内部的控件能够获得键盘回车事件。
至于OnCancel我觉得挺好的,按Esc就退吧,也没什么啊
______________________________________________________________
无论是把OnOK()去掉还是PreTranslateMessage里截获回车消息,可以达到对话框不被回车键直接关闭,但都会使其内部的控件不能接收回车事件.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

非要不写PreTranslateMessage的话,你就重写CWinApp的Init方法,对话筐默认是摸态的,你改成非摸态,然后在run()中自己写消息循环吧.
__________________________________________________
是重写CDialog类的Run,还是重写CWinApp的Run?能否具体给一段代码?



virtualfunction 2005-05-03
  • 打赏
  • 举报
回复
用SubClass技术把回车键的消息传送给对话框内的第三方控件,这是第三方控件二次开发的常用办法!
anlywei 2005-05-03
  • 打赏
  • 举报
回复
学习
1983lx 2005-05-03
  • 打赏
  • 举报
回复
将某个按钮设为default button就行了
加载更多回复(5)

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧