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