MFC 基于对话框 使用OnChar时无响应

很多人说重载PreTranslateMessag,加入
SendMessage(pMsg->message,pMsg->wParam,pMsg->lParam);
return 0;
但是这样一来我写的界面出现了很多问题,想问问有没有其他办法,响应onchar,或者其他方法响应键盘消息。
我现在用的是VS2010写的是打字测速软件,如果有基于对话框的源码就更好了,谢谢了!!

第1个回答  2013-08-20
对话框时不相应WM_CHAR消息的,所以你重载OnChar函数时,对话框是不会调用这个函数的,如果你要让对话框相应WM_CHAR消息的话,你必须先从重载PreTranslateMessage函数,在函数里把WM_CHAR消息发送给对话框。这样对话框就能响应WM_CHAR消息啦。追问

现在可以响应消息了,但是我又遇到一个问题,怎么对比CString,我把一篇文章定义在一个CString中,当我输入的字符定义在另一个CString中,如何在输入的时候一个一个对比,正确才输出呢?

追答

CString类不是有一个Find的函数么,你可以用它去查找啊,好像是找到就返回字符串的初始索引,找不到就返回-1.你可以去查看哈。 如果有什么事要及时回答你的话可以加我QQ,因为我这几天有点忙,可能不能查考百度知道信息。976727509

第2个回答  2015-11-05
MFC中,基于对话框的程序如何响应OnChar呢:对话框是不会响应OnChar和OnKeyDown消息的,会被 其它控件拦截 试时发现不会进入这两个函数,必须重定义PreTranslateMessage()虚函数才能正确地进入这两个...
第3个回答  2013-08-20
你捕获OnChar是在CEdit控件里吗?如果是在edit控件里,应该都可以捕获得到OnChar消息。追问

不是,我是直接显示在对话框中的,现在重载了PreTranslateMessag,可以打字了,但是当我按开始按钮后无法打字了,是不是消息之间的冲突?不晓得怎么解决

追答

你点击开始按钮后,焦点跑到按钮上去了。所以你的窗口没有接收到WM_CHAR的消息。
当点击完按钮后,将焦点重新设置到窗口上试试。

追问

能详细说说怎么做么,我才学的- -,不懂怎么设置焦点。

追答

试试下面这段代码,设置或者取消焦点的,当点击开始后,重设窗口焦点。
void SetFocus(BOOL bFocus = TRUE)
{
if(bFocus)
{
::PostMessage(m_hWnd,WM_SETFOCUS, (WPARAM)m_hWnd, 0);
::PostMessage(m_hWnd,WM_ACTIVATE, WA_ACTIVE, 0);
}
else
{
::PostMessage(m_hWnd,WM_KILLFOCUS, 0, 0);
}
}

试试下面这段代码,设置或者取消焦点的,当点击开始后,重设窗口焦点。
void SetFocus(BOOL bFocus = TRUE)
{
if(bFocus)
{
::PostMessage(m_hWnd,WM_SETFOCUS, (WPARAM)m_hWnd, 0);
::PostMessage(m_hWnd,WM_ACTIVATE, WA_ACTIVE, 0);
}
else
{
::PostMessage(m_hWnd,WM_KILLFOCUS, 0, 0);
}
}

追问

声明m_hWnd成什么?

追答

m_hWnd是你当前所在窗口的窗口句柄。在窗口类中可以写成this->m_hWnd。

追问

我没有弄得那么复杂··我就在点击按钮的函数里面添加了SetFocus () ;,就把输入焦点交给主对话框了。

追答

那你添加我给你的那个函数到窗口程序中,当点击按钮时,就用SetFocus试试。看看是不是焦点的问题。

本回答被提问者采纳
相似回答