注释
自联机文档中首次包含此说明以来,尚未更新以下技术说明。 因此,某些过程和主题可能过期或不正确。 有关最新信息,建议在在线文档索引中搜索您感兴趣的主题。
此说明介绍 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。
参数和返回值 | DESCRIPTION |
---|---|
wParam | 未使用 |
lParam | 未使用 |
返回内容 | AfxWndProc 处理时为 1 |
WM_SIZEPARENT
此消息由框架窗口在调整大小(CFrameWnd::OnSize
调用 CFrameWnd::RecalcLayout
调用 CWnd::RepositionBars
)期间将其立即子级发送到其框架的一侧,以重新定位控制栏。 AFX_SIZEPARENTPARAMS结构包含父级的当前可用客户端矩形和 HDWP(可能为 NULL),要调用 DeferWindowPos
该矩形以最大程度地减少重新绘制。
参数和返回值 | DESCRIPTION |
---|---|
wParam | 未使用 |
lParam | AFX_SIZEPARENTPARAMS结构的地址 |
返回内容 | 未使用 (0) |
忽略消息表示窗口未参与布局。
WM_SETMESSAGESTRING
此消息将发送到框架窗口,以要求它更新状态栏中的消息行。 可以指定字符串 ID 或 LPCSTR(但不能同时指定两者)。
参数和返回值 | DESCRIPTION |
---|---|
wParam | 字符串 ID (或零) |
lParam | 字符串的 LPCSTR (或 NULL) |
返回内容 | 未使用 (0) |
WM_IDLEUPDATECMDUI
此消息在空闲时间内发送,以实现 update-command UI 处理程序的空闲时间更新。 如果窗口(通常是控件栏)处理消息,它将创建一个 CCmdUI
对象(或派生类的对象),并调用 CCmdUI::DoUpdate
窗口中每个“项”。 这将反过来检查命令处理程序链中对象的ON_UPDATE_COMMAND_UI处理程序。
参数和返回值 | DESCRIPTION |
---|---|
wParam | BOOL bDisableIfNoHandler |
lParam | 未使用 (0) |
返回内容 | 未使用 (0) |
bDisableIfNoHandler 为非零,如果不存在ON_UPDATE_COMMAND_UI或ON_COMMAND处理程序,则禁用 UI 对象。
WM_EXITHELPMODE
此消息将 CFrameWnd
发布到该消息以退出上下文敏感帮助模式。 收到此消息将终止由该消息启动的 CFrameWnd::OnContextHelp
模式循环。
参数和返回值 | DESCRIPTION |
---|---|
wParam | 未使用 (0) |
lParam | 未使用 (0) |
返回内容 | 未使用 |
WM_INITIALUPDATE
此消息由文档模板发送到框架窗口的所有后代,当它们进行初始更新时安全。 它映射到对其他CWnd
派生类的调用CView::OnInitialUpdate
,但可用于其他一次性更新的派生类。
参数和返回值 | DESCRIPTION |
---|---|
wParam | 未使用 (0) |
lParam | 未使用 (0) |
返回内容 | 未使用 (0) |
WM_RECALCPARENT
此消息由视图发送到其父窗口(通过 GetParent
获取)来强制重新计算布局(通常,父级将调用 RecalcLayout
)。 这在 OLE 服务器应用程序中使用,在视图的总大小增长时,帧必须增大大小。
如果父窗口处理此消息,它应返回 TRUE,并使用新的工作区大小填充 lParam 中传递的 RECT。 这用于 CScrollView
在服务器对象就地激活时正确处理滚动条(在添加滚动条时放置在窗口外部)。
参数和返回值 | DESCRIPTION |
---|---|
wParam | 未使用 (0) |
lParam | LPRECT rectClient,可能为 NULL |
返回内容 | 如果返回新的客户端矩形,则为 TRUE;否则为 FALSE |
WM_SIZECHILD
当用户使用调整大小控点调整大小栏时,此消息将发送到 COleResizeBar
其所有者窗口(通过 GetOwner
)。
COleIPFrameWnd
通过尝试在用户请求时重新定位框架窗口来响应此消息。
在客户端坐标中给定的新矩形相对于包含调整大小栏的框架窗口,由 lParam 指向。
参数和返回值 | DESCRIPTION |
---|---|
wParam | 未使用 (0) |
lParam | LPRECT rectNew |
返回内容 | 未使用 (0) |
WM_DISABLEMODAL
此消息将发送到正在停用的框架窗口拥有的所有弹出窗口。 框架窗口使用结果来确定是否禁用弹出窗口。
当帧进入模式状态或阻止某些弹出窗口被禁用时,可以使用此功能在弹出窗口中执行特殊处理。 例如,工具提示使用此消息在帧窗口进入模式状态时自行销毁。
参数和返回值 | DESCRIPTION |
---|---|
wParam | 未使用 (0) |
lParam | 未使用 (0) |
返回内容 | 非零到 未 禁用窗口,0 表示将禁用该窗口 |
WM_FLOATSTATUS
当帧被另一个顶级框架窗口激活或停用时,此消息将发送到框架窗口拥有的所有弹出窗口。 这由MFS_SYNCACTIVE的 CMiniFrameWnd
实现使用,使这些弹出窗口的激活与顶级框架窗口的激活保持同步。
参数 | DESCRIPTION |
---|---|
wParam | 以下值之一: FS_SHOW FS_HIDE FS_ACTIVATE FS_DEACTIVATE FS_ENABLEFS_DISABLE FS_SYNCACTIVE |
lParam | 未使用 (0) |
如果设置了FS_SYNCACTIVE,并且窗口会将其激活与父帧同步,则返回值应为非零。
CMiniFrameWnd
当样式设置为MFS_SYNCACTIVE时,返回非零。
有关详细信息,请参阅实现 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++处理。
视觉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组合框的初始列表选择(数据是文本字符串)。