zoukankan      html  css  js  c++  java
  • MFC中Enter、ESC的屏蔽及PreTranslateMessage

    在项目完备时,我们通常会发现当点击Enter键或者ESC时程序便会退出,而我们需要的是只要不点击“差”,程序便不会退出,本文主要涉及MFC中的Enter、ESC的屏蔽以及PreTranslateMessage

    首先说下PreTranslateMessage

    函数原型为:virtual BOOL PreTranslateMessage(MSG* pMsg);

    其功能是:PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,绝大多数本窗口的消息都要通过这里,比较常用,当你需要在MFC之前处理某些消息时,常常要在这里添加代码。重载该函数可以实现窗口消息在派发给窗口函数TranslateMessage()和DispatchMessage()之前的过滤,MFC中,PreTranslateMessage()是虚函数,我们可以重载它来处理键盘和鼠标消息。

    说明:该函数会在窗口函数执行前进行消息的处理,如果消息返回值为true,则消息处理终止,不会调用TranslateMessage()和DispatchMessage()来翻译和分发消息给相应的窗口;如果返回false,调用翻译和分发消息函数,只有穿过消息队列的消息才受PreTranslateMessage()影响,采用SendMessage()或其他类似的方式向窗口直接发送的而不经过消息队列的消息根本不会理睬PreTranslateMessage()的存在。

    PeekMessage和GetMessage:GetMessage在没有消息的时候等待消息,效率低。PeekMessage没有消息的时候立刻返回,所以CPU占用率高。因为游戏不能靠Windows消息驱动,所以要用PeekMessage();PreTranslateMessage则是基于GetMessage的。

    屏蔽Enter和ESC举例:

    1 BOOL CFileAndFolderDlg::PreTranslateMessage(MSG* pMsg) 
    2 {
    3     // 屏蔽Enter、ESC
    4     if(pMsg->message == WM_KEYDOWN && (pMsg->wParam == VK_ESCAPE) || (pMsg->wParam == VK_RETURN)) 
    5         return TRUE; 
    6     return CDialog::PreTranslateMessage(pMsg);
    7 }
  • 相关阅读:
    判断单链表中是否有环,找到环的入口节点的理论证明
    交叉熵代价函数(作用及公式推导)
    C#调用C++、Opencv的Dll
    腾讯机器学习一面面经
    C#调用C++类库的几种方式
    2017年腾讯基础研究笔试感受
    关于开源库或者SDK的文档问题
    卷积神经网络Lenet-5实现
    NULL、0、nullptr 区别分析
    C++中,new/delete和malloc/free的区别
  • 原文地址:https://www.cnblogs.com/zhangshuang0909/p/5452401.html
Copyright © 2011-2022 走看看