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 用于组合框的初始列表选项(数据是文本字符串)。