void CChessDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
MessageBox("keydown");
CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}
但是,不管我怎样按键盘都没有执行这段程序;后我将程序生成的按钮和静态文本框都删除,再测试程序发现执行了这段代码。
请问这是怎么回事?怎样解决这个问题? 谢谢!
9 个解决方案
#1
我倒,MESSAGEBOX可以么写吗?
我没见过
我没见过
#2
在CChessDlg::PretranslateMessage里处理
BOOL CChessDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN)
{
MessageBox("keydown");
}
return CDialog::PreTranslateMessage(pMsg);
}
BOOL CChessDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN)
{
MessageBox("keydown");
}
return CDialog::PreTranslateMessage(pMsg);
}
#3
CWnd::MessageBox可以这么写。
#4
是不是因为输入焦点在button上,所以dialog认为keydown消息是属于button的,所以传递给button处理。
但是,我用SetFocus()尝试过,发现dialog不能拥有输入焦点,输入焦点还是在button上。
那么,当没有button的时候,dialog为什么又认为keydown消息是属于自己的了,它可是没有输入焦点的东东啊?
但是,我用SetFocus()尝试过,发现dialog不能拥有输入焦点,输入焦点还是在button上。
那么,当没有button的时候,dialog为什么又认为keydown消息是属于自己的了,它可是没有输入焦点的东东啊?
#5
同意bcpl(林平之)的做法,在基于对话框的程序中,若要响应键盘消息,就要在PreTranslateMessage()响应键盘消息。我也不知道为什么,但是这样就可行的。
#6
WM_KWYDOWN应该是被拥有输入焦点控件截获了,但是控件都有自己的窗口过程,这个窗口过程会把WM_KEY翻译成通知消息发送给父窗口,所以不会执行到你在dialog类中定义的消息处理函数。PreTranslageMessage()是由CWinAPP在把消息发送给窗口过程之前执行的,所以会截获任何消息。
不知道说明白了没有。
不知道说明白了没有。
#7
PreTranslateMessage是消息必经之路(sendmessage方式消息的除外),而CYourWnd::OnKeyDown是特定于该窗口的消息才被调用,当对话框上有可以获取焦点的子窗口时,总有一个子窗口作为焦点子窗口,消息被送到当前焦点子窗口,只有找不到可以焦点子窗口时才直接调用父窗口的OnKeyDown
#8
同意 bcpl(林平之) 的做法,
同意 ruihuahan(飞不起来的笨鸟) 的解释
同意 ruihuahan(飞不起来的笨鸟) 的解释
#9
多谢了!
#1
我倒,MESSAGEBOX可以么写吗?
我没见过
我没见过
#2
在CChessDlg::PretranslateMessage里处理
BOOL CChessDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN)
{
MessageBox("keydown");
}
return CDialog::PreTranslateMessage(pMsg);
}
BOOL CChessDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN)
{
MessageBox("keydown");
}
return CDialog::PreTranslateMessage(pMsg);
}
#3
CWnd::MessageBox可以这么写。
#4
是不是因为输入焦点在button上,所以dialog认为keydown消息是属于button的,所以传递给button处理。
但是,我用SetFocus()尝试过,发现dialog不能拥有输入焦点,输入焦点还是在button上。
那么,当没有button的时候,dialog为什么又认为keydown消息是属于自己的了,它可是没有输入焦点的东东啊?
但是,我用SetFocus()尝试过,发现dialog不能拥有输入焦点,输入焦点还是在button上。
那么,当没有button的时候,dialog为什么又认为keydown消息是属于自己的了,它可是没有输入焦点的东东啊?
#5
同意bcpl(林平之)的做法,在基于对话框的程序中,若要响应键盘消息,就要在PreTranslateMessage()响应键盘消息。我也不知道为什么,但是这样就可行的。
#6
WM_KWYDOWN应该是被拥有输入焦点控件截获了,但是控件都有自己的窗口过程,这个窗口过程会把WM_KEY翻译成通知消息发送给父窗口,所以不会执行到你在dialog类中定义的消息处理函数。PreTranslageMessage()是由CWinAPP在把消息发送给窗口过程之前执行的,所以会截获任何消息。
不知道说明白了没有。
不知道说明白了没有。
#7
PreTranslateMessage是消息必经之路(sendmessage方式消息的除外),而CYourWnd::OnKeyDown是特定于该窗口的消息才被调用,当对话框上有可以获取焦点的子窗口时,总有一个子窗口作为焦点子窗口,消息被送到当前焦点子窗口,只有找不到可以焦点子窗口时才直接调用父窗口的OnKeyDown
#8
同意 bcpl(林平之) 的做法,
同意 ruihuahan(飞不起来的笨鸟) 的解释
同意 ruihuahan(飞不起来的笨鸟) 的解释
#9
多谢了!