关于静态控件

应用程序通常使用静态控件来标记其他控件或分隔一组控件。 尽管静态控件是子窗口,但不能选择它们。 因此,它们不能接收键盘焦点,也不能拥有键盘接口。 具有 SS_NOTIFY 样式的静态控件接收鼠标输入,当用户单击或双击控件时通知父窗口。 静态控件属于 STATIC 窗口类。

尽管静态控件可以在重叠窗口、弹出窗口和子窗口中使用,但它们是为在对话框中使用而设计的,系统会在对话框中标准化它们的行为。 通过在对话框之外使用静态控件,开发人员增加了应用程序以非标准方式运行的风险。 通常,开发人员要么在对话框中使用静态控件,要么使用 SS_OWNERDRAW 样式来创建自定义的静态控件。

以下是本节中要讨论的主题。

静态控件类型

有四种类型的静态控件。 每种类型都有一个或多个静态控件样式

简单图形静态控件

一个简单的图形静态控件显示一个框架或一个填充的矩形。 框架可以绘制为多种样式,包括黑色、灰色或白色。 此外,可以使用蚀刻样式绘制框架,使其具有三维外观。 Frame 样式包括 SS_BLACKFRAME、SS_GRAYFRAME、SS_WHITEFRAME、SS_ETCHEDHORZ、SS_ETCHEDVERT 和 SS_ETCHEDFRAME。

矩形可以采用三种样式之一填充颜色:黑色、灰色或白色。 这些样式由常量 SS_BLACKRECT、SS_GRAYRECT 和 SS_WHITERECT 定义。

图形样式不能组合。

文本静态控件

文本静态控件以五种样式之一显示矩形中的文本:

  • 左对齐,不换行
  • 左对齐并换行
  • 居中对齐
  • 右对齐
  • 简单

这些样式分别由常量 SS_LEFTNOWORDWRAP、SS_LEFT、SS_CENTER、SS_RIGHT 和 SS_SIMPLE 定义。 系统以预定义的方式重新排列这些控件中的文本,但不重新排列的“简单”文本除外。

应用程序可以随时使用 SetWindowText 函数或 WM_SETTEXT 消息更改文本静态控件中的文本。

系统在静态控件中显示尽可能多的文本,并剪辑任何不适合的文本。 若要计算控件的适当大小,请检索文本的字体规格。 有关字体和字体指标的详细信息,请参阅字体和文本

默认情况下,与其他控件一样,静态控件的窗口文本可以包含一个“与”号,该符号将以下字符定义为控件的快捷键(或者,在大多数静态控件的情况下,定义为它所标记的控件的快捷键,即选项卡顺序中的下一个控件)。 如果要在文本中显示“与”号,而不是使用它们来定义快捷方式,请包括 SS_NOPREFIX 样式。

图像静态控件

图像静态控件可以显示位图、图标(包括动画图标)或增强的图元文件。 特定静态控件显示的图形类型取决于控件的样式:SS_BITMAP, SS_ICON 或 SS_ENHMETAFILE。 应用程序在创建控件时指定样式,并指定控件要显示的位图、图标或图元文件的句柄。 创建控件后,应用程序可以通过向控件发送 STM_SETIMAGE 消息(指定新图形对象的句柄)将不同的图形与控件相关联。 应用程序可以通过向当前与静态控件关联的图形对象发送 STM_GETIMAGE 消息来检索该对象的句柄。 应用程序使用 SendDlgItemMessage 函数将消息发送到静态控件。

所有者绘制的静态控件

通过使用 SS_OWNERDRAW 样式,应用程序可以负责绘制静态控件。 每当需要绘制静态控件时,所有者绘制的静态控件(其所有者)的父窗口都会收到 WM_DRAWITEM 消息。 该消息包含指向 DRAWITEMSTRUCT 结构的指针,该结构包含所有者窗口在绘制控件时使用的信息。

静态控件默认消息处理

预定义的静态控制窗口类的窗口过程对静态控制过程未处理的所有消息执行默认处理。 当静态控件对任何消息返回 FALSE 时,预定义的窗口过程会检查消息并执行下表中描述的默认操作。 在表中,文本静态控件是样式为 SS_LEFTNOWORDWRAP、SS_LEFT、SS_CENTER、SS_RIGHT 或 SS_SIMPLE 的静态控件。

Message 默认操作
WM_CREATE 对于图形静态控件,加载图形对象并将窗口调整为对象的大小。 对其他静态控件不采取任何操作。
WM_DESTROY 为图形静态控件释放和销毁任何图形对象。 对其他静态控件不采取任何操作。
WM_ENABLE 重新绘制可见的静态控件。
WM_ERASEBKGND 返回 TRUE,表示控件将擦除背景。
WM_GETDLGCODE 返回 DLGC_STATIC。
WM_GETFONT 返回文本静态控件的字体句柄。
WM_GETTEXT 返回复制的字符数。
WM_GETTEXTLENGTH 返回文本静态控件的文本长度(以字符为单位)。
WM_LBUTTONDBLCLK 如果控件样式为 SS_NOTIFY,则向父窗口发送 STN_DBLCLK 通知代码。
WM_LBUTTONDOWN 如果控件样式为 SS_NOTIFY,则向父窗口发送 STN_CLICKED 通知代码。
WM_NCLBUTTONDBLCLK 如果控件样式为 SS_NOTIFY,则向父窗口发送 STN_DBLCLK 通知代码。
WM_NCLBUTTONDOWN 如果控件样式为 SS_NOTIFY,则向父窗口发送 STN_CLICKED 通知代码。
WM_NCHITTEST 如果控件样式为 SS_NOTIFY,则返回 HTCLIENT;否则,返回 HTTRANSPARENT。
WM_PAINT 重新绘制控件。
WM_SETFONT 设置文本静态控件的字体并重新绘制。
WM_SETTEXT 设置文本静态控件的文本并重新绘制。

 

预定义的窗口过程将所有其他消息传递到 DefWindowProc,以便进行默认处理。