MFC 按回车或者Esc退出的解决办法
2011-12-18 19:19
309 查看
基于对话框的程序默认按Esc和回车键会自动退出程序,可通过重载PreTranslateMessage消息函数,过滤掉Esc和回车消息来处理。
PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,绝大多数本窗口的消息都要通过这里,比较常用,当你需要在MFC之前处理某些消息时,常常要在这里添加代码.
MFC消息控制流最具特色的地方是CWnd类的虚拟函数PreTranslateMessage(),通过重载这个函数,我们可以改变MFC的消息控制流程,甚至可以作一个全新的控制流出来。只有穿过消息队列的消息才受PreTranslateMessage()影响,采用SendMessage()或其他类似的方式向窗口直接发送的而不经过消息队列的消息根本不会理睬PreTranslateMessage()的存在。
一、是否调用TranslateMessage()和DispatchMessage()是由一个名称为PreTranslateMessage()函数的返回值决定的,如果该函数返回TRUE,则不会把该消息分发给窗口函数处理。
二、传给PreTranslateMessage()的消息是未经翻译过的消息,它没有经过TranslateMessage()处理。可以在该函数中使用(pMsg->wParam==VK_RETURN)来拦截回车键。
三、在WindowProc里不能处理WM_Char消息。
四、SetWindowText会发送WM_Char给窗口。
五、PeekMessage和GetMessage的区别:
GetMessage在没有消息的时候等待消息,cpu当然低
PeekMessage没有消息的时候立刻返回,可以在没有消息的时候可以做其他处理,但cpu占用率一般较高。
大多游戏都用PeekMessage();
示例代码如下:
BOOL CHealthHelperDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg->message == WM_KEYDOWN)
{
switch(pMsg->wParam)
{
case VK_RETURN://屏蔽回车
return TRUE;
case VK_ESCAPE://屏蔽Esc
return TRUE;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,绝大多数本窗口的消息都要通过这里,比较常用,当你需要在MFC之前处理某些消息时,常常要在这里添加代码.
MFC消息控制流最具特色的地方是CWnd类的虚拟函数PreTranslateMessage(),通过重载这个函数,我们可以改变MFC的消息控制流程,甚至可以作一个全新的控制流出来。只有穿过消息队列的消息才受PreTranslateMessage()影响,采用SendMessage()或其他类似的方式向窗口直接发送的而不经过消息队列的消息根本不会理睬PreTranslateMessage()的存在。
一、是否调用TranslateMessage()和DispatchMessage()是由一个名称为PreTranslateMessage()函数的返回值决定的,如果该函数返回TRUE,则不会把该消息分发给窗口函数处理。
二、传给PreTranslateMessage()的消息是未经翻译过的消息,它没有经过TranslateMessage()处理。可以在该函数中使用(pMsg->wParam==VK_RETURN)来拦截回车键。
三、在WindowProc里不能处理WM_Char消息。
四、SetWindowText会发送WM_Char给窗口。
五、PeekMessage和GetMessage的区别:
GetMessage在没有消息的时候等待消息,cpu当然低
PeekMessage没有消息的时候立刻返回,可以在没有消息的时候可以做其他处理,但cpu占用率一般较高。
大多游戏都用PeekMessage();
示例代码如下:
BOOL CHealthHelperDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg->message == WM_KEYDOWN)
{
switch(pMsg->wParam)
{
case VK_RETURN://屏蔽回车
return TRUE;
case VK_ESCAPE://屏蔽Esc
return TRUE;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
相关文章推荐
- MFC中默认回车或ESC会关闭对话框,解决办法:
- MFC对话框程序: 回车,ESC对话框消失解决办法总结
- MFC dlg窗口按回车(Enter)键和ESC键会退出解决方法
- MFC对话框程序按回车后程序退出的解决办法
- VC MFC 对话框 敲回车,ESE键,程序自动退出解决办法
- MFC基于对话框的程序,按回车退出的解决办法
- 关于MFC程序按ENTER和ESC会退出的解决办法
- vs2008 MFC 对话框 敲回车,ESE键,程序自动退出解决办法
- 转 -- 按Enter键或者ESC键,程序退出的解决方法
- MFC中解决回车和ESC关闭的问题,重载OnOk(),OnCancel()函数的正确做法
- ESC键直接退出MFC对话框问题解决?
- MFC学习(13)解决回车键 ESC 默认关闭窗口的一般方法——续
- Windows cmd 长时间不输出新内容 直到按下ctrl + c 取消或者回车的解决办法
- MFC中解决回车和ESC关闭的问题,重载OnOk(),OnCancel()函数的正确做法
- MFC回车键和Esc键默认退出程序的问题
- MFC软件运行时按下回车或ESC闪退问题的解决
- MFC对话框模式解决,回车,esc问题
- MFC对话框按下回车和Esc键关闭的解决
- MFC中解决基于对话框程序按下Enter,Esc程序自动退出的方法
- MFC(10)解决回车键 ESC 默认关闭窗口的一般方法