状态栏 (Windows 控件)
状态栏 是父窗口底部的水平窗口,应用程序可以在其中显示各种状态信息。 状态栏可以分为多个部分以显示多个类型的信息。 以下屏幕截图显示了Microsoft Windows 画图应用程序中的状态栏。 在这种情况下,状态栏包含文本“对于帮助,请单击帮助菜单上的帮助主题”。 状态栏是窗口底部包含帮助文本和坐标信息的区域。
的提示的状态栏
本部分包括以下主题。
类型和样式
状态栏的默认位置沿父窗口底部,但你可以指定 CCS_TOP 样式使其显示在父窗口工作区顶部。
可以指定 SBARS_SIZEGRIP 样式,以在状态栏右端包含大小控制。
注意
不建议组合 CCS_TOP 和 SBARS_SIZEGRIP 样式,因为生成的调整大小控制不起作用。
大小和高度
状态栏的窗口过程会自动设置窗口的初始大小和位置,忽略 CreateWindowEx 函数中指定的值。 宽度与父窗口工作区的宽度相同。 高度基于当前选择到状态栏的设备上下文中以及窗口边框宽度的字体的指标。
窗口过程会在收到 WM_SIZE 消息时自动调整状态栏的大小。 通常,当父窗口的大小发生更改时,父窗口会将 WM_SIZE 消息发送到状态栏。
应用程序可以通过向窗口发送 SB_SETMINHEIGHT 消息(指定最小高度(以像素为单位)来设置状态栏绘图区的最低高度。 绘图区不包括窗口边框。 最小高度可用于在所有者绘制状态栏中绘制。 有关详细信息,请参阅本章后面的 Owner-Drawn 状态栏。
通过向窗口发送 SB_GETBORDERS 消息来检索状态栏边框的宽度。 该消息包括接收宽度的三元素数组的地址。
Multiple-Part 状态栏
状态栏可以包含许多不同的部分,每个部分都显示不同的文本行。 通过向窗口发送 SB_SETPARTS 消息,指定要创建的部件数和整数数组的地址,将状态栏划分为部件。 该数组包含每个部件的一个元素,每个元素指定部件右边缘的客户端坐标。
状态栏最多可以包含 256 个部分,但应用程序通常使用的部件要少得多。 通过向窗口发送 SB_GETPARTS 消息,可以检索状态栏中部分的计数以及每个部件右边缘的坐标。
状态栏文本作
可以通过发送 SB_SETTEXT 消息、指定部件的从零开始的索引、要绘制部件的字符串的地址以及绘制字符串的技术来设置状态栏的任何部分的文本。 绘图技术确定文本是否具有边框,如果具有边框,则确定边框的样式。 它还确定父窗口是否负责绘制文本。 有关详细信息,请参阅下面的 Owner-Drawn 状态栏 部分。
默认情况下,文本在状态栏的指定部分左对齐。 可以在文本中嵌入制表符(\ t)以居中或右对齐。 单个制表符右侧的文本居中,第二个制表符右侧的文本右对齐。
若要从状态栏中检索文本,请使用 SB_GETTEXTLENGTH 和 SB_GETTEXT 消息。
如果应用程序使用只有一部分的状态栏,则可以使用 WM_SETTEXT、WM_GETTEXT和 WM_GETTEXTLENGTH 消息来执行文本作。 这些消息仅处理索引为零的部分,使你可以像静态文本控件一样对待状态栏。
若要在不创建状态栏的情况下显示状态行,请使用 DrawStatusText 函数。 该函数使用相同的技术将状态绘制为状态栏的窗口过程,但它不会自动设置状态信息的大小和位置。 调用函数时,必须指定状态信息的大小和位置以及要在其中绘制它的窗口的设备上下文。
Owner-Drawn 状态栏
可以将状态栏的各个部分定义为所有者绘制的部件。 使用此技术可让你更好地控制窗口部件的外观。 例如,可以使用其他字体显示位图而不是文本或绘制文本。
若要将窗口部件定义为所有者绘制,请将 SB_SETTEXT 消息发送到状态栏,并指定部件和SBT_OWNERDRAW绘图技术。 指定SBT_OWNERDRAW时,lParam 参数是应用程序在绘制部件时可以使用的 32 位应用程序定义值。 例如,可以指定字体句柄、位图句柄、字符串地址等。
当状态栏需要绘制所有者绘制部件时,它将 WM_DRAWITEM 消息发送到父窗口。 消息的 wParam 参数是状态栏的子窗口标识符,lParam 参数是 DRAWITEMSTRUCT 结构的地址。 父窗口使用结构中的信息来绘制部件。 对于状态栏的所有者绘制部分,DRAWITEMSTRUCT 包含以下信息。
成员 | 描述 |
---|---|
CtlType | 定义;请勿使用。 |
CtlID | 状态栏的子窗口标识符。 |
itemID | 要绘制的部件的从零开始的索引。 |
itemAction | 定义;请勿使用。 |
itemState | 定义;请勿使用。 |
hwndItem | 状态栏的句柄。 |
hDC | 状态栏的设备上下文的句柄。 |
rcItem | 要绘制的窗口部件的坐标。 坐标相对于状态栏左上角。 |
itemData | 在 SB_SETTEXT 消息的 lParam 参数中指定的应用程序定义的 32 位值。 |
简单模式状态栏
通过向其发送 SB_SIMPLE 消息,将状态栏置于“简单模式”。 简单模式状态栏仅显示一个部分。 设置窗口的文本时,窗口将失效,但直到下一 WM_PAINT才会重新绘制窗口。 等待消息可最大程度地减少重新绘制窗口的次数,从而减少屏幕闪烁。 在用户滚动菜单时,简单模式状态栏可用于显示菜单项的帮助文本。
状态栏在简单模式下显示的字符串与在非简单模式下显示的字符串分开维护。 这意味着可以将窗口置于简单模式下,设置其文本,并在不更改非简单模式文本的情况下切换回非简单模式。
设置简单模式状态栏的文本时,可以指定除SBT_OWNERDRAW以外的任何绘图技术。 简单模式状态栏不支持所有者绘图。
默认状态栏消息处理
本部分介绍预定义的 STATUSCLASSNAME 类的窗口过程处理的消息。
消息 | 默认处理 |
---|---|
WM_CREATE | 初始化状态栏。 |
WM_DESTROY | 释放为状态栏分配的资源。 |
WM_GETFONT | 返回状态栏绘制其文本的当前字体的句柄。 |
WM_GETTEXT | 将状态栏的第一部分的文本复制到缓冲区。 它返回一个 32 位值,该值指定文本的长度(以字符为单位)以及用于绘制文本的技术。 |
WM_GETTEXTLENGTH | 返回一个 32 位值,该值指定状态栏第一部分中文本的长度(以字符为单位)以及用于绘制文本的技术。 |
WM_NCHITTEST | 如果鼠标光标位于大小控制手柄中,则返回 HTBOTTOMRIGHT 值,导致系统显示大小调整光标。 如果鼠标光标不在大小控制手柄中,状态栏会将此消息传递给 DefWindowProc 函数。 |
WM_PAINT | 绘制状态栏无效区域。 如果 wParam 参数 非NULL,则该控件假定该值为 HDC,并使用该设备上下文进行绘制。 |
WM_SETFONT | 选择状态栏的设备上下文中的字体句柄。 |
WM_SETTEXT | 使用默认绘图作(指定为零)将指定的文本复制到状态栏的第一部分。 如果成功,则返回 TRUE;否则返回 false FALSE。 |
WM_SIZE | 根据父窗口工作区的当前宽度和状态栏当前字体的高度调整状态栏的大小。 |