PreTranslateMessage响应WM_KEYDOWN问题

gigibuffon 2010-08-13 11:09:15
一个简单的对话框模式程序只有4个button
当程序初始化完成时,PreTranslateMessage能够响应回车键,
但当按了某一个button后,回车键就不响应了。
同事说可能是focus的问题,请这儿的高手来解释下到底什么原因,该怎么解决。
代码如下:
if (pMsg->message == WM_KEYDOWN)
{
CPoint movedPos = m_xyStartPos;
switch (pMsg->wParam)
{
case KEY_RETURN:
if (m_bInitRoadNetwork)
{
OnBnClickedShownodes();
}
break;
default:
break;
}

}
else
{
return CDialog::PreTranslateMessage(pMsg);
}
return FALSE;
...全文
368 18 打赏 收藏 举报
写回复
18 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
gigibuffon 2010-08-13
Button只是主对话框类的一个接口函数而已。怎么可能重写
你们都没明白我的意思。
  • 打赏
  • 举报
回复
maple_zhj 2010-08-13
同意楼上的,

我也是怀疑,你重写了 你那个Button上的 PreTranslateMessage,

导致主对话框中的 PreTranslateMessage 接收不到消息。

请记得在 重写 虚函数时,

在适合的地方,加上 对上一继承层次的虚函数的调用:

比如在Dialog中,就是return CDialog::PreTranslateMessage(pMsg);
在Button中的话,类似。
  • 打赏
  • 举报
回复
xxd_qd 2010-08-13
难道你的那个Button上也做了PreTranslateMessage?
  • 打赏
  • 举报
回复
小楫轻舟 2010-08-13
楼主在if (pMsg->message == WM_KEYDOWN)
处设置断点一步一步调试看
最好在PreTranslateMessage(MSG* pMsg)的第一行就开始断点
  • 打赏
  • 举报
回复
karlaa 2010-08-13
最后为什么Return FALSE不return CDialog::PreTranslateMessage(pMsg);消息都截止了
  • 打赏
  • 举报
回复
gigibuffon 2010-08-13
恩自己定义的,反正是13,不影响。
  • 打赏
  • 举报
回复
小楫轻舟 2010-08-13
case KEY_RETURN: ?
好像是VK_RETURN,楼主重新定义了?
  • 打赏
  • 举报
回复
gigibuffon 2010-08-13
OnBnClickedShownodes();
这个函数做什么和PreTranslateMessage无关。
现在问题是我按过某个按键以后
在if (m_bInitRoadNetwork)设断点。
再在界面上按回车键,根本就进不到断点语句。
  • 打赏
  • 举报
回复
Eleven 2010-08-13
OnBnClickedShownodes();
这个函数里做了什么?
  • 打赏
  • 举报
回复
gigibuffon 2010-08-13
不是,按了以后m_bInitRoadNetwork变true。
在PreTranslateMessage里面设断点,再按回车就能响应了
应该就是消息响应的窗口不对,感觉。
  • 打赏
  • 举报
回复
小楫轻舟 2010-08-13
按了某一个button后
m_bInitRoadNetwork是不是变成false了
  • 打赏
  • 举报
回复
gigibuffon 2010-08-13
可以了,重设了下焦点就好了。
不过我觉得奇怪的是焦点不知道在哪儿被改了,我也没做什么操作。
  • 打赏
  • 举报
回复
muzizongheng 2010-08-13
设置dialog获得焦点。

  • 打赏
  • 举报
回复
yuucyf 2010-08-13
原因应当如楼上所说!
  • 打赏
  • 举报
回复
xxd_qd 2010-08-13
[Quote=引用 12 楼 mudunke775 的回复:]
你应该看下是否BUTTON里的代码截断了按键消息,
应该是你按了BUTTON键后,再按回车的时候,系统会认为是再次按了BUTTON键,不信你在按键的函数中设断点看下。
解决方法是响应完了BUTTON后,将焦点退出BUTTON
[/Quote]
怎么可能!照你的说法,岂不是说只要焦点在按钮上,那么再按回车的时候系统就不发出WM_KEYDOWN消息了?

如果不是楼主自定义了一个Button类并且截断了PreTranslateMessage的话,那么唯一的可能就是:你在那个Button的响应函数里把输入焦点转移到了对话框之外。对话框的PreTranslateMessage只有当输入焦点在它的子窗口上的时候才有效,如果你的Button响应函数弹出了另外一个东西,那显然就失效了。
  • 打赏
  • 举报
回复
Eleven 2010-08-13
[Quote=引用 13 楼 gigibuffon 的回复:]
如何将焦点退出button,楼上能说详细点吗
[/Quote]
::SetFocus(其他HWND);
  • 打赏
  • 举报
回复
gigibuffon 2010-08-13
如何将焦点退出button,楼上能说详细点吗
  • 打赏
  • 举报
回复
mudunke775 2010-08-13
你应该看下是否BUTTON里的代码截断了按键消息,
应该是你按了BUTTON键后,再按回车的时候,系统会认为是再次按了BUTTON键,不信你在按键的函数中设断点看下。
解决方法是响应完了BUTTON后,将焦点退出BUTTON
  • 打赏
  • 举报
回复
相关推荐
发帖
VC/MFC

1.6w+

社区成员

VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
帖子事件
创建了帖子
2010-08-13 11:09
社区公告

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