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

在MFC中自定义消息

 
阅读更多

首先弄清楚两点:

(1)谁要发送这个消息(2)谁要接受这个消息。  

用一个简单的例子来说明。对象A向B(也可以就是A到A)发送消息。  

1 发送消息  

首先在A的头文件中定义这个消息:  

  #define WM_USERMESSAGE WM_USER+30  

  所有自定义消息都是以WM_USER消息为基础加上一个任意的自然数来表示的。A是向外发送消息的对象,因此在A的某个方法(函数)里就会调用用来发消息的函数B::SendMessage()/B::PostMessage(),因为是B接受消息,因此是如上的形式。  

2 接受消息  

  对象接受一个消息,应该有三部分:在头文件中有该消息的处理函数的原型;在实现文件中有接受消息映射的宏;以及该消息的处理函数的具体实现。  

2.1 头文件中加上自定义消息的处理函数原型  

  在DECLARE_MESSAGE_MAP()语句之前,一对AFX_MSG之间加上如下形式的函数原型:

  afx_msg LRESULT OnProcName( WPARAM wParam, LPARAM lParam);  

  对Win32来说,wParam, lParam是传递消息最常用的手段。  

2.2 在实现文件中加上接受消息映射的宏  

  在cpp文件里,BEGIN_MESSAGE_MAP语句之后,在一对AFX_MSG_MAP之间,增加 如下形式的代码: 

  ON_MESSAGE(WM_USERMESSAGE, OnProcName)  

上面是不用分号结尾的。
  

2.3 在实现文件中给出消息处理函数的具体实现。

这样就OK了!


所有windows应用程序都是消息驱动的,消息处理是所有windows应用程序的核心部分。当用户单击鼠标或改变窗口大小时,都将给适当的窗口发送消息。每个消息都对应于某个特定的事件。

  一、消息处理和消息映射的概念

  1、消息

  消息主要指由用户操作而向应用程序发出的信息,也包括操作系统内部产生的消息。例如,单击鼠标左按钮,windows将产WM_LBUTTONDOWN消息,而释放鼠标左按钮将产生WM_LBUTTONUP消息,按下键盘上的字母键,将产生WM_CHAR消息。

  2、windows消息组成结构

  windows消息由消息号和参数组成:

  消息号

  windows操作系统通过32整数标识一条windows消息,称为消息号。windows消息号具有三个特点:

  (1)唯一性

  唯一性指对于windows操作系统中的每一条消息都有一个且只有一个消息号与它相对应。由于windows操作系统通过消息激活相应的过程,因此消息的标识必须是唯一的。

  (2) 直观性

  消息号在形式上表现为消息名,消息名往住直观地说明了消息的产生方式和类型,例如消息名WM_LBUTTONDOWN直观地表示了单击产生的消息。

  (3)可自定义性

  windows系统定义了一些消息号和消息名,程序员可以运用这些消息,也可以使用自已定义的窗口的消息。形式如下:

  #define 消息名 消息号

  注意,为了不与现有的windows系统消息相冲突,在消息号的定义中通常采用如下:

  WM_USER+n<wbr><wbr>WM_USER是windows操作系统定义的用户消息起始值,程序员必须从该起始值后选取消息号,例如自定义消息名为“MESSAGE_1”和“MESSAGE_2”,可采用如下形式:</wbr></wbr>

  #define MESSAGE_1 WM_USER+1

  #DEFINE MESSAGE_2 WM_USER+2

  参 数

  windows的消息具有以下两个参数:

  (1)字参数(wParam)

  (2)长参数(lParam)

  字参数和长参数都是32位整数,用于提供消息的附带消息,是消息传递过程中参数的载体。附加信息的消息号取决于消息号。

  3、消息处理

  在MFC中,每个专门的处理函数旱单独处理每个消息。消息处理函数通常是某一类的成员函数,编写消息处理函数是编写框架应用程序的主要任务。

  可以使用ClassWizard创建消息处事函数,然后从Classwizard直接跳到源文件消息处理函数,编写处理代码。

  4、消息映射

  可以接收消息和命令的所有框架类都有自已的消息映射。框架利用消息映射把消息、命令与它们的处理函数链接起来。从CCmdTarget类派生的任何类都可以有消息映射。虽然叫作“消息映射”,但消息映射既可以处理消息,也可以处理命令。

  二、消息种类

  消息主要有三种类型,即windows消息,命令消息和控件通知。

  按消息的产生可以分为四类:

  *(1)外界输入事件产生的消息

  *(2)windows系统向应用程序发出的消息

  *(3)应用程序之间发送的消息

  *(4)其他

  根据产生消息的对象,可以进一步将消息分为以下几类:

  *(1)窗口管理消息

  包括激活基本窗口操作的消息,如关闭、最大化等。

  *(2)初始化消息

  应用程序、窗口、控件等对象初始化的消息。

  *(3)输入消息

  包括键盘、鼠标、绘图仪等处部输入工具的输入消息。

  *(4)系统消息

  windows系统内部消息。

  *(5)剪贴板消息

  操作剪贴板时产生的消息。

  *(6)系统信息消息

  用于系统信息发送和处理的消息。

  *(7)控件处理消息

  操作控件时产生的消息。

  *(8)控件通知消息

  系统采用空件通知消息向控件发送消息。

  *(9)滚动条消息

  操作滚动条时产生的消息

  *(10)非用户区消息

  非用户区产生的消息

  *(11)MDI消息

  用于多文档操作的消息

  *(12)DDE消息

  用于动态数据交换的消息。

  *(13)应用程序自定义的消息等等。

  1、windows消息

  除WM_COMMAND外,所有以WM_开头的消息都是windows消息。windows消息由窗口和视图处理。这类消息通常含有用于确定如何对消息进行处理的一些参数。

  2、控件消息

  控件通知包含从控件和其他子窗口传递给父窗口的WM_COMMAND通知消息。例如,当用户改变编辑控件中的文本时,编辑控件将发送给父窗(例如对话框)一条含有EN_EXCHANGE控件通知码的WM_COMMAND消息。窗口的消息处理函数将以适当的方式对通知消息作出响应,如获取编辑框中的文本等。

  像其他标准windows消息一样,控件通知消息由窗口和视图进行处理。但是如果用户单击控件按钮时发出的BN_CLICKED控件通知消息将作为命令消息来处理。

  3、命令消息

  命令消息包括来自用户界面对象的WM_COMMAND通知消息。菜单项、工具栏按钮和加速键都是可以产生命令的用户界面对象。每个这样的对象都有一个ID。通过给对象和命令分配给同一个ID可以把用户界面对象和命令联系起来。命令是被作为特殊的消息来处理的。

  通常,命令ID是以其表示的用户界面对象的功能来命名的。例如,Edit菜单中的Copy命令就可以用ID_EDIT_COPY来表示。MFC类库预定义了某些命令ID(如ID_EDIT_PASTE和ID_FILE_OPEN等等)。其他命令ID则要编程人员自已定义,所有预定义命令ID的列表,参见AFXRES.H文件。

  命令消息的处理和其他消息的处理不同。命令消息可以被更广泛的对象(如文档、文档模板、应用程序对象、窗口和视图等)处理。windows把命令发送给多个候选对象,称为命令目标。通常其中一个对象有针对该命令的处理函数。处理函数处理命令的方法和处理windows消息的方法是一样的。但调用机制不一样。

  三、常用消息

  windows中一些常用的消息:

  1、WM_LBUTTONDOWN

  产生:单击。

  参数:

  wParam:包含一个整数值,以标识鼠标键的按下状态。

  鼠标的按下标识及说明

  数值<wbr> 说明</wbr>

  MK_LBUTTON<wbr> 标识按下鼠标左键</wbr>

  MK_MBUTTON<wbr> 标识按下鼠标中键</wbr>

  MK_RBUTTON<wbr> 标识按下鼠标右键</wbr>

  lParam:长参数lParam的低字位包含当前坐标的x坐标,在高字节包含当前坐标的Y坐标。

  相似的消息有:

  WM_LBUTTONUP

  WM_RBUTTONDOWN

  WM_RBUTTONUP

  WM_LBUTTONDBLCLK

  WM_RBUTTONDBLCLK

  2、WM_KEYDOWN

  产生:按下一个非系统键的时候产生该事件,系统键是指实现系统操作的组合键,例如,Alt与某个功能键的组合以实现菜单操作等。

  参数:

  wParam:按下键的虚拟键盘码,虚拟键码用来标识按下或者释放的是哪个键,例如功能键F1的虚拟键码在windows.h文件中定义为VK_F1。

  lParam:长参数中记录了按键的重复次数,扫描码、转移代码、先前键的状态等信息。

  相似的消息有:

  WM_KEYUP:放开按下的非系统键时产生的事件。


<wbr></wbr>
分享到:
评论

相关推荐

    MFC自定义消息示例

    综上所述,MFC自定义消息的使用涉及消息的声明、映射、处理以及发送。理解并掌握这一技术,有助于构建更加灵活和可扩展的MFC应用程序。通过提供的示例代码和实践,开发者可以在win7平台上使用Visual Studio 2010有效...

    MFC线程自定义消息循环

    本文将深入探讨如何在MFC中为线程自定义消息循环。 首先,了解消息循环的基本概念至关重要。在Windows操作系统中,消息循环是程序的核心部分,负责接收并处理来自操作系统的各种消息,如鼠标点击、键盘输入等。默认...

    MFC中添加自定义消息

    在 MFC ClassWizard 中不允许添加用户自定义消息,所以我们必须在程序中添加相应代码,以便可以象处理其它消息一样处理自定义消息。 在添加自定义消息时需要遵循以下步骤: 第一步:定义消息。推荐用户自定义消息...

    MFC 自定义消息实现

    自定义消息在MFC中通常通过`WM_USER`开始的数值来定义,这是Windows消息ID预留的范围,以避免与系统内置的消息ID冲突。创建自定义消息通常包含以下几个步骤: 1. **定义消息ID**:首先,你需要定义一个消息ID。这...

    MFC中自定义消息处理

    综上所述,在MFC中实现自定义消息处理需要确保类是从`CWnd`派生的,并且正确地定义和实现了消息映射及消息处理器。此外,还需要注意确保窗口句柄的有效性。通过这种方式,可以实现对自定义消息的有效管理和处理,...

    自定义消息 MFC 对话框

    自定义消息不同于标准的Windows消息,它们不在消息映射表中定义,而是通过`RegisterWindowMessage`函数动态注册生成。 二、创建自定义消息 创建自定义消息的步骤如下: 1. 使用`RegisterWindowMessage`函数注册一个...

    MFC 自定义消息和自定义类

    3. **处理消息**: 在接收消息的窗口类中,重载`WndProc`函数(或者在消息映射表中添加`ON_MESSAGE`宏)来处理自定义消息。例如: ```cpp LRESULT CMyWindow::WndProc(UINT message, WPARAM wParam, LPARAM lParam) {...

    详细解析-MFC自定义消息

    总结来说,MFC自定义消息机制提供了一种定制化的通信方式,使得开发者能够根据需要扩展MFC框架的功能,实现应用程序内部不同组件之间的有效通信。通过定义、处理、映射和发送自定义消息,可以实现灵活的类间通信,...

    MFC实现自定义消息实例

    在Microsoft Foundation Classes(MFC)中实现自定义消息是一个进阶技术,常用于需要高度定制化的Windows应用程序开发。自定义消息允许开发者创建自己的消息类型,以便在应用程序的不同部分之间进行更复杂的通信。在...

    MFC实现自定义消息发送接收

    两个编辑框,两个按钮实现自定义消息发送接收。

    MFC自定义消息的使用例子

    以上就是使用MFC自定义消息的基本流程。通过这种方式,你可以根据需要扩展MFC应用程序,实现特定的功能交互,如跨对象通信、状态更新或者特定事件的处理。在实际项目中,可能需要根据具体需求进行更复杂的定制,例如...

    MFC自定义消息 示例 (初学者适用,高手就不用下了)

    如果你的自定义消息是针对控件的,比如按钮,那么可以使用`ON_COMMAND`或`ON_COMMAND_RANGE`宏在消息映射中处理: ```cpp BEGIN_MESSAGE_MAP(CMyDialog, CDialogEx) ON_COMMAND(MY_CUSTOM_MESSAGE, &CMyDialog::...

    MFC自定义消息

    而`PostMessage`是异步的,发送后立即返回,接收方在消息队列中处理消息。 例如,发送自定义消息: ```cpp LRESULT CMySenderClass::OnSomeEvent(UINT, WPARAM, LPARAM, BOOL&) { // ... HWND hWndReceiver = ::...

    MFC自定义消息的发送与接收

    自定义消息可以通过`RegisterWindowMessage`函数注册,返回一个唯一的消息ID,然后在消息映射中使用这个ID来指定处理函数。 发送自定义消息通常使用`SendMessage`、`PostMessage`或`SendDlgItemMessage`等函数。...

    MFC扩展自定义控件

    开发者需要在类的声明中定义消息映射,并在实现中编写处理函数。例如,ON_WM_LBUTTONDOWN映射到处理鼠标左键点击的函数。 6. **自定义控件的属性和方法**: 为了让自定义控件具有更丰富的功能,开发者可能会添加新...

    MFC自定义消息源码附加说明

    在提供的压缩包文件“MFC自定义消息源码附加说明”中,应该包含了具体的示例代码和详细的注释,你可以参考这些源码来加深对自定义消息的理解,并应用于自己的项目中。记得仔细阅读代码,学习如何在不同场景下使用...

    MFC 自定义 MessageBox

    在消息映射中,我们需要处理按钮的点击事件,以便在用户点击按钮时关闭对话框并返回适当的值。 ```cpp BEGIN_MESSAGE_MAP(CMyCustomMessageBox, CDialog) ON_BN_CLICKED(IDCANCEL, &CMyCustomMessageBox::OnCancel...

    MFC自定义窗口形状

    - 在MFC的窗口类中,重写`On_WM_LBUTTONDOWN`消息处理函数,当用户在直升机区域内单击鼠标左键时,捕获此消息。 - 在`On_WM_LBUTTONDOWN`中,记录鼠标点击位置,并设置鼠标捕获(`SetCapture`)以追踪后续的鼠标...

    MFC中如何使用子控件向父控件发送自定义消息

    在Microsoft Foundation Class (MFC) 库中,子控件向父控件发送自定义消息是一种常见的通信方式,尤其在用户界面设计中。这通常涉及到处理窗口消息、定义消息映射以及实现相应的处理函数。以下将详细介绍这个过程。 ...

Global site tag (gtag.js) - Google Analytics