首先建立一个基于对话框的程序重载PreTranslateMessage函数
在这个函数中检测是否按下回车按钮,当按下回车按钮后用MessageBox
弹出一个对话框A现在出现的问题是,如果用鼠标点击对话框A的确定,则没有问题
如果用回车按钮来确定这个对话框,则程序会再一次检测到回车键按下的消息
重而又弹出对话框A,形成一个死循环。这种情况应该怎么处理3x
在这个函数中检测是否按下回车按钮,当按下回车按钮后用MessageBox
弹出一个对话框A现在出现的问题是,如果用鼠标点击对话框A的确定,则没有问题
如果用回车按钮来确定这个对话框,则程序会再一次检测到回车键按下的消息
重而又弹出对话框A,形成一个死循环。这种情况应该怎么处理3x
BOOL CDlgScrDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg->message==WM_KEYDOWN)
{
if(pMsg->wParam==VK_RETURN)
{
AfxMessageBox("test");
return TRUE;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
从函数的字面上理解,它就是预先翻译(转换)消息,当你对回车键做了判断,而它又确实收到了这个消息,就弹出了A;
其实用不着这个函数,在对话框的属性页选中STYLE的DEFAULT即可,当你回车时,相当于单击“确定”按钮。
从你的叙述,我无法知道你到底想不想弹出A
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg->message==WM_KEYDOWN)
{
if(pMsg->wParam==VK_RETURN)
{
AfxMessageBox("test");
return TRUE;
}
}
return CDialog::PreTranslateMessage(pMsg);
}我是这样做的
我的意图是,第一次按回车的时候,弹出对话框A.这时用回车来确定这个对话框。这个时候
程序就不应该再次错误的弹出对话框A了。因此这个时候我是用回车来确定这个对话框,而不是要求程序重新弹出对话框A。重载OnOK函数是可以的。不过这里的消息处理机制好像有些奇怪了。是乎有一部份消息
程序是不能在pretranslatemessage里面检测到的
WM_KEYUP就会的了
就是正常的。先是在pretranslatemessage函数里面弹出一个对话框,按回车确定后程序就不会弹出对话框了如果检测WM_KEYUP的话,则会先调用OnOK里面的函数然后在pretranslatemessage里面又弹出一个对话框,这个时候如果用回车确定pretranslatemessage里面弹出的对话框的话就会死循环的
怪事了
而且这里是相当于一个按键消息一个down一个up发给了两个窗口,太奇怪了