MFC-PreTranslateMessage截获消息

在MFC中,PreTranslateMessage是虚函数,是用来截获消息的。我们可以通过重载它来处理键盘和鼠标消息

PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,绝大多数本窗口的消息都要通过这里,比较常用,当你需要在MFC之前处理某些消息时,常常要在这里添加代码

只有穿过消息队列的消息才受PreTranslateMessage()影响,采用SendMessage()或其他类似的方式向窗口直接发送的而不经过消息队列的消息根本不会理睬PreTranslateMessage()的存在 

该函数表示在消息处理(TranslateMessge()和DispatchMessage()等)前所作的操作,如果函数返回值为TRUE,那么消息处理即终止,不会调用TranslateMessge()和DispatchMessage()来翻译和分发消息给相应的窗口;若返回值为FALSE,才会调用翻译和分发消息函数

关于消息有两种传递方式:
a.MFC消息,MFC会把所有的消息一条条放到一个AFX_MSGMAP_ENTRY结构中,形成一个数组,该数组存放了所有的消息和与它们相关的参数。也可以说消息是放到消息队列里去了。
b.采用SendMessage()或其他类似的方式向窗口直接发送的而不经过消息队列的消息。这两种方式中只有第一种(穿过消息队列的消息)才受PreTranslateMessage()影响,第二种消息并不会理睬PreTranslateMessage()的存在
 
传给PreTranslateMessage()的消息是未经翻译过的消息,它没有经过TranslateMessage()处理。例如:可以在该函数中使用(pMsg->wParam==VK_RETURN)来拦截回车键,wParam中存放的是键盘上字符的虚拟码
 
PeekMessage和GetMessage的区别:
GetMessage在没有消息的时候等待消息,cpu占用率当然低。
PeekMessage没有消息的时候立刻返回,可以在没有消息的时候可以做其他处理,但cpu占用率一般较高
 

实例:

1.添加PreTranslateMessage函数

右击窗口-->类向导

 

2.代码

复制代码
BOOL CMFCtestDlg::PreTranslateMessage(MSG* pMsg)  //截获消息
{
    if (pMsg->message == WM_LBUTTONDOWN)
    {
        AfxMessageBox(_T("按下了鼠标左键"));
    }

    return CDialogEx::PreTranslateMessage(pMsg);
}
复制代码

 

 

 

 

 

 

 

 

 

 

 

posted @   天子骄龙  阅读(313)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
历史上的今天:
2022-02-20 halcon-fill_up填充区域
2021-02-20 游戏
2021-02-20 奥德赛
2019-02-20 双缓冲技术实现实时绘图
2019-02-20 绘图QPainter-字体
2019-02-20 绘图QPainter-画刷
点击右上角即可分享
微信分享提示

目录导航