有些懵了,回车键怎么就捕获不到。

sc_valentine21 2010-12-29 11:08:53
对话框上有编辑框(RichEdit),其他按钮,在编辑框输入后,本意是回车键就将输入内容发送出去,但是回车键就是捕不到,始终响应的换行。

编辑框用一个CWnd包装,加到对话框上,在对话框中PreTranslateMessage,根本就不进来。

我不太明白这个消息流程是怎么的。

比如说一个对话框,上面添加一个控件,那么按键时,消息是先走对话框,然后再排到具体的控件上去?

好心人,解释下,谢谢。
...全文
262 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sc_valentine21 2010-12-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zyrr159487 的回复:]
如果只是实现用回车发送的话,我提供另一种思路,做一个按钮,设置为默认,回车发送消息。然后将按钮隐藏掉,这样从表面上看回车就是发送消息了
[/Quote]

你的意思,明白,只是怎么去响应按钮点击?焦点在EDIT的时候,根本都不响应按钮,那岂不是还是没有效果?
tigerMayDo 2010-12-29
  • 打赏
  • 举报
回复

if (pMsg->message == WM_KEYDOWN) {
if (GetDlgItem(IDC_EDIT1)==GetFocus())
{
if( pMsg->wParam==VK_RETURN)
{
AfxMessageBox(_T("按键成功"));

}

}
}
sc_valentine21 2010-12-29
  • 打赏
  • 举报
回复
你的是正确的,没错。
但是我这里,情况可能特殊些,PreTranslateMessage根本就不进来,这点不是很明白。
PreTranslateMessage是必然执行的?怎么做可以让消息不进来?
zyrr159487 2010-12-29
  • 打赏
  • 举报
回复
如果只是实现用回车发送的话,我提供另一种思路,做一个按钮,设置为默认,回车发送消息。然后将按钮隐藏掉,这样从表面上看回车就是发送消息了
Eleven 2010-12-29
  • 打赏
  • 举报
回复

BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(GetDlgItem(IDC_EDIT1)->GetSafeHwnd() == pMsg->hwnd && WM_KEYDOWN == pMsg->message && VK_RETURN == pMsg->wParam)
{
AfxMessageBox(_T("Enter Press!"));
}
return CDialog::PreTranslateMessage(pMsg);
}
sc_valentine21 2010-12-29
  • 打赏
  • 举报
回复
还是不知道什么原因,没有进PreTranslateMessage函数,不过找了另外的解决方式。

在richedit子类化中,WindowProc中捕捉回车键,然后扔给父窗口处理。这里效果实现了,可能是不太好的处理方式。先这样了。
还在查 2010-12-29
  • 打赏
  • 举报
回复
WindowProc应该早于PreTranslateMessage
可以用OnKeyDown捕获到回车消息
sc_valentine21 2010-12-29
  • 打赏
  • 举报
回复
我很想知道,对于一个窗口,最前端截获按键等消息?WindowProc?PreTranslateMessage?
Yluo_D 2010-12-29
  • 打赏
  • 举报
回复
没用过richedit,不排除richedit直接将回车截获的可能。否则正常都会过主框架的PreTranslateMessage的。不成就下个钩子,判断下焦点在richedit上然后自己钩。
sc_valentine21 2010-12-29
  • 打赏
  • 举报
回复
这个虚函数是有,我也重写了,就是断点不进来,对话框都创建了,也执行动作了,就是没反应,不知啥情况。

我做了个测试,生成一个简单的对话框,然后重写PreTranslateMessage,断点都能进来。

所以我想问的是,这个函数是不是必须执行的?如果是,为什么没有进来!
schlafenhamster 2010-12-29
  • 打赏
  • 举报
回复
.h中应该有:
virtual BOOL PreTranslateMessage(MSG* pMsg);
.cpp中是:
BOOL CxxxxDlg::PreTranslateMessage(MSG* pMsg)
微软为了产生PreTranslateMessage(MSG* pMsg)在MFC中让所有的对话框都用Create,即都是非模态的,MFC的模态对话框是模拟出来的。所以PreTranslateMessage(MSG* pMsg)是一定有的。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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