控件消息

本部分包含有关 Windows 消息如何用于与控件通信的信息。

论述了以下主题。

将消息发送到公共控件

由于公共控件是窗口,因此应用程序可以使用常见的 Microsoft Win32 消息(如 WM_GETFONTWM_SETTEXT)与其通信。 此外,每个公共控件的窗口类还支持一组特定于控件的消息。 通常,应用程序使用 SendMessageSendDlgItemMessage 将消息传递给控件(通常接收返回值中的信息)。

一些公共控件也有一组宏,应用程序可以使用这些宏,而不是 SendMessage。 宏通常比函数更容易使用。 以下示例代码检索所选树视图项的文本,首先使用原始消息,其次使用等效宏。 假设 hwnd 是控件窗口的句柄。

BOOL fSuccess;
WCHAR itemText[99];
TVITEM tvItem = { 0 };
tvItem.mask = TVIF_TEXT;
tvItem.cchTextMax = ARRAYSIZE(itemText);
tvItem.pszText = itemText;

// This...
tvItem.hItem = (HTREEITEM)SendMessage(hwnd, TVM_GETNEXTITEM, TVGN_CARET, NULL);
fSuccess = SendMessage(hwnd, TVM_GETITEM, 0, (LPARAM)&tvItem);

// ... is equivalent to this.
tvItem.hItem = TreeView_GetSelection(hwnd);
fSuccess = TreeView_GetItem(hwnd, &tvItem);

对系统颜色设置进行更改时,Windows 会向所有顶级窗口发送 WM_SYSCOLORCHANGE 消息。 顶级窗口必须将 WM_SYSCOLORCHANGE 消息转发到其公共控件;否则,不会通知控件颜色更改。 转发消息可确保公共控件使用的颜色与其他用户界面对象使用的颜色一致。 例如,工具栏控件使用“三维对象”颜色绘制其按钮。 如果用户更改 3D 对象的颜色,但不将 WM_SYSCOLORCHANGE 消息转发到工具栏,工具栏按钮将保留其原始颜色(甚至更改为旧颜色和新颜色的组合),而系统中的其他按钮的颜色也会更改。

来自控件的通知

控件是子窗口,当控件中发生事件(通常由用户的输入触发)时,它们会向父窗口发送通知消息。 应用程序依靠这些通知消息来确定用户希望它执行的操作。 除了使用 WM_HSCROLLWM_VSCROLL 消息通知其父更改的跟踪栏之外,公共控件将通知作为 WM_COMMANDWM_NOTIFY 消息发送,如通知的参考主题中所述。 通常,较旧的通知(已长时间在 API 中)使用 WM_COMMAND

WM_NOTIFYlParam 参数是 NMHDR 结构的地址,或者是包含 NMHDR 作为其第一个成员的较大结构的地址。 结构包含通知代码,并标识发送通知消息的公共控件。 其余结构成员的含义(如果有)因通知代码而异。

每种公共控件都有一组相应的通知代码。 公共控件库还提供可由多个类型的公共控件发送的通知代码。 请参阅相关控件文档,确定要发送的通知代码及其采用的格式。

有关演示如何处理 WM_NOTIFY 消息的示例代码,请参阅该消息的参考主题。

常规控件参考