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;
...全文
321 点赞 收藏 18
写回复
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
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
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告
暂无公告