TN031:控件条

注意

以下技术说明在首次包括在联机文档中后未更新。 因此,某些过程和主题可能已过时或不正确。 要获得最新信息,建议你在联机文档索引中搜索热点话题。

此注释描述 MFC 中的控件条类:常规 CControlBarCStatusBarCToolBarCDialogBarCDockBar

CControlBar

ControlBarCWnd 派生类,其:

  • 与框架窗口的顶端或底端对齐。

  • 可能包含为基于 HWND 的控件(例如, CDialogBar)或基于非HWND (例如, CToolBarCStatusBar)的项的子项。

控件条支持附加样式:

  • CBRS_TOP(默认值)将控件条固定到顶端。

  • CBRS_BOTTOM 将控件条固定到底端。

  • CBRS_NOALIGN 当父级重设大小时,将不会重新定位控件条。

CControlBar 派生的类提供更有趣的实现:

  • CStatusBar 一个状态栏,项是包含文本的状态栏窗格。

  • CToolBar 一个工具栏,项是行内对齐的位图按钮。

  • CDialogBar 一个像工具栏一样的框架,其中包含标准窗口控件(通过对话框模板资源创建)。

  • CDockBar 其他 CControlBar 派生对象的通用停靠区域。 此类中可用的特定成员函数和变量可能在将来的版本中发生更改。

所有控件条对象/窗口都将是某个父框架窗口的子窗口。 它们通常将作为同级添加到框架的工作区(例如,MDI 客户端或视图)。 控件条的子窗口 ID 很重要。 控件条的默认布局仅对 ID 位于 AFX_IDW_CONTROLBAR_FIRST 到 AFX_IDW_CONTROLBAR_LAST范围的控件条起作用。 请注意,即使具有 256 个控件条 ID,其中前 32 个控件条 ID 也是特定的,因为它们由打印预览体系结构直接支持。

CControlBar 类将提供具有下列作用的标准实现:

  • 将控件条对齐到框架的顶端、底端或任一端。

  • 分配控件项数组。

  • 支持派生类的实现。

C++ 控件条对象一般将作为 CFrameWnd 派生类的成员嵌入,并且将在销毁父 HWND 和对象时得到清理。 如果需要在堆上分配控件条对象,则可以将 m_bAutoDestruct 成员设置为 TRUE,以便在销毁 HWND 时使控件条调用 delete this;

注意

如果创建自己的 CControlBar派生类,而不使用 MFC 的派生类之一(如 CStatusBarCToolBarCDialogBar),则您需要设置 m_dwStyle 数据成员。 这可通过重写 Create 来完成:

// CMyControlBar is derived from CControlBar
BOOL CMyControlBar::Create(CWnd* pParentWnd,
    DWORD dwStyle,
    UINT nID)
{
    m_dwStyle = dwStyle;

.
.
.
}

控件条布局算法

控件条的布局算法非常简单。 框架窗口将一条 WM_SIZEPARENT 消息发送给控件条范围内的所有子级。 除此消息之外,还将传递指向父级矩形工作区的指针。 此信息发送给处于 Z 顺序的子级。 控件条子级使用此信息来确定自己的位置并缩减父级工作区的范围。 常规工作区剩下的最后一个矩形(小于控件条)将用于确定主要工作区窗口的位置(通常是 MDI 客户端、视图或拆分窗口)。

有关更多详细信息,请参阅 CWnd::RepositionBarsCFrameWnd::RecalcLayout

MFC 私有 Windows 消息(包括 WM_SIZEPARENT)记录在技术说明 24 中。

CStatusBar

状态栏是具有一行文本输出窗格的控件条。 使用文本输出窗格的常见方法有两种:

  • 作为消息行

    (例如,标准菜单帮助消息行)。 这些通常是通过从 0 开始编制的索引进行访问的

  • 作为状态指示器

    (例如,CAP、NUM 和 SCRL 指示器)。 这些一般按字符串/命令 ID 进行访问。

状态栏的字体为 10 磅 MS Sans Serif(由 Windows 界面应用程序设计指南或与 10 磅非等宽字体最匹配的字体映射程序指定。) 在某些 Windows 版本(如日语版本)上,所选字体不同。

状态栏使用的颜色还与 Windows 界面应用程序设计指南建议的颜色保持一致。 这些颜色未经过硬编码,将动态更改以响应控制面板中的用户自定义。

Windows 颜色值 默认 RGB
状态栏背景 COLOR_BTNFACE RGB(192, 192, 192)
状态栏文本 COLOR_BTNTEXT RGB(000, 000, 000)
状态栏上边缘/左边缘 COLOR_BTNHIGHLIGHT RGB(255, 255, 255)
状态栏下边缘/右边缘 COLOR_BTNSHADOW RGB(128, 128, 128)

CStatusBar 的 CCmdUI 支持

指示器一般是通过 ON_UPDATE_COMMAND_UI 机制进行更新的。 空闲时,状态栏将调用具有指示器窗格字符串 ID 的 ON_UPDATE_COMMAND_UI 处理程序。

ON_UPDATE_COMMAND_UI 处理程序可以调用:

  • Enable:启用或禁用此窗格。 禁用窗格看上去与启用窗格完全一样,但文本不可见(即,禁用了文本指示器)。

  • SetText:更改文本。 请慎用此设置,因为此窗格不会自动重设大小。

有关创建 和自定义 API 的详细信息,请参阅 类库参考 中的 CStatusBar CStatusBar 类。 状态栏的大部分自定义应在状态栏最初可见之前完成。

状态栏仅支持一个伸缩窗格,通常是第一个窗格。 该窗格的大小确实最小。 如果状态栏大于所有窗格的最小大小,则任何多余的宽度都将提供给此伸缩窗格。 由于第一个窗格是伸缩窗格,因此具有状态栏的默认应用程序已与 CAP、NUM 和 SCRL 的指示器右对齐。

CToolBar

工具栏是具有一行位图按钮(可能包含分隔符)的控件条。 支持两种样式的按钮:按键和复选框按钮。 单选按钮组功能可以使用复选框按钮和 ON_UPDATE_COMMAND_UI 生成。

工具栏中的所有位图按钮均来自一个位图。 此位图必须包含每个按钮的一个图像或字形。 通常图像/字形在位图中的顺序与它们在屏幕上绘制的顺序相同。 (这可以使用自定义 API 进行更改。)

每个按钮的大小必须相同。 默认值为标准的 24x22 像素。 每个图像/字形的大小必须相同,并且必须在位图中并行。 默认图像/字形大小为 16x15 像素。 因此,对于具有 10 个按钮(使用标准大小)的工具栏,您需要一个宽 160 像素、高 15 像素的位图。

每个按钮都有且只有一个图像/字形。 不同的按钮状态和样式(例如,已按、抬起、按下、已禁用、已禁用并按下、不确定)都是在算法上通过这一个图像/字形生成。 任何颜色位图或 DIB 均可在理论中使用。 如果原始图像是灰色阴影,则生成不同按钮状态的算法最适用。 有关示例,请查看 MFC 常规示例 CLIPART 中提供的标准工具栏按钮和工具栏按钮剪贴画。

工具栏使用的颜色还与 Windows 界面应用程序设计指南建议的颜色也保持一致。 这些颜色未经过硬编码,将动态更改以响应控制面板中的用户自定义。

Windows 颜色值 默认 RGB
工具栏背景 COLOR_BTNFACE RGB(192,192,192)
工具栏按钮上边缘/左边缘 COLOR_BTNHIGHLIGHT RGB(255,255,255)
工具栏按钮下边缘/右边缘 COLOR_BTNSHADOW RGB(128,128,128)

此外,将对工具栏位图按钮重新着色,如同它们是标准 Windows 按钮控件一样。 当从资源加载位图时将会进行此重新着色,从而响应“控制面板”中的用户自定义带来的系统颜色的更改。 将自动为工具栏位图中的下列颜色重新着色,因此应慎用这些颜色。 如果您不希望为位图的部分重新着色,则请使用最接近已映射 RGB 值之一的颜色。 映射是基于精确的 RGB 值完成的。

RGB 值 动态映射的颜色值
RGB(000, 000, 000) COLOR_BTNTEXT
RGB(128, 128, 128) COLOR_BTNSHADOW
RGB(192, 192, 192) COLOR_BTNFACE
RGB(255, 255, 255) COLOR_BTNHIGHLIGHT

有关创建 和自定义 API 的详细信息,请参阅 类库参考 中的 CToolBar CToolBar 类。 工具栏的大部分自定义应在工具栏最初可见之前完成。

自定义 API 可用于调整按钮 ID、样式、分隔线宽度以及什么按钮使用什么图像/字形。 默认情况下不需要使用这些 API。

CToolBar 的 CCmdUI 支持

工具栏按钮始终是通过 ON_UPDATE_COMMAND_UI 机制进行更新的。 空闲时,此工具栏将使用按钮的命令 ID 调用 ON_UPDATE_COMMAND_UI 处理程序。 将不会为分隔符调用 ON_UPDATE_COMMAND_UI,但将为按键和复选框按钮调用此处理程序。

ON_UPDATE_COMMAND_UI 处理程序可以调用:

  • Enable:启用或禁用按钮。 这对按键和复选框按钮同样起作用。

  • SetCheck:设置按钮的复选状态。 为工具栏按钮调用此会将该按钮转换为复选框按钮。 SetCheck 将采用可以为 0(未选中)、1(已选中)或 2(不确定)的参数

  • SetRadioSetCheck的速记。

复选框按钮为“自动”复选框按钮;也就是说,如果用户按它们,则它们将立即更改状态。 “已选中”是按下状态。 无内置用户界面方式将按钮更改为“不确定”状态;此操作必须通过代码来完成。

自定义 API 将允许您更改指定工具栏按钮的状态,您最好针对工具栏按钮代表的命令更改 ON_UPDATE_COMMAND_UI 处理程序中的这些状态。 记住,空闲处理将使用 ON_UPDATE_COMMAND_UI 处理程序更改工具栏按钮的状态,因此通过 SetButtonStyle 对这些状态所做的任何更改可能在下次空闲后丢失。

工具栏按钮将像常规按钮或菜单项一样发送 WM_COMMAND 消息,并且这些按钮一般将由提供 ON_UPDATE_COMMAND_UI 处理程序的同一个类中的 ON_COMMAND 处理程序进行处理。

用于显示状态的工具栏按钮样式(TBBS_ 值)有 4 种:

  • TBBS_CHECKED:复选框当前处于选中状态(按下)。

  • TBBS_INDETERMINATE:复选框的状态当前不确定。

  • TBBS_DISABLED:当前已禁用按钮。

  • TBBS_PRESSED:当前已按下按钮。

下列 TBBS 值表示的是 6 种正式的 Windows 界面应用程序设计指南按钮样式:

  • 抬起 = 0

  • 鼠标按下 = TBBS_PRESSED(| 任何其他样式)

  • 已禁用 = TBBS_DISABLED

  • 按下 = TBBS_CHECKED

  • 按下并且已禁用 = TBBS_CHECKED | TBBS_DISABLED

  • 不确定 = TBBS_INDETERMINATE

CDialogBar

对话栏是包含标准 Windows 控件的控件条。 其行为类似于一个对话框:它包含控件并且支持使用 Tab 键在控件之间进行切换。 它还使用对话框模板来表示对话栏。

CDialogBar 用于打印预览工具栏,该工具栏包含标准按键控件。

CDialogBar 的用法类似于 CFormView。 您必须定义对话栏的对话模框板并移除 WS_CHILD之外的所有样式。 请注意,对话框必须是不可见的。

CDialogBar 的控件通知将发送给控件条的父级(如工具栏按钮)。

CDialogBar 的 CCmdUI 支持

对话栏按钮应该通过 ON_UPDATE_COMMAND_UI 处理程序机制进行更新。 空闲时,对话栏将使用 ID >= 0x8000(即,在命令 ID 范围内)的所有按钮的命令 ID 调用 ON_UPDATE_COMMAND_UI 处理程序。

ON_UPDATE_COMMAND_UI 处理程序可以调用:

  • Enable:启用或禁用按钮。

  • SetText:更改按钮的文本。

自定义可通过标准窗口管理器 API 来完成。

另请参阅

按编号列出的技术说明
按类别列出的技术说明