我想捕获下EDIT的回车事件。
看了几篇前人发的帖子大部分是用PreTranslateMessage()做的我是对EDIT控件添加了一个类,在Cpp文件里直接写:
BOOL CMyEdit::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->wParam==VK_RETURN)
{
MessageBox("adsf");
}
return CEdit::PreTranslateMessage(pMsg);
}
结果编译说:没申明我就又在。H文件里添加:
virtual bool PreTranslateMessage(MSG *pMsg);
结果编译说:重写虚函数返回类型有差异,且不是来自“CDialog::PreTranslateMessage”的 covariant我在对话框类里也试了结果一样。请问要怎么改?拜求前人指点~~我用的是VS2003~~
看了几篇前人发的帖子大部分是用PreTranslateMessage()做的我是对EDIT控件添加了一个类,在Cpp文件里直接写:
BOOL CMyEdit::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->wParam==VK_RETURN)
{
MessageBox("adsf");
}
return CEdit::PreTranslateMessage(pMsg);
}
结果编译说:没申明我就又在。H文件里添加:
virtual bool PreTranslateMessage(MSG *pMsg);
结果编译说:重写虚函数返回类型有差异,且不是来自“CDialog::PreTranslateMessage”的 covariant我在对话框类里也试了结果一样。请问要怎么改?拜求前人指点~~我用的是VS2003~~
解决方案 »
- 我写了一个http的代理客户端,经测试没问题了,现在想做https的,不知道有什么区别?请知道的进来指点一下。
- 为什么这个private变量可以被外界直接访问?
- CSocket类对象用UDP方式通信,close()时怎么才能然对方知道?谢谢。
- 有一个简单的问题?
- 在线等......如何在ListView中改变Frame窗口的状态栏的信息
- addnew()以后是否需要马上update()?
- _beginthread函数的疑问
- CreateThread函数中如何使用security_attriute 参数
- 如何知道一个进程在虚拟地址空间中的开始和结束地址?
- 子框架、视图也接收不到关闭和销毁消息
- 如何能让listview去掉垂直滚动条并且支持滑动效果?
- 用户权限问题(怎样使有的菜单可用有的不可用)
{
if(WM_KEYDOWN == pMsg->message && VK_RETURN == pMsg->wParam)
{
AfxMessageBox(_T("Return key is down"));
}
return CEdit::PreTranslateMesage(pMsg);
}
virtual BOOL PreTranslateMessage(MSG* pMsg);
报错:重写虚函数返回类型有差异,且不是来自“CDialog::PreTranslateMessage”的 covariant这是这句话的报错。也就是光在头文件里添加这句就有错误了
virtual BOOL PreTranslateMessage(MSG* pMsg);这句话在afxwin.h里面有,我include了下也没用
等等
我在前面说过这个函数应该是可以通过向导生成的
你为什么要手动加
我给你的这句代码就是我通过向导生成的
没有任何问题
而且你在前面也说过类型差异的问题
你那里BOOL是小写的
所以我才又给你贴了一遍
virtual BOOL PreTranslateMessage(MSG* pMsg);
text.exe 中的 0x00413679 处未处理的异常: 0xC00000FD: Stack overflow 。
你的可以运行的?我的代码如下:
BOOL CtextDlg::PreTranslateMessage(MSG* pMsg)
{
if(WM_KEYDOWN == pMsg->message && VK_RETURN == pMsg->wParam)
{
MessageBox("adsf");
}
return CtextDlg::PreTranslateMessage(pMsg);//一开始创建函数时这里是return 0;
}
在头文件里是:
virtual BOOL PreTranslateMessage(MSG* pMsg);唉~昨天搞了一天没搞明白,换了一种方法来捕获回车事件了。这贴还留着请教吧,总归弄明白是最好的了。
{
if(WM_KEYDOWN == pMsg->message && VK_RETURN == pMsg->wParam)
{
AfxMessageBox(_T("Return key is down"));
}
return CEdit::PreTranslateMesage(pMsg);
}
如果你是用向导添加的
return CtextDlg::PreTranslateMessage(pMsg);//一开始创建函数时这里是return 0;
这个位置不可能这么写吧?
这里应该返回父窗口的PreTranslateMessage
你这样处理不是递归调用了么?
怎么能不出错
{
// TODO: 在此添加消息处理程序代码和/或调用默认值 CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
}
BOOL CtextDlg::PreTranslateMessage(MSG* pMsg)
{
if(WM_KEYDOWN == pMsg->message && VK_RETURN == pMsg->wParam && GetFocus() == GetDlgItem(控件ID))
{
MessageBox("adsf");
}
return false;
}还是用窗口的WM_KEYDOWN,只不过加个焦点判断
呵呵,原来就是return的问题,我前面看的几篇前人发的帖子,就写的
return CEdit::PreTranslateMessage(pMsg);虽然添加虚函数后是return 0;但我还是改了。
现在可以了。能捕获回车事件了,不过捕获的时候界面上的回车事件,不能特别指定是莫一控件的回车事件。这里正好17-18楼的wutaozhao 写了一个参数 GetFocus() == GetDlgItem(控件ID) 这里控件ID写EDIT控件ID后就能只捕获EDIT的回车事件了,其它地方的回车则不会响应。
完整的代码如下:
BOOL Ctext1Dlg::PreTranslateMessage(MSG* pMsg)
{
if(WM_KEYDOWN == pMsg->message && VK_RETURN == pMsg->wParam && GetFocus() == GetDlgItem(IDC_EDIT1))
{
MessageBox(_T("adsf"));
}
return 0;
}
注意这是现在对话框类里面的,我试过现在EDIT增加的一个类里面 捕获不到。
虽然没什么分,就当学习讨论贴吧~
现在改成return 0 可以正确运行了。能正常捕获回车事件了。
BOOL是int类型,而bool是编译器支持的布尔逻辑类型。
bool PreTranslateMessage(MSG* pMSG)是错误的。
BOOL PreTranslateMessage(MSG* pMSG)是正确的。BOOL CMyEdit::PreTranslateMessage(MSG* pMSG)
{
if ((pMsg->message == WM_KEYDOWN) && (pMsg->wParam == VK_RETURN))
{
TRACE(traceAppMsg, "return pressed\n");
return TRUE;
}
return CEdit::PreTranslateMessage(pMsg);
}void CMyEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
{
if (nChar == VK_RETURN)
{
TRACE(traceAppMsg, "return pressed\n");
return;
}
CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
}