MFC中ON_CHAR问题。。。 5

为什么在CView类中可以对ON_CHAR进行相应,添加消息处理函数onchar就可以了,但是在CDialog中要对ON_CHAR相应,直接添加不行?我不是问怎么才能在C... 为什么在CView类中可以对ON_CHAR进行相应,添加消息处理函数onchar就可以了,但是在CDialog中要对ON_CHAR相应,直接添加不行?
我不是问怎么才能在CDialog中响应ON_CHAR,只想知道为何,CDialog中要对ON_CHAR相应直接添加消息处理不行。
其实映射了ON_WM_CHAR消息后,对话框接收不到这个消息,(对话框为什么接收不到这个消息?) 上面写错了,是WM_CHAR。。。。
展开
 我来答
格物瞭望塔
2012-09-30 · TA获得超过954个赞
知道小有建树答主
回答量:266
采纳率:0%
帮助的人:184万
展开全部
关于将这个问题解释为

因为Dialog对象没有办法直接获取到一个焦点(Focus),就象你没有办法单击某应用程序标题栏,然后改变他的标题。
需要重写PreTranslateMessage函数,拦截消息,

这种说法是对的。但不是返回CView::PreTranslateMessage(pMsg);这样编译器会提示不正确的使用非静态成员变量。因为CView是CWnd的派生类,不能直接返回CView类的成员函数。
所以,要想使你写的ON_WM_CHAR响应函数能够接到按键,应该这样写:
BOOL CMyDialog::PreTranslateMessage(MSG* pMsg)
{
if(pMsg-> == WM_CHAR)
CMyDialog::OnChar(pMsg->wParam,0,0);
return CMyDialog::PreTranslateMessage(pMsg);
}

若你的ON_WM_CHAR里写
if(0x == nChar) MessageBox("你按下a键");
程序运行后,当你按下a键,窗口弹出消息框 你按下a键。 这也是窗口中过滤一些按键值得常用方法,比如ESC键。
督诺0GMffd
2010-05-17 · TA获得超过2013个赞
知道大有可为答主
回答量:3770
采纳率:0%
帮助的人:2069万
展开全部
我很想看看你的代码。
不过我估计有几个原因:
1.你的对话框是由API创建的,并没有被子类化,所以系统不会搜索它的消息映射表。所以肯定接收不到这个消息。
2.你的程序肯定不是对话框模板生成的,因为主对话框能映射WM_CHAR消息。那么消息的传递过程就很值得怀疑了。消息传递的处理是只要有窗口处理了这个消息,它就不会传递。那么有可能是在窗口传递之前就已经把消息处理了。
3.你的是模式对话框,模式对话框会自动禁止键盘消息。你必须建立非模式窗口才能接受到键盘消息。
电脑上没装VC,不然可以测试一下。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lzwml1989
2010-05-29 · 超过18用户采纳过TA的回答
知道答主
回答量:55
采纳率:0%
帮助的人:32.1万
展开全部
CView相当于Text控件,你可以在Text控件里输入文字,因为Dialog对象没有办法直接获取到一个焦点(Focus),就象你没有办法单击某应用程序标题栏,然后改变他的标题。
需要重写PreTranslateMessage函数,拦截消息,你写的代码都不用改变,加上下面的
BOOL CMyDialog::PreTranslateMessage(MSG* pMsg) {
if(pMsg-> == WM_CHAR)
OnChar((TCHAR)pMsg->wParam,0,0);//后面两个参数根据你的情况而定
return CView::PreTranslateMessage(pMsg);//不能少
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
freelaxy
2010-05-17 · TA获得超过253个赞
知道小有建树答主
回答量:373
采纳率:0%
帮助的人:337万
展开全部
看看IsDialogMessage(...), 关键在那里。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式