`
mywebcode
  • 浏览: 1037832 次
文章分类
社区版块
存档分类
最新评论

PreTranslateMessage详解

 
阅读更多

PreTranslateMessage详解

原文链接

1.函数原型:(MSDN)

Override this function to filter window messages before they are dispatched to the Windows functions

TranslateMessageand DispatchMessageThe default implementation performs accelerator-key translation,

so you must call theCWinApp::PreTranslateMessagemember function in youroverridden version.


virtualBOOLPreTranslateMessage(MSG*pMsg);

Parameters

pMsg :A pointer to a MSG structure that contains the message to process.

Return Value

Nonzero if the message was fully processed inPreTranslateMessageand should not be processed further.

Zero if the message should be processed in the normal way.

重载该函数可以实现窗口消息在派发给窗口函数TrnaslateMessage和DispatchMessae()之前的过滤.缺省的实现是完成加

速键的翻译.因为您必须在你的重载版本中调用CWinApp:PreTranslateMessage()函数.在MFC中,PreTranslateMessage

是虚函数,我们可以重载它来处理键盘和鼠标消息。在sdk中,这又有所不同,我们必须在回调函数中

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)处理消息:

它和PreTranslateMessage起的作用是类似的。只是MFC封装的更好而已


2.说明:

该函数表示在消息处理(TranslateMessge()DispatchMessage()等)前所作的操作,如果函数返回值为TRUE,那么消息处理即终止,

不会调用TranslateMessge()DispatchMessage()来翻译和分发消息给相应的窗口;若返回值为FALSE,才会调用翻译和分发消息函数。

该函数是MFC消息控制流最具特色的地方,它是CWnd类的虚拟函数,通过重载这个函数,我们可以改变MFC的消息控制流程,甚至可

以作一个全新的控制流出来。


win32程序中,关于消息有两种传递方式:

1.MFC消息,MFC会把所有的消息一条条放到一个AFX_MSGMAP_ENTRY结构中,形成一个数组,该数组存放了所有的消息和与

它们相关的参数。也可以说是放到消息队列里去。

2.采用SendMessage()或其他类似的方式向窗口直接发送的而不经过消息队列的消息。


这两种方式中只有第一种(穿过消息队列的消息)才受PreTranslateMessage()影响,

第二种消息并不会理睬PreTranslateMessage()的存在。

1)是否调用TranslateMessage()和DispatchMessage()是由一个名称为PreTranslateMessage()函数的返回值决定的,如果该函数返回

TRUE,则不会把该消息分发给窗口函数处理。

2)传给PreTranslateMessage()的消息是未经翻译过的消息,它没有经过TranslateMessage()处理。可以在该函数中使用

(pMsg->wParam==VK_RETURN)来拦截回车键。

3)在WindowProc里不能处理WM_Char消息。(WindowProc函数见MFC消息响应机制一文)

4)SetWindowText会发送WM_Char给窗口。

5)PeekMessage和GetMessage的区别:

6)GetMessage在没有消息的时候等待消息,cpu当然低

7)PeekMessage没有消息的时候立刻返回,所以cpu占用率高。因为游戏不能靠windows消息驱动,所以要用PeekMessage();




另一篇文章中:

在一个WIN32程序中,WINDOWS会将消息传递给相应的窗口。但是消息不是立即就被传递给相应的窗口,而是会从整个程序最顶层

的窗口传递到下一级窗口,再传递到下一级窗口,直到传递给目标窗口。在整个过程中,有些消息,在某些特定的情况下,无法默认传递到目

标窗口的。比如用户在EDIT控件中按下回车键,CANCEL键等,如果EDIT窗口之前有对话框窗口,对话框会默认处理回车消息(即响应

ONOK函数,然后关闭对话框),然后退出消息传递。所以EDIT会收不到。要解决这个问题,可以在EDIT窗口之前所有的对话框中重载

PreTranslateMessage函数,然后在函数内加上:

if (pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN) //如果消息类型为WM_KEYDOWN并且用户按下的是回车
return FALSE; //不翻译消息,直接将消息传递下去。具体可查MSDN。注意,这里返回值不能为TRUE,TRUE的意思是翻译消息后退出消

息传递,如此一来虽然也能避开对话框默认处理,但是会退出消息传递,这样EDIT控件照样得不到消息。

如此,就可避开对话框默认处理,将消息传递下去。注意:只有对话框才会默认处理按下回车,CANCEL消息,其他控件窗口则不会,所以在其

他窗口中不必重载PreTranslateMessage函数,当然如果重载了也不会错。


附:关于PreTranslateMessage()函数的小程序示例:

BOOL CSearchuserDlg::PreTranslateMessage(MSG* pMsg)

{

if(pMsg->message==WM_KEYDOWN)//判断是否有按键按下

{

switch(pMsg->wParam)

{

caseVK_DOWN://表示是方向键中的向下的键

//add handle code here

break;

caseVK_UP://表示是方向键中的向上的键

//add handle code here

break;

default:

break;

}

}

}

BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)

{

// TODO: Add your specialized code here and/or call the base class

//按键相应

if(pMsg->message == WM_KEYDOWN)

{

if(pMsg->wParam == VK_DOWN)

{

//向下键按下

}

elseif(pMsg->wParam == VK_RIGHT)

{

//向右键按下

}

elseif(pMsg->wParam == VK_LEFT)

{

//向左键按下

}

elseif(pMsg->wParam == VK_UP)

{

//向上键按下

}

elseif(pMsg->wParam == VK_SHIFT)

{

//VK_LSHIFT为左Shift键按下

//Shift键按下

}

elseif(pMsg->wParam == VK_CONTROL)

{

//Ctrl键按下

}

elseif(pMsg->wParam>=VK_NUMPAD0 && pMsg->wParam<=VK_NUMPAD9)

{

//小键盘数字键按下

}

elseif(pMsg->wParam>=0x30 && pMsg->wParam<=0x39)

{

//数字键按下(我记得不能使用VK_0)

}

elseif(pMsg->wParam>=0x41 && pMsg->wParam<=0x5A)

{

//键盘字母键按下(我记得不能使用VK_A)

}

elseif(pMsg->wParam == VK_BACK)

{

//退格键按下

}

elseif(pMsg->wParam == VK_DELETE)

{

//删除键按下

}

elseif(pMsg->wParam == VK_F1)

{

//F1键按下

}

//return true;//使消息不再进行处理

}

if(pMsg->message == WM_KEYUP)

{

if(pMsg->wParam == VK_SHIFT)

{

//Shift键弹起

}

elseif(pMsg->wParam == VK_CONTROL)

{

//Ctrl键弹起

}

//return true;//使消息不再进行处理

}

returnCDialog::PreTranslateMessage(pMsg);

}

//同时按下ctrl

BOOLCDemo_DevStudioView::PreTranslateMessage(MSG*pMsg)//根据键盘上的按键对图形进行相应的操作

{

if(pMsg->message==256)//256有键按下,46DEL

{

switch(pMsg->wParam)

{

///向左键被按下

case37:

{

//同时按下了CTRL

if(::GetKeyState(VK_CONTROL)<0)

{

}

}

}

}

}

分享到:
评论

相关推荐

    PreTranslateMessage

    ### MFC中PreTranslateMessage消息重载详解及应用实例 #### 概述 在MFC框架中,`PreTranslateMessage`函数是一个非常重要的消息处理函数,它被设计用于在消息被传递到窗口过程之前进行预处理。这使得开发人员可以...

    MFC 编程技巧与范例详解【源代码】

    通过重写PreTranslateMessage()和Run()函数,可以在子线程中处理消息和执行任务。 此外,MFC还提供了丰富的类库来支持网络通信(如CInternetSession和CGopherSession)、打印和打印预览(如CPrintInfo和CDC)、以及...

    duilib消息机制

    ### DuiLib消息机制详解 #### 一、引言 DuiLib是一个广泛应用于Windows平台下的用户界面开发库,它提供了丰富的控件和强大的自定义功能。本文将深入探讨DuiLib的消息机制,并通过分析其核心组件——窗体管理器...

    vc EDIT 控件

    **VC++中的EDIT控件详解** 在Windows编程中,EDIT控件是常用的一种用户界面元素,用于接收用户的文本输入。本文将深入探讨如何在VC++环境中实现EDIT控件的自定义,包括改变背景色和字体颜色,以创建一个...

    Win32 MFC消息映射机制详解

    `PumpMessage`内部,`GetMessage`函数用于从消息队列中获取下一个消息,`PreTranslateMessage`、`TranslateMessage`和`DispatchMessage`则分别负责预处理、转换和分发消息。 消息映射是MFC的核心特性,它定义了类...

    FormView 视图 无法响应Ctrl+C等键盘消息解决办法 仅4行代码

    #### 解决方案详解 为了解决这一问题,可以通过重写`PreTranslateMessage`方法来自定义键盘消息的处理方式。以下是一种简单有效的解决方法,只需要四行代码即可实现,而且无需对单个EditBox控件进行任何修改。 ###...

    VC屏蔽Enter和ESC退出程序.txt

    ### VC屏蔽Enter和ESC退出程序知识点详解 #### 标题:VC屏蔽Enter和ESC退出程序 在编程领域,特别是对于使用Visual C++ (VC) 开发的应用程序来说,有时候我们可能希望用户不能通过简单的按键操作(如按下Enter或...

    MFC的CEdit控件

    ##### PreTranslateMessage函数详解 `PreTranslateMessage`函数是在消息被翻译成命令之前调用的,它允许开发者在消息队列中的消息实际被处理之前进行预处理。如果某个消息被此函数处理了,则返回`TRUE`;否则返回`...

    草图大师渲染器2015

    《草图大师渲染器2015:VRay 3.6.02 for SketchUp 顶渲简体中文版详解》 在三维设计领域,草图大师(SketchUp)是一款广泛使用的建模软件,而渲染是将模型转化为逼真图像的关键步骤。"草图大师渲染器2015"特别提及...

    wince下开发键盘响应问题

    #### 二、问题详解与解决方案 ##### 1. 如何解决按 Enter 键程序退出的问题? **问题描述**:在编写对话框程序时,如果用户不小心按下了 Enter 或 ESC 键,程序会立即退出。这是因为当按下 Enter 键时,系统会自动...

    vc键盘响应

    ### vc键盘响应详解 #### 一、键盘消息概述 在VC++编程中,键盘消息的处理对于用户界面的交互至关重要。根据键盘消息的处理方式不同,可以将其分为两大类:系统消息与非系统消息。 ##### 系统消息 这类消息是由...

    MFC截取按键消息

    ### MFC截取按键消息详解 #### 一、概述 MFC(Microsoft Foundation Classes)是微软提供的一套基于Win32 API的类库,用于简化Windows应用程序开发过程中的复杂度。在MFC中,对话框是非常重要的组成部分之一,用于...

    MFC Edit控件之enter回车捕捉

    ### MFC Edit 控件之 Enter 回车捕捉详解 #### 一、背景介绍 MFC(Microsoft Foundation Classes)是微软提供的一套基于Windows API的面向对象的类库,广泛应用于Windows平台下的桌面应用程序开发。在MFC应用开发...

    用mfc编写的贪吃蛇(含代码)

    【MFC贪吃蛇游戏详解】 MFC,全称Microsoft Foundation Classes,是微软提供的一套C++类库,用于简化Windows应用程序的开发。本项目利用MFC框架编写了一个基础版的贪吃蛇游戏,旨在帮助初学者理解MFC编程以及游戏...

    VC消息处理机制

    ### VC消息处理机制详解 在深入探讨VC++中的消息处理机制之前,我们先明确几个基本概念。VC++,特别是基于MFC(Microsoft Foundation Classes)框架的编程,涉及到大量的消息传递和处理,这是Windows应用程序的核心...

    VC++6.0(MFC线程示例).zip

    《VC++6.0与MFC线程编程详解》 在Windows编程中,多线程技术是提升程序并发性能和响应能力的重要手段。VC++6.0作为经典的Microsoft Visual C++版本,支持使用MFC(Microsoft Foundation Classes)库进行线程编程。...

    点击edit控件出现对话框

    ### 点击Edit控件出现对话框:MFC界面编程详解 #### 一、消息处理与对话框调用 在Windows编程中,尤其是使用MFC(Microsoft Foundation Classes)进行界面开发时,通常需要处理各种用户交互事件。例如,当用户点击...

    VC RichEdit 2.0响应回车换行

    代码详解 接下来,我们将详细分析给定的代码片段,以了解其工作原理: ```cpp //Ӧ̰noteRichEditаسУ BOOL CAddMarkDlg::PreTranslateMessage(MSG* pMsg) { if (pMsg-&gt;message == WM_KEYDOWN && isnote == ...

    ToolTip的使用

    ### ToolTip 在 VC++ 中的使用详解 #### 一、ToolTip 概述 ToolTip,即工具提示,是一种在用户界面中常见的元素,用于提供额外的信息或帮助文本,当用户将鼠标悬停在某个按钮或其他控件上时显示。在Visual C++ ...

    MFC工具条和状态栏属性设置

    #### CBRS_TOOLTIPS风格详解 `CBRS_TOOLTIPS`风格的使用使得工具条具备了Tooltip功能。这意味着当用户的鼠标光标悬停在工具条上的某个按钮上时,会显示一个带有提示文本的小窗口,这有助于用户更好地理解每个按钮的...

Global site tag (gtag.js) - Google Analytics