TN024:MFC 定义的消息和资源

注意

以下技术说明在首次包括在联机文档中后未更新。 因此,某些过程和主题可能已过时或不正确。 要获得最新信息,建议你在联机文档索引中搜索热点话题。

此说明介绍 MFC 使用的内部 Windows 消息和资源格式。 此信息说明了框架的实现,并有助于调试应用程序。 对于冒险的人来说,即使官方不支持所有这些信息,你也可使用其中一些信息执行高级实现。

此说明包含 MFC 专用实现详细信息;所有内容将来都可能会发生更改。 MFC 专用 Windows 消息只在一个应用程序的范围内具有意义,但将来会更改以包含系统范围的消息。

MFC 专用 Windows 消息和资源类型的范围位于 Microsoft Windows 预留的“系统”范围内。 目前,并没有使用范围中的所有数字,而将来可能会使用范围中的新数字。 当前使用的数字可能会更改。

MFC 专用 Windows 消息位于 0x360->0x37F 范围内。

MFC 专用资源类型位于 0xF0->0xFF 范围内。

MFC 专用 Windows 消息

这些 Windows 消息用于取代 C++ 虚拟函数,其中窗口对象之间需要相对松散耦合,而 C++ 虚拟函数不适用。

这些专用 Windows 消息和关联的参数结构在 MFC 专用标头“AFXPRIV.H”中进行声明。 请注意,包含此标头的任何代码都可能依赖于未经记录的行为,并且可能会在将来的 MFC 版本中中断。

在极少数需要处理其中一条消息的情况下,应使用 ON_MESSAGE 消息映射宏并处理泛型 LRESULT/WPARAM/LPARAM 格式的消息。

WM_QUERYAFXWNDPROC

此消息将发送到正在创建的窗口。 这在创建过程的早期发送,因为用于确定 WndProc 是否为 AfxWndProc. AfxWndProc 的方法返回 1。

参数和返回值 说明
wParam 未使用
lParam 未使用
returns 如果由 AfxWndProc 处理,则返回 1

WM_SIZEPARENT

此消息在重设大小(CFrameWnd::OnSize 调用 CFrameWnd::RecalcLayout,而后者调用 CWnd::RepositionBars)来围绕框架侧重新放置控件条的过程中,由框架窗口发送到其中间子级。 AFX_SIZEPARENTPARAM 结构包含父级的当前可用客户端矩形以及用于调用 DeferWindowPos 来最大程度减少重新绘制的 HDWP(可能为 NULL)。

参数和返回值 说明
wParam 未使用
lParam AFX_SIZEPARENTPARAMS 结构的地址
returns 未使用 (0)

忽略消息表示窗口不参与布局。

WM_SETMESSAGESTRING

此消息将发送到框架窗口,要求它更新状态栏中的消息行。 可指定字符串 ID 或 LPCSTR,但不能同时指定这两者。

参数和返回值 说明
wParam 字符串 ID(或零)
lParam 字符串的 LPCSTR(或 NULL)
returns 未使用 (0)

WM_IDLEUPDATECMDUI

此消息在空闲时间发送,以实现更新命令 UI 处理程序的空闲时间更新。 如果窗口(通常是控件条)处理消息,它将创建一个 CCmdUI 对象(或派生类的对象),并为窗口中的每个“项”调用 CCmdUI::DoUpdate。 这反过来会在命令处理程序链中检查对象的 ON_UPDATE_COMMAND_UI 处理程序。

参数和返回值 说明
wParam BOOL bDisableIfNoHandler
lParam 未使用 (0)
returns 未使用 (0)

如果既没有 ON_UPDATE_COMMAND_UI 处理程序,也没有 ON_COMMAND 处理程序,则 bDisableIfNoHandler 为非零值以禁用 UI 对象。

WM_EXITHELPMODE

此消息将发布到 CFrameWnd 来退出上下文相关帮助模式。 接收此消息会终止 CFrameWnd::OnContextHelp 启动的模式循环。

参数和返回值 说明
wParam 未使用 (0)
lParam 未使用 (0)
returns 未使用

WM_INITIALUPDATE

当框架窗口的后代可安全地执行初始更新时,文档模板会将此消息发送到所有后代。 它映射到对 CView::OnInitialUpdate 的调用,但可用于其他 CWnd 派生类进行其他单次更新。

参数和返回值 说明
wParam 未使用 (0)
lParam 未使用 (0)
returns 未使用 (0)

WM_RECALCPARENT

此消息由视图发送到其父窗口(通过 GetParent 获取)来强制重新计算布局(通常,父级将调用 RecalcLayout)。 这在 OLE 服务器应用程序中使用,其中当视图的总大小增加时,框架大小也必须增加。

如果父窗口处理此消息,它应返回 TRUE,并使用新的工作区大小填充 lParam 中传递的 RECT。 这在 CScrollView 中使用,以便在就地激活服务器对象时正确处理滚动条(这些滚动条在添加时放在窗口外部)。

参数和返回值 说明
wParam 未使用 (0)
lParam LPRECT rectClient,可能为 NULL
returns 如果返回新的客户端矩形,则为 TRUE;否则为 FALSE

WM_SIZECHILD

当用户使用大小调整图柄来重设大小调整栏的大小时,COleResizeBar 会将此消息发送到其所有者窗口(通过 GetOwner)。 COleIPFrameWnd 通过尝试在用户请求时重新放置框架窗口来响应此消息。

新矩形用相对于包含大小调整栏的框架窗口的客户端坐标表示,该矩形由 lParam 指向。

参数和返回值 说明
wParam 未使用 (0)
lParam LPRECT rectNew
returns 未使用 (0)

WM_DISABLEMODAL

此消息将发送到正在停用的框架窗口所拥有的全部弹出窗口。 框架窗口使用该结果来确定是否禁用弹出窗口。

你可使用此消息在框架进入模式状态时在弹出窗口中执行特殊处理,或者用它来使某些弹出窗口保持在禁用状态。 例如,工具提示使用此消息在框架窗口进入模式状态时自行销毁。

参数和返回值 说明
wParam 未使用 (0)
lParam 未使用 (0)
returns 非零值表示不禁用窗口,0 表示将禁用该窗口

WM_FLOATSTATUS

当框架被另一个顶级框架窗口激活或停用时,此消息将发送到框架窗口拥有的所有弹出窗口。 这由 CMiniFrameWnd 中的 MFS_SYNCACTIVE 实现使用,可使这些弹出窗口的激活与顶级框架窗口的激活保持同步。

参数 说明
wParam 是以下值之一:

FS_SHOW

FS_HIDE

FS_ACTIVATE

FS_DEACTIVATE

FS_ENABLEFS_DISABLE

FS_SYNCACTIVE
lParam 未使用 (0)

如果设置了 FS_SYNCACTIVE,并且窗口将其激活与父框架同步,则返回值应为非零值。 当样式设置为 MFS_SYNCACTIVE 时,CMiniFrameWnd 返回非零值。

有关详细信息,请参阅 CMiniFrameWnd 的实现。

WM_ACTIVATETOPLEVEL

当顶级窗口的“顶级组”中的窗口被激活或停用时,此消息将发送到该顶级窗口。 如果窗口是顶级窗口(没有父级或所有者),或者它属于此类窗口,则该窗口是顶级组的一部分。 此消息与 WM_ACTIVATEAPP 类似,但适合这样的情况:单个窗口层次结构中同时具有属于不同进程的窗口(这在 OLE 应用程序中很常见)。

WM_COMMANDHELP、WM_HELPHITTEST、WM_EXITHELPMODE

这些消息用于实现上下文相关帮助。 有关详细信息,请参阅技术说明 28

MFC 专用资源格式

当前,MFC 定义两种专用资源格式:RT_TOOLBAR 和 RT_DLGINIT。

RT_TOOLBAR 资源格式

AppWizard 提供的默认工具栏基于 MFC 4.0 中引入的 RT_TOOLBAR 自定义资源。 可使用工具栏编辑器编辑此资源。

RT_DLGINIT 资源格式

一种 MFC 专用资源格式,用于存储额外的对话框初始化信息。 这包括存储在组合框中的初始字符串。 此资源的格式不是为手动编辑而设计的,而是由 Visual C++ 进行处理。

Visual C++ 和此 RT_DLGINIT 资源不需要使用 MFC 的相关功能,因为可改用 API 来使用资源中的信息。 使用 Visual C++ 可更轻松地在长时间内编写、维护和转换应用程序。

RT_DLGINIT 资源的基本结构如下所示:

+---------------+    \
| Control ID    |   UINT             |
+---------------+    |
| Message #     |   UINT             |
+---------------+    |
|length of data |   DWORD            |
+---------------+    |   Repeated
|   Data        |   Variable Length  |   for each control
|   ...         |   and Format       |   and message
+---------------+    /
|     0         |   BYTE
+---------------+

重复的部分包含要向其发送消息的控件 ID、要发送的消息编号(正常 Windows 消息)和可变数据长度。 Windows 消息按以下形式发送:

SendDlgItemMessage(<Control ID>, <Message #>, 0, &<Data>);

这是一种非常通用的格式,可用于任何 Windows 消息和数据内容。 Visual C++ 资源编辑器和 MFC 仅支持有限的 Windows 消息子集:CB_ADDSTRING 用于组合框的初始列表选项(数据是文本字符串)。

另请参阅

按编号列出的技术说明
按类别列出的技术说明