zoukankan      html  css  js  c++  java
  • MFC OnChar、OnKeyDown、OnKeyUp和PreTranslateMessage的关系

    OnKeyDown是所有键盘按下去都会触发,OnChar紧紧是可见字符的按键。
    假设按下键盘上的任意一个键,则OnChar、OnKeyDown、OnKeyUp均会被调用。它们被调用的先后顺序为:

    1、OnKeyDown

    2、OnChar

    3、OnKeyUp

    在对话框应用程序中,无论用户是否操作鼠标或键盘,PreTranslateMessage函数始终不断地被调用。MSDN中关于PreTranslateMessage函数的说明如下:

    Used by class CWinApp to translate window messages before they are dispatched to the TranslateMessage and DispatchMessage Windows functions.

    在默认情况下,对话框应用程序无法响应OnChar、OnKeyDown和OnKeyUp事件。因为与之对应的消息被对话框上的控件截取了。验证方法是将对话框上的所有控件都删除,此时利用OutputDebugString函数不添加任何断点调试运行程序,将发现对话框应用程序能响应全部的OnChar、OnKeyDown和OnKeyUp事件了。如果我们想在对话框应用程序中对特定的按键消息进行处理,可以重载PreTranslateMessage函数。例如下面通过重载PreTranslateMessage函数来屏蔽对话框应用程序对”Esc“和”Enter“键的响应(对话框应用程序有一个默认按钮,缺省为“确定”按钮,可通过编程修改。当用户按下回车键时相当于按下这个默认按钮,即“确定”按钮。另外,当用户按下“Esc“键时,相当于按下对话框的”取消“按钮,即使”确定“或”取消“按钮已经被删除,这种操作依然有效。)

    BOOL CTestDlg::PreTranslateMessage(MSG* pMsg)
    {
    	// TODO: 在此添加专用代码和/或调用基类
     
    	if(pMsg->wParam == VK_ESCAPE)  
    	{  
    		return true;  
    	} 
     
    	if(pMsg->wParam == VK_RETURN)  
    	{  
    		return true;  
    	} 
     
    	/*当按下字母A键时,不论大小写与否,wParam最初都为65,然后再为97。即OutputDebugString会被调用至少两次。
    	添加断点调试OutputDebugString调用两次,不添加则三次!(VS2008已测)*/
    	if( pMsg->wParam==(97) || pMsg->wParam==(65))
    	{
    		OutputDebugString(_T("WM_CHAR: a 
    "));
    	}
    	return CDialog::PreTranslateMessage(pMsg);
    }
    
  • 相关阅读:
    win7-64系统下安装nodejs
    Vue项目使用npm run dev出现npm ERR! missing script: dev
    本地环境时覆盖Apollo配置
    金蝶K3序时簿页面增加物料即时库存显示功能
    LeetCode——开篇
    url 与 params 参数的常见操作归纳汇总(含精心准备的注释)
    如何让 arcgis require 里定义的方法可以在全局访问?
    字体图标库 iconfont、iconmoon 的维护管理与使用探索
    【转载】ES5-ES12 常用语法特性
    一次 outline 去除经验(非继承属性,看着像继承)
  • 原文地址:https://www.cnblogs.com/laohaozi/p/12537586.html
Copyright © 2011-2022 走看看