MFC应用程序的发动机:消息映射
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
WM_CLOSE The WM_CLOSE message is sent as a signal that a window or an application should terminate.
所有的窗口消息都可以在MSDN 中查询到。
主要字段:
message(消息类别) wParam(附加参数)
window returns. When the child window is being destroyed, the
system sends the message before any processing to destroy the
window takes place.
WM_CTLCOLOR
WM_PARENTNOTIFY The WM_PARENTNOTIFY message is sent to the
parent of a child window when the child window is created or
destroyed, or when the user clicks a mouse button while the cursor
WM_CREATE The WM_CREATE message is sent when an application requests that a window be created by calling the CreateWindowEx or CreateWindow function. The window procedure of the new window receives this message after the window is created, but before the window becomes visible. The message is sent before the CreateWindowEx or CreateWindow function returns.
is over the child window. When the child window is being created,
the system sends WM_PARENTNOTIFY just before the
CreateWindow or CreateWindowEx function that creates the
主要字段:
message(消息类别) wParam(附加参数)
lParam(附加参数)
WM_COMMAND
低16位为命令ID、
0L
高16位为0。
由于 wParam 的高、低16位表示不同的含义,需要分解 wParam 来判断命令消息,也需要组装一个wParam 用于生成命令消息。 系统提供的宏可以帮助完成这些工作。
WM_XXX
产生途径:
随WM_XXX而变
·窗口之间交互产生;
·系统产生的窗口消息;
·程序根据需要发送窗口消息。
lParam(附加参数) 随WM_XXX而变
4.1.2 命令消息
相关操作:处理用户的某个请求或者执行用户的某个命令。凡
是从基类CCmdTarget 派生的类都能够处理这类消息。
形式:WM_COMMAND
owner of a list box or combo box when the list box or combo box is
destroyed or when items are removed by the LB_DELETESTRING,
LB_RESETCONTENT, CB_DELETESTRING, or CB_RESETCONTENT
window of an owner-drawn button, combo box, list box, or menu
when a visual aspect of the button, combo box, list box, or menu has changed.
WM_DELETEITEM The WM_DELETEITEM message is sent to the
message. The system sends a WM_DELETEITEM message for each deleted item. The system sends the WM_DELETEITEM message for any deleted list box or combo box item with nonzero item data. WM_MEASUREITEM The WM_MEASUREITEM message is sent to the owner window of an owner-drawn button, combo box, list box, list view control, or menu item when the control or menu is created. WM_CHARTOITEM The WM_CHARTOITEM message is sent by a list box with the LBS_WANTKEYBOARDINPUT style to its owner in response to a WM_CHAR message.
4.1 消息类别及其描述
MFC 在Win32 的消息结构MSG 的基础上将消息分为三类:窗 口消息、命令消息和控件消息。消息的区别在于:消息类别标 识和消息的附加参数不同。
4.1.1 窗口消息
相关操作:与窗口相关的操作,例如,创建窗口、绘制窗口、 移动窗口、改变窗口尺寸、鼠标在窗口区域内的各种操作等。 凡是从基类CWnd派生的类都能够处理这类消息。 形式:WM_XXX,其中WM 为窗口消息类型前缀,XXX表示具 体的窗口消息种类。例如:
Windows controls frequently send notification
messages to their parent windows. For instance, many controls send
a control color notification message (WM_CTLCOLOR or one of its
参数分解:
·HIGHWORD(wParam) 获取高16位,为0表示WM_COMMAND 类别的消息为命令消息。
·LOWWORD(wParam) 获取低16位,为命令的资源ID。例如: 菜单命令消息中: 菜单项的资源ID; 工具栏按钮消息中:工具栏按钮对应的资源ID; 加速键消息中: 加速键对应的资源ID。
第四章 MFC应用程序的发动机: 消息映射
了解MFC 应用程序框架是由哪些MFC 框架类对象组成的,这 些类对象是如何被创建、初始化和调用,使我们掌握了MFC 应 用程序的启动、进入消息循环和退出进程的运行机制(这与API 程序的运行控制在本质上是完全一致的)。众所周知, Windows 应用程序的运行动力是消息驱动。因此,掌握消息驱动的实现 机制,如何使用消息驱动控制进程、实现程序设计需求也是在 VC 集成环境中使用MFC 进行面向对象的Windows 程序设计、编 程的关键基础之一。
4.1.3 控件消息
相关操作:此类消息与控件窗口中的某个事件相关,例如:文 本框控件窗口内的内容发生改变、列表框控件中某个选项被选 择、按钮控件被单击、滑杆条的游标被移动等,都会发出相应 的控件事件消息。 形式:由于控件是近年来软件开发中最为活跃的,控件的种类 不断增加,随之控件消息的类别也迅速增加,原来的控件消息 格式越来越不能满足控件消息的描述,因此,必须寻求新的控 件消息描述方法。由于历史的原因,控件消息的新旧描述形式 必须并存才能兼容所有的控件消息。三种不同的控件消息形 式、主要字段的内容分别描述如下: 1. 第1种控件消息格式(仿窗口消息格式)
在MFC 应用程序中看不到API 应用程序中实现消息驱动控制 的窗口函数WndProc 和函数中用于处理消息的switch-case 结 构,而相同的消息驱动控制是通过为各个能够响应和处理消息 的类(直接或间接从CCmdTarget 类派生)编制消息映射表和响应 的消息处理成员函数实现的。这种消息映射的方法更符合面向 对象程序设计。这种方法是如何实现将消息映射到处理函数的 呢?我们将通过对消息(类别和描述)、消息映射的原理、处理 消息的路径等内容的学习来解决这一问题。
a scroll event occurs in the window's standard vertical scroll bar.
This message is also sent to the owner of a vertical scroll bar control
when a scroll event occurs in the control.
bar. This message is also sent to the owner of a horiz scroll event occurs in the control.
WM_VSCROLL The WM_VSCROLL message is sent to a window when
参数组合:
使用宏MAKEWPARAM,例如:生成一条打开文件的命令消息,打开 文件的菜单项的资源ID为ID_FILE_OPEN,消息命令为: (WM_COMMAND, MAKEWPARAM(ID_FILE_OPEN, 0), 0L)
产生途径: ·选择菜单项; ·单击工具栏按钮; ·按加速键; ·程序根据需要发送的命令消息。
WM_PAINT An application sends the WM_PAINT message when the system or another application makes a request to paint a portion of an application's window. The message is sent when the UpdateWindow or RedrawWindow function is called, or by the DispatchMessage function when the application obtains a WM_PAINT message by using the GetMessage or PeekMessage function.
最早出现的控件消息形式,这种格式遵循窗口消息的格式, 因此是系统提供的窗口消息集的一部分。格式为WM_XXX。
主要字段:
message(消息类别)
wParam(附加参数)
lParam(附加参数)
WM_XXX
随WM_XXX而变
随WM_XXX而变
消息类别中的XXX 表示不同控件消息,例如:
WM_HSCROLL The WM_HSCROLL message is sent to a window when a scroll event occurs in the window's standard horizontal scroll
variants) to their parent to allow the parent to supply a brush for
painting the background of the control.
WM_DRAWITEM The WM_DRAWITEM message is sent to the owner
WM_LBUTTONDOWN The WM_LBUTTONDOWN message is posted when the user presses the left mouse button while the cursor is in the client area of a window. If the mouse is not captured, the message is posted to the window beneath the cursor. Otherwise, the message is posted to the window that has captured the mouse.
所有的窗口消息都可以在MSDN 中查询到。
主要字段:
message(消息类别) wParam(附加参数)
window returns. When the child window is being destroyed, the
system sends the message before any processing to destroy the
window takes place.
WM_CTLCOLOR
WM_PARENTNOTIFY The WM_PARENTNOTIFY message is sent to the
parent of a child window when the child window is created or
destroyed, or when the user clicks a mouse button while the cursor
WM_CREATE The WM_CREATE message is sent when an application requests that a window be created by calling the CreateWindowEx or CreateWindow function. The window procedure of the new window receives this message after the window is created, but before the window becomes visible. The message is sent before the CreateWindowEx or CreateWindow function returns.
is over the child window. When the child window is being created,
the system sends WM_PARENTNOTIFY just before the
CreateWindow or CreateWindowEx function that creates the
主要字段:
message(消息类别) wParam(附加参数)
lParam(附加参数)
WM_COMMAND
低16位为命令ID、
0L
高16位为0。
由于 wParam 的高、低16位表示不同的含义,需要分解 wParam 来判断命令消息,也需要组装一个wParam 用于生成命令消息。 系统提供的宏可以帮助完成这些工作。
WM_XXX
产生途径:
随WM_XXX而变
·窗口之间交互产生;
·系统产生的窗口消息;
·程序根据需要发送窗口消息。
lParam(附加参数) 随WM_XXX而变
4.1.2 命令消息
相关操作:处理用户的某个请求或者执行用户的某个命令。凡
是从基类CCmdTarget 派生的类都能够处理这类消息。
形式:WM_COMMAND
owner of a list box or combo box when the list box or combo box is
destroyed or when items are removed by the LB_DELETESTRING,
LB_RESETCONTENT, CB_DELETESTRING, or CB_RESETCONTENT
window of an owner-drawn button, combo box, list box, or menu
when a visual aspect of the button, combo box, list box, or menu has changed.
WM_DELETEITEM The WM_DELETEITEM message is sent to the
message. The system sends a WM_DELETEITEM message for each deleted item. The system sends the WM_DELETEITEM message for any deleted list box or combo box item with nonzero item data. WM_MEASUREITEM The WM_MEASUREITEM message is sent to the owner window of an owner-drawn button, combo box, list box, list view control, or menu item when the control or menu is created. WM_CHARTOITEM The WM_CHARTOITEM message is sent by a list box with the LBS_WANTKEYBOARDINPUT style to its owner in response to a WM_CHAR message.
4.1 消息类别及其描述
MFC 在Win32 的消息结构MSG 的基础上将消息分为三类:窗 口消息、命令消息和控件消息。消息的区别在于:消息类别标 识和消息的附加参数不同。
4.1.1 窗口消息
相关操作:与窗口相关的操作,例如,创建窗口、绘制窗口、 移动窗口、改变窗口尺寸、鼠标在窗口区域内的各种操作等。 凡是从基类CWnd派生的类都能够处理这类消息。 形式:WM_XXX,其中WM 为窗口消息类型前缀,XXX表示具 体的窗口消息种类。例如:
Windows controls frequently send notification
messages to their parent windows. For instance, many controls send
a control color notification message (WM_CTLCOLOR or one of its
参数分解:
·HIGHWORD(wParam) 获取高16位,为0表示WM_COMMAND 类别的消息为命令消息。
·LOWWORD(wParam) 获取低16位,为命令的资源ID。例如: 菜单命令消息中: 菜单项的资源ID; 工具栏按钮消息中:工具栏按钮对应的资源ID; 加速键消息中: 加速键对应的资源ID。
第四章 MFC应用程序的发动机: 消息映射
了解MFC 应用程序框架是由哪些MFC 框架类对象组成的,这 些类对象是如何被创建、初始化和调用,使我们掌握了MFC 应 用程序的启动、进入消息循环和退出进程的运行机制(这与API 程序的运行控制在本质上是完全一致的)。众所周知, Windows 应用程序的运行动力是消息驱动。因此,掌握消息驱动的实现 机制,如何使用消息驱动控制进程、实现程序设计需求也是在 VC 集成环境中使用MFC 进行面向对象的Windows 程序设计、编 程的关键基础之一。
4.1.3 控件消息
相关操作:此类消息与控件窗口中的某个事件相关,例如:文 本框控件窗口内的内容发生改变、列表框控件中某个选项被选 择、按钮控件被单击、滑杆条的游标被移动等,都会发出相应 的控件事件消息。 形式:由于控件是近年来软件开发中最为活跃的,控件的种类 不断增加,随之控件消息的类别也迅速增加,原来的控件消息 格式越来越不能满足控件消息的描述,因此,必须寻求新的控 件消息描述方法。由于历史的原因,控件消息的新旧描述形式 必须并存才能兼容所有的控件消息。三种不同的控件消息形 式、主要字段的内容分别描述如下: 1. 第1种控件消息格式(仿窗口消息格式)
在MFC 应用程序中看不到API 应用程序中实现消息驱动控制 的窗口函数WndProc 和函数中用于处理消息的switch-case 结 构,而相同的消息驱动控制是通过为各个能够响应和处理消息 的类(直接或间接从CCmdTarget 类派生)编制消息映射表和响应 的消息处理成员函数实现的。这种消息映射的方法更符合面向 对象程序设计。这种方法是如何实现将消息映射到处理函数的 呢?我们将通过对消息(类别和描述)、消息映射的原理、处理 消息的路径等内容的学习来解决这一问题。
a scroll event occurs in the window's standard vertical scroll bar.
This message is also sent to the owner of a vertical scroll bar control
when a scroll event occurs in the control.
bar. This message is also sent to the owner of a horiz scroll event occurs in the control.
WM_VSCROLL The WM_VSCROLL message is sent to a window when
参数组合:
使用宏MAKEWPARAM,例如:生成一条打开文件的命令消息,打开 文件的菜单项的资源ID为ID_FILE_OPEN,消息命令为: (WM_COMMAND, MAKEWPARAM(ID_FILE_OPEN, 0), 0L)
产生途径: ·选择菜单项; ·单击工具栏按钮; ·按加速键; ·程序根据需要发送的命令消息。
WM_PAINT An application sends the WM_PAINT message when the system or another application makes a request to paint a portion of an application's window. The message is sent when the UpdateWindow or RedrawWindow function is called, or by the DispatchMessage function when the application obtains a WM_PAINT message by using the GetMessage or PeekMessage function.
最早出现的控件消息形式,这种格式遵循窗口消息的格式, 因此是系统提供的窗口消息集的一部分。格式为WM_XXX。
主要字段:
message(消息类别)
wParam(附加参数)
lParam(附加参数)
WM_XXX
随WM_XXX而变
随WM_XXX而变
消息类别中的XXX 表示不同控件消息,例如:
WM_HSCROLL The WM_HSCROLL message is sent to a window when a scroll event occurs in the window's standard horizontal scroll
variants) to their parent to allow the parent to supply a brush for
painting the background of the control.
WM_DRAWITEM The WM_DRAWITEM message is sent to the owner
WM_LBUTTONDOWN The WM_LBUTTONDOWN message is posted when the user presses the left mouse button while the cursor is in the client area of a window. If the mouse is not captured, the message is posted to the window beneath the cursor. Otherwise, the message is posted to the window that has captured the mouse.