注释
自联机文档中首次包含此说明以来,尚未更新以下技术说明。 因此,某些过程和主题可能过期或不正确。 有关最新信息,建议在在线文档索引中搜索您感兴趣的主题。
此说明介绍 MFC 中的控件栏类:常规 CControlBar、CStatusBar、CToolBar、CDialogBar 和CDockBar
。
CControlBar
A ControlBar
是一个 CWnd
派生类,它:
与框架窗口的顶部或底部对齐。
可能包含基于 HWND 的控件(例如
CDialogBar
)或非HWND
基于项的子项(例如,CToolBar
)。CStatusBar
控件栏支持其他样式:
CBRS_TOP(默认值)将控件栏固定到顶部。
CBRS_BOTTOM将控制栏固定到底部。
CBRS_NOALIGN父重设大小时不要重新定位控件栏。
派生自 CControlBar
的类提供更有趣的实现:
CStatusBar
状态栏,项是包含文本的状态栏窗格。CToolBar
工具栏中的项是一行中对齐的位图按钮。CDialogBar
一个类似工具栏的框架,包含标准窗口控件(从对话框模板资源创建)。CDockBar
其他CControlBar
派生对象的通用停靠区域。 此类中提供的特定成员函数和变量在未来版本中可能会更改。
所有控件栏对象/窗口都是某些父框架窗口的子窗口。 它们通常作为同级添加到帧的工作区(例如 MDI 客户端或视图)。 控件栏的子窗口 ID 非常重要。 控件栏的默认布局仅适用于AFX_IDW_CONTROLBAR_FIRST范围中 ID 为AFX_IDW_CONTROLBAR_LAST的控制栏。 请注意,尽管有 256 个控制栏 ID 的范围,但这些控制栏 ID 的前 32 个是特殊的,因为它们直接受打印预览体系结构支持。
该 CControlBar
类为以下项提供标准实现:
将控件栏与框架的顶部、底部或任一侧对齐。
分配控件项数组。
支持派生类的实现。
C++控件栏对象通常嵌入为派生类的成员 CFrameWnd
,并在销毁父 HWND
对象和对象时进行清理。 如果需要在堆上分配控件栏对象,只需将m_bAutoDestruct成员设置为 TRUE,以使控件栏在销毁时HWND
调用delete this;
。
注释
如果创建自己的CControlBar
派生类,而不是使用 MFC 的派生类之一,或者CDialogBar
CStatusBar
CToolBar
,需要设置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::RepositionBars
并 CFrameWnd::RecalcLayout
了解更多详细信息。
技术说明 24 中记录了 MFC 专用 Windows 消息(包括WM_SIZEPARENT)。
CStatusBar
状态栏是包含一行文本输出窗格的控制栏。 使用文本输出窗格有两种常见方法:
作为消息行
(例如,标准菜单帮助消息行)。 这些通常由基于 0 的索引访问
作为状态指示器
(例如 CAP、NUM 和 SCRL 指示器)。 这些通常通过字符串/命令 ID 进行访问。
状态栏的字体为 10 磅 MS Sans Serif (由 Windows 界面应用程序设计指南或字体映射器最匹配的 10 磅瑞士比例字体)。 在某些版本的 Windows(如日语版)上,所选字体不同。
状态栏中使用的颜色也与 Windows 界面应用程序设计指南的建议一致。 这些颜色不是硬编码的,在响应控制面板中的用户自定义时动态更改。
条目 | Windows COLOR 值 | 默认 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 COLOR 值 | 默认 RGB |
---|---|---|
ToolBar 背景 | COLOR_BTNFACE | RGB(192,192,192) |
工具栏按钮顶部/左边缘 | COLOR_BTNHIGHLIGHT | RGB(255,255,255) |
ToolBar 按钮机器人/右边缘 | COLOR_BTNSHADOW | RGB(128,128,128) |
此外,工具栏位图按钮重新着色,就像它们是标准 Windows 按钮控件一样。 当从资源加载位图并响应系统颜色更改以响应控制面板中的用户自定义时,会发生此重新着色。 工具栏位图中的以下颜色将自动重新着色,因此应谨慎使用它们。 如果不想重新着色一部分位图,请使用几乎接近其中一个映射 RGB 值的颜色。 映射基于确切的 RGB 值完成。
RGB 值 | 动态映射的 COLOR 值 |
---|---|
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(不确定)的参数SetRadio
:简写。SetCheck
复选框按钮为“自动”复选框按钮;也就是说,当用户按下它们时,他们将立即更改状态。 检查是向下或沮丧的状态。 没有内置用户界面方法,无法将按钮更改为“不确定”状态;必须通过代码完成。
自定义 API 允许更改给定工具栏按钮的状态,最好在工具栏按钮所表示的命令的ON_UPDATE_COMMAND_UI处理程序中更改这些状态。 请记住,空闲处理将使用 ON_UPDATE_COMMAND_UI 处理程序更改工具栏按钮的状态,因此通过 SetButtonStyle 对这些状态所做的任何更改可能会在下次空闲后丢失。
工具栏按钮将发送WM_COMMAND消息,如普通按钮或菜单项,通常由提供ON_UPDATE_COMMAND_UI处理程序的同一类中的ON_COMMAND处理程序处理。
有四种工具栏按钮样式(TBBS_值)用于显示状态:
TBBS_CHECKED:复选框当前已选中(关闭)。
TBBS_INDETERMINATE:复选框当前不确定。
TBBS_DISABLED:按钮当前已禁用。
TBBS_PRESSED:按钮当前已按下。
六种官方 Windows 界面应用程序设计指南按钮样式由以下 TBBS 值表示:
Up = 0
鼠标向下 = TBBS_PRESSED (| 任何其他样式)
Disabled = TBBS_DISABLED
Down = TBBS_CHECKED
已禁用 = TBBS_CHECKED |TBBS_DISABLED
不确定 = TBBS_INDETERMINATE
CDialogBar
对话框栏是包含标准 Windows 控件的控件栏。 它的作用类似于对话,因为它包含控件并支持在控件之间进行制表符。 它还像对话一样,它使用对话模板来表示条形图。
A CDialogBar
用于打印预览工具栏,其中包含标准推送按钮控件。
使用 a CDialogBar
就像使用 .CFormView
必须为对话框栏定义对话框模板,并删除除WS_CHILD以外的所有样式。 请注意,对话框不得可见。
控件 CDialogBar
通知将发送到控件栏的父级(就像工具栏按钮一样)。
CCmdUI 对 CDialogBar 的支持
应通过ON_UPDATE_COMMAND_UI处理程序机制更新对话框栏按钮。 在空闲时,对话框栏将使用 ID >= 0x8000(即命令 ID 范围内)的所有按钮的命令 ID 调用ON_UPDATE_COMMAND_UI处理程序。
ON_UPDATE_COMMAND_UI处理程序可以调用:
启用:启用或禁用按钮。
SetText:更改按钮的文本。
可以通过标准窗口管理器 API 完成自定义。