关于工具栏控件

工具栏是包含一个或多个按钮的控件。 当用户单击时,每个按钮都会向父窗口发送命令消息。 通常,工具栏中的按钮对应于应用程序菜单项,为用户另外提供了一种更直接的方式来访问应用程序命令。

以下屏幕截图显示了一个窗口,其中包含用于文件操作的简单工具栏。 应用程序已启用视觉样式。 “保存”按钮是“热”,因为光标在拍摄屏幕截图时将鼠标悬停在上方。 控件的实际外观因操作系统和用户选择的主题而异。

screen shot of a window with a three-button toolbar; one button is hot

以下屏幕截图显示了在未启用视觉样式的情况下编译的应用程序中的相同控件。

screen shot of a window without visual styles: none of the buttons looks hot

以下主题讨论规划工具栏时要考虑的功能。 有关实现和示例代码的特定信息,请参阅 使用工具栏控件

指定工具栏大小和位置

如果使用 CreateToolbarEx 创建工具栏,则函数允许你以像素为单位指定工具栏的高度和宽度。

注意

不建议使用 CreateToolbarEx ,因为它不支持工具栏的新功能,包括图像列表。 有关创建工具栏的详细信息,请参阅 使用工具栏控件

 

CreateWindowEx 函数没有用于指定工具栏大小的参数。 工具栏窗口过程会自动设置工具栏窗口的大小和位置。 高度基于工具栏中按钮的高度。 宽度与父窗口工作区的宽度相同。 若要更改自动大小设置,请发送 TB_SETBUTTONSIZE 消息。 CCS_TOPCCS_BOTTOM常见控件样式确定工具栏是放置在工作区的顶部还是底部。 默认情况下,工具栏具有 CCS_TOP 样式。

此外,每当工具栏收到 WM_SIZETB_AUTOSIZE 消息时,工具栏窗口过程都会自动调整工具栏的大小。 每当父窗口的大小发生更改或发送需要调整工具栏大小的消息后,应用程序都应发送其中一条消息,例如 ,TB_SETBUTTONSIZE 消息。

可以通过设置 CCS_NORESIZECCS_NOPARENTALIGN 常见控件样式来关闭工具栏默认大小和定位行为。 由 rebar 控件托管的工具栏控件必须设置这些样式,因为 rebar 控件的大小和位置是工具栏。

透明工具栏

工具栏控件支持透明外观,该外观允许工具栏下的工作区显示。 有两种类型的透明工具栏,一种是带有平面按钮,一种是具有三维按钮的工具栏。 如果希望应用程序与Windows接口匹配,请使用平面透明样式工具栏。

以下屏幕截图显示了两种类型的透明工具栏,而不是使用视觉样式。

screen shot of two windows with different styles of toolbars, but both toolbars are transparent

以下屏幕截图显示透明工具栏,因为它可能在Windows Vista 中显示,启用了视觉样式。 对话框的背景色已更改,以使透明度更加明显。

screen shot of a window in windows vista with a transparent toolbar

若要创建透明工具栏,只需将 TBSTYLE_FLATTBSTYLE_TRANSPARENT 添加到 CreateWindowEx 的窗口样式参数。 如果不希望显示一行来指示工具栏底部,请不要使用 WS_BORDER 窗口样式。

注意

使用视觉样式时,工具栏默认可能平展。

 

列表样式工具栏

工具栏按钮使你可以同时显示文本和位图。 工具栏上的按钮使用 TBSTYLE_LIST 样式将文本放置在位图右侧,而不是放在其下方。

以下屏幕截图显示了具有列表样式的工具栏。

screen shot of a toolbar with text to the right of each icon

可以使用 TBSTYLE_LIST 工具栏样式与 TBSTYLE_FLAT 样式结合使用来创建带有平面按钮的工具栏。

定义按钮图像

可通过两种方式指定按钮的图像,例如位图或图像列表。 应用程序必须选择要使用的方法。 它不能将这两种方法与同一工具栏控件一起使用。 请注意, CreateToolbarEx 函数使用位图方法。 想要使用图像列表方法的应用程序必须使用 CreateWindowEx 函数来创建工具栏控件。

使用位图定义按钮图像

工具栏中的每个按钮都可以包含位图图像。 工具栏使用内部列表来存储绘制图像所需的信息。 调用 CreateToolbarEx 函数时,指定包含初始图像的单色位图或颜色位图,工具栏会将信息添加到图像的内部列表中。 稍后可以使用 TB_ADDBITMAP 消息添加其他图像。

每个图像都有一个从零开始的索引。 添加到内部列表中的第一个图像的索引为 0,第二个图像的索引为 1,依此等。 TB_ADDBITMAP 将图像添加到列表末尾,并返回它添加的第一个新图像的索引。 若要将图像与按钮相关联,必须在将位图添加到内部图像列表后发送 TB_ADDBUTTONS 消息并指定图像的索引。

Windows假定工具栏的所有位图图像的大小都相同。 使用 CreateToolbarEx 创建工具栏时指定大小。 如果使用 CreateWindowEx 函数创建工具栏,则图像的大小设置为默认尺寸 16 到 15 像素。 可以使用 TB_SETBITMAPSIZE 消息更改位图图像的尺寸,但必须在将任何图像添加到内部列表中之前执行此操作。

使用图像列表定义按钮图像

还可以将按钮图像存储在一组 图像列表中。 图像列表是相同大小的图像集合,每个图像都可以由其索引引用。 图像列表用于管理大型图标或位图集。 最多可以使用三个不同的图像列表来显示处于各种状态的按钮,如下表所示。

状态 描述
普通 处于默认状态的按钮。
指针下或按下的按钮。 热项仅在具有 TBSTYLE_FLAT 样式的工具栏控件中受支持。
已禁用 禁用的按钮。

 

工具栏被销毁后,应用程序必须释放他们创建的任何图像列表。

定义按钮的文本

除了图像之外,每个按钮还可以显示字符串,也可以显示一个字符串。 工具栏维护包含工具栏按钮可用的所有字符串的内部列表。 使用 TB_ADDSTRING 消息将字符串添加到内部列表中,指定包含要添加的字符串的缓冲区的地址。 每个字符串必须以 null 结尾,最后一个字符串必须以两个 null 字符结尾。

每个字符串都有一个从零开始的索引。 添加到字符串内部列表中的第一个字符串的索引为 0,第二个字符串的索引为 1,依此等。 TB_ADDSTRING 将字符串添加到列表末尾,并返回第一个新字符串的索引。 使用字符串的索引将字符串与按钮相关联。

使用 TB_ADDSTRING 并不是向工具栏添加字符串的唯一方法。 可以通过在传递给TB_ADDBUTTONSTBBUTTON 结构的 iString 成员中传递字符串指针,在按钮中显示字符串。 此外,可以使用 TB_SETBUTTONINFO 将文本分配给工具栏按钮。

添加工具栏按钮

如果使用 CreateToolbarEx 函数创建工具栏,可以通过填充 TBBUTTON 结构的数组并在函数调用中指定数组的地址,将按钮添加到工具栏。 但是, CreateWindowEx 函数没有用于传递 TBBUTTON 结构的参数。 CreateWindowEx 通过发送 TB_ADDBUTTONS 消息(指定 TBBUTTON 结构的地址)创建填充的空工具栏。

创建工具栏后,可以通过发送 TB_INSERTBUTTONTB_ADDBUTTONS 消息来添加按钮。 每个按钮都由 TBBUTTON 结构描述,该结构定义按钮的属性,包括其字符串和位图的索引以及其样式、状态、命令标识符和应用程序定义的 32 位值。

注意

如果使用 CreateWindowEx 函数创建工具栏,则必须在添加任何按钮之前发送 TB_BUTTONSTRUCTSIZE 消息。 该消息将 TBBUTTON 结构的大小传递给工具栏。

 

工具栏按钮样式

按钮的样式确定按钮的显示方式及其响应用户输入的方式。 例如, BTNS_BUTTON 样式创建一个类似于标准推送按钮的工具栏按钮。 具有 BTNS_CHECK 样式的按钮类似于标准推送按钮,但每次用户单击它时,它都会在按下状态和非压缩状态之间切换。

可以使用 BTNS_GROUPBTNS_CHECKGROUP 样式创建类似于单选按钮的工具栏按钮组。 这会导致按钮保持按下状态,直到用户选择组中的另一个按钮。 组定义为一个连续的按钮集合,其中包含 BTNS_GROUPBTNS_CHECKGROUP 样式。

BTNS_SEP样式在按钮之间创建一个小间距,或在平面工具栏上的按钮之间绘制刻画。 具有 BTNS_SEP 样式的按钮不会接收用户输入。

通用控件版本 5.80 引入了一些新的工具栏按钮样式,并重命名了一些较旧的样式。 所有按钮样式标志现在都以BTNS_XXX开头,而不是TBSTYLE_XXX。 有关按钮样式的列表和讨论,请参阅 工具栏控件和按钮样式

工具栏按钮状态

工具栏中的每个按钮都有一个状态。 工具栏更新按钮的状态以反映用户操作,例如单击该按钮。 状态指示按钮当前是按下还是未按下、启用或禁用、隐藏还是可见。 尽管应用程序在将按钮添加到工具栏时设置按钮的初始状态,但它可以通过将 TB_GETSTATETB_SETSTATE 消息发送到工具栏来更改和检索状态。 有关工具栏按钮状态的列表,请参阅 工具栏状态

命令标识符

每个按钮都有一个与之关联的应用程序定义的命令标识符。 按钮标识符通常在应用程序头文件中定义。 例如,“粘贴”按钮可以定义为:

#define ID_PASTE 100

当用户选择按钮时,工具栏会向父窗口发送 一个WM_COMMANDWM_NOTIFY 消息,其中包含按钮的命令标识符。 父窗口检查命令标识符,并执行与按钮关联的命令。 有关控件何时发送 WM_COMMAND 消息以及何时发送 WM_NOTIFY的信息,请参阅 WM_NOTIFY 文档的“备注”部分。

按钮大小和位置

工具栏通过为每个按钮分配一个位置索引来跟踪其按钮。 索引从零开始;也就是说,最左侧的按钮的索引为 0,右侧的下一个按钮的索引为 1,依此而行。 当发送消息以检索有关该按钮的信息或设置按钮属性时,应用程序必须指定按钮的索引。

工具栏在插入和删除按钮时更新位置索引。 应用程序可以使用 TB_COMMANDTOINDEX 消息检索按钮的当前位置索引。 该消息指定按钮的命令标识符,工具栏窗口使用标识符定位按钮并返回其位置索引。

工具栏中的所有按钮大小相同。 CreateToolbarEx 函数要求在创建工具栏时设置按钮的初始大小。 使用 CreateWindowEx 函数时,初始大小设置为默认尺寸 24 到 22 像素。 可以使用 TB_SETBUTTONSIZE 消息更改按钮大小,但在将任何按钮添加到工具栏之前,必须执行此操作。 TB_GETITEMRECT消息检索按钮的当前尺寸。

添加的字符串长度大于工具栏中当前任何字符串的字符串时,工具栏会自动重置其按钮的宽度。 宽度设置为容纳工具栏中最长的字符串。

启用自定义

工具栏具有内置的自定义功能,可通过向工具栏提供 CCS_ADJUSTABLE 常见控件样式,从而向用户提供这些功能。 用户可以通过自定义功能将按钮拖动到新位置,或通过将按钮拖出工具栏删除该按钮。 此外,用户可以双击工具栏以显示“自定义工具栏”对话框,以便添加、删除和重排工具栏按钮。 若要显示对话框,请使用 TB_CUSTOMIZE 消息。 应用程序确定自定义功能是否对用户可用,并控制用户可自定义工具栏的程度。

在自定义过程中,应用程序通常需要保存和还原工具栏的状态。 例如,许多应用程序在用户开始自定义工具栏之前存储工具栏状态,以防用户稍后希望将工具栏还原为其原始状态。 工具栏控件不会自动保留其预先自定义状态的记录。 应用程序必须保存工具栏状态才能还原它。 有关详细信息,请参阅 使用工具栏控件

启用热跟踪

热跟踪意味着指针在项目上移动时,按钮的外观将发生变化。 启用视觉样式后,工具栏默认支持热跟踪。 否则,仅使用 TBSTYLE_FLAT 样式创建的工具栏控件支持热跟踪。 可以将其他窗口样式与 TBSTYLE_FLAT 结合使用,生成启用热跟踪但与平面工具栏不同外观的工具栏。 有关详细信息,请参阅 使用工具栏控件