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。。。。 展开
我不是问怎么才能在CDialog中响应ON_CHAR,只想知道为何,CDialog中要对ON_CHAR相应直接添加消息处理不行。
其实映射了ON_WM_CHAR消息后,对话框接收不到这个消息,(对话框为什么接收不到这个消息?) 上面写错了,是WM_CHAR。。。。 展开
4个回答
展开全部
关于将这个问题解释为
“
因为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键。
“
因为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键。
展开全部
我很想看看你的代码。
不过我估计有几个原因:
1.你的对话框是由API创建的,并没有被子类化,所以系统不会搜索它的消息映射表。所以肯定接收不到这个消息。
2.你的程序肯定不是对话框模板生成的,因为主对话框能映射WM_CHAR消息。那么消息的传递过程就很值得怀疑了。消息传递的处理是只要有窗口处理了这个消息,它就不会传递。那么有可能是在窗口传递之前就已经把消息处理了。
3.你的是模式对话框,模式对话框会自动禁止键盘消息。你必须建立非模式窗口才能接受到键盘消息。
电脑上没装VC,不然可以测试一下。
不过我估计有几个原因:
1.你的对话框是由API创建的,并没有被子类化,所以系统不会搜索它的消息映射表。所以肯定接收不到这个消息。
2.你的程序肯定不是对话框模板生成的,因为主对话框能映射WM_CHAR消息。那么消息的传递过程就很值得怀疑了。消息传递的处理是只要有窗口处理了这个消息,它就不会传递。那么有可能是在窗口传递之前就已经把消息处理了。
3.你的是模式对话框,模式对话框会自动禁止键盘消息。你必须建立非模式窗口才能接受到键盘消息。
电脑上没装VC,不然可以测试一下。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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);//不能少
}
需要重写PreTranslateMessage函数,拦截消息,你写的代码都不用改变,加上下面的
BOOL CMyDialog::PreTranslateMessage(MSG* pMsg) {
if(pMsg-> == WM_CHAR)
OnChar((TCHAR)pMsg->wParam,0,0);//后面两个参数根据你的情况而定
return CView::PreTranslateMessage(pMsg);//不能少
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
看看IsDialogMessage(...), 关键在那里。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询