MFC 对话框响应OnChar()

最近在写程序时,出现了对话框里面不接收键盘消息的情况,特别搜索了以下内容

MFC中对话框是不会直接响应OnChar和OnKeyDown消息的,会被 其它控件拦截,测试时发现不会进入这两个函数,必须重定义PreTranslateMessage()虚函数才能正确地

进入这两个消息函数,具体实现如下:

   BOOL CTestDlg::PreTranslateMessage(MSG* pMsg)
    {
        SendMessage(pMsg->message,pMsg->wParam,pMsg->lParam);
        return 0;
        //return CDialog::PreTranslateMessage(pMsg);
    }

这样,程序就能正确地调用onKeyDown和onChar这两个函数了,且onKeyDown()在onCchar()之前处理的。这样就能在对话框中响应WM_CHAR、WM_KEYDOWM消息了,注意在发送WM_CHAR时,实际发送了三个消息

即 WM_CHAR     WM_KEYDOWM     WM_KEYUP

所以,如果你有如下代码:

void CMy1Dlg::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
 {
  // TODO: Add your message handler code here and/or call default
  if(nChar==‘a‘)
   MessageBox("a");
  CDialog::OnChar(nChar, nRepCnt, nFlags);
 }

会弹出两个消息对话框 ,所以最好单独在WM_KEYDOWM或WM_KEYUP处理事件。

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

在这里添加代码. MFC消息控制流最具特色的地方是CWnd类的虚拟函数PreTranslateMessage(),通过重载这个函数,我们可以改变MFC的消息控制流程,甚至可以作一个

全新的控制流出来。只有穿过消息队列的消息才受PreTranslateMessage()影响,采用SendMessage()或其他类似的方式向窗口直接发送的而不经过消息队列的消息根本不

会理睬PreTranslateMessage()的存在。

  一、是否调用TranslateMessage()和DispatchMessage()是由一个名称为PreTranslateMessage()函数的返回值决定的,如果该函数返回TRUE,则不会把该消息分

发给窗口函数处理。

  二、传给PreTranslateMessage()的消息是未经翻译过的消息,它没有经过TranslateMessage()处理。可以在该函数中使用(pMsg->wParam==VK_RETURN)来拦

截回车键。

时间: 2024-08-12 16:42:52

MFC 对话框响应OnChar()的相关文章

在MFC对话框程序中使用加速键

新建一个基于对话框的工程,添加一个按钮,修改按钮ID,这里为ID_BTN_OPENFILE,为按钮添加消息响应事件,这里我打开文件保存对话框: void CAccelDlg::OnBtnOpenfile() { // TODO: Add your control notification handler code here CFileDialog dlg (TRUE); dlg.DoModal (); } 为工程添加一个加速键资源,添加一条,注意ID要和按钮的ID相同,只有这样才能产生关联 为主

MFC消息响应机制分析

---- 摘要: ---- MFC是Windows下程序设计的最流行的一个类库,但是该类库比较庞杂,尤其是它的消息映射机制,更是涉及到很多低层的东西,我们在这里,对它的整个消息映射机制进行了系统的分析,可以帮助程序开发人员对MFC的消息映射机制有一个比较透彻的了解. ---- 关键词:面向对象 消息映射 MFC 程序设计 一.引言---- VC++的MFC类库实际上是Windows下C++编程的一套最为流行的类库.MFC的框架结构大大方便了程序员的编程工作,但是为了更加有效.灵活的使用MFC编程

MFC消息响应机制 q

MFC消息响应机制分析 1 引言微软公司提供的MFC基本类库(Microsoft Foundation Classes),是进行可视化编程时使用最为流行的一个类 库.MFC封装了大部分Windows API函数和Windows控件,使得程序的开发变得简单,极大的缩短了程序的开发 周期.MFC独创的Document/View框架结构,能够将管理数据的代码和显示数据的程序代码分开,并且设计了 一套方便的消息映射和命令传递机制,方便程序员的开发使用.其中消息映射机制本身比较庞大和复杂,对 它的分析和了

11.MFC对话框

一.MFC对话框 1.对话框的分类 模式和非模式 2.相关类 CDialog类 - 父类CWnd类 CCommonDialog - 父类是CDialog类,称为通用对话框类,包括颜色对话框.文件对话框.字体对话框. 查找对话框.页面设置对话框.打印对话框. CPropertyPage类 - 父类是CDialog类,称为属性页对话框. 3.CDialog类的使用类 3.1 创建基于模式对话框的应用程序 (1)添加对话框资源,与对话框类关联 (2)在应用程序类的InitInstance函数中创建和显

MFC——对话框(一)

创建对话框主要分两大步: 1.创建对话框资源,主要包括创建新的对话框模板.设置对话框属性和为对话框添加各种控件: 2.生成对话框类,主要包括新建对话框类.添加控件变量和控件的消息处理函数等. 一.对话框类的数据交换和检验 在程序运行界面中,用户往往会改变控件的属性,例如,在编辑框中输入字符串,或者改变组合框的选中项,又或者改变复选框的选中状态等.控件的属性改变后MFC会相应的修改控件关联变量的值.这种同步的改变是通过MFC对话框类自动生成的成员函数DoDataExchange()来实现的,这也叫

主程序,然后才能运行等待对话框响应问题

在项目开发.经常使用对话框,Android该对话框是异步,后再继续运行. 以下以使用AlterDialog对话框返回true或者false之后,主程序再继续运行为例讲述怎样实现主程序等待对话框响应后再顺序运行的方法. 思考一: 首先考虑到声明一个final keyword的布尔型的局部变量,然后在对话框的"确认"和"取消"button的点击事件中对布尔型变量进行赋值.然后再运行主程序. 问题一:在代码的过程对布尔型变量进行赋值的时候提示错误. 错误例如以下:The 

VS2010的MFC对话框程序中添加菜单栏的过程

VS2010的MFC对话框程序中添加菜单栏的过程 最近在看一个用MFC写的界面的项目的代码,在代码和界面中一直没有看到关于菜单控件是如何添加进对话框的,于是就百度了下.结果,与其它控件(Button等)添加的方式不一样: VS2010的MFC对话框程序中添加菜单栏的过程大致分了这五步. 一.将Menu加入Resource视图中 在WorkSpace中的Resource视图下,在左边目录的任意位置上,先右键-->选择Insert Resource(插入资源)选项,在弹出的对话框中选择Menu以后,

MFC对话框中显示背景图片

在MFC对话框中显示图片,四个步骤. 1.首先得在VC6.0或者VS2008(其他版本也是一样)中导入GDI文件.(网上下载:) GDI含义是图形设备接口,主要任务是负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出. 分别将include文件夹和lib中的头文件全部添加到你的开发环境中的include或lib文件夹中.如:F:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include. 将gdiplus.dll导入

MFC对话框美化使其具有xp/win7风格(转载)

首先在RES目录下建一个文件,命名 windows.manifest 后缀为:.manifest 然后用记事本打开放入 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <