CTRLBARS 示例:阐释自定义控件条

更新:2007 年 11 月

CTRLBARS 示例阐释控件条的各种各样的自定义选项:

  • 框架窗口中的多个控件条,通过该选项可以有选择地隐藏和显示控件条,以及沿框架窗口的边框动态重新排列控件。控件条在框架窗口中是按 Z 顺序分配空间的,Z 顺序最初是控件条的创建顺序(请参见 CMainFrame::OnCreate)。CTRLBARS 用 CWnd::SetWindowPos 函数更改对话栏的 Z 顺序。它使用 CWnd::ShowWindow 隐藏或显示控件条。每当 CTRLBARS 更改 Z 顺序或隐藏/显示控件条时,它都随后调用 CFrameWnd::RecalcLayout 以便将窗口空间重新分配给剩余的可视控件条。

  • 自定义工具栏,通过该选项可以对工具栏上的按钮进行动态重新排列,以及向工具栏添加控件(如组合框)。CTRLBARS 阐释了两种自定义工具栏的方法。第一个工具栏(即“工具栏”)在短格式(5 个按钮)与长格式(10 个按钮)之间,更改按钮的排列。CTRLBARS 对每个按钮调用 CToolBar::SetButtonInfo,以将按钮映射到工具栏位图上的平铺位置和映射到命令标识。第二个工具栏,即“样式栏”,阐释如何用控件(在本例中为组合框)替换工具栏按钮(或分隔符)。CMainFrame::CreateStyleBar 创建一个 100 像素宽的工具栏分隔符。然后它创建组合框 (IDW_COMBO) 作为工具栏的子级,并将该组合框的位置设置为占用它刚分配给分隔符的空间。

  • 自定义状态栏,通过该选项可以自定义指示符,以及向消息行发送文本。对于状态栏,如果在 indicators[ ] 数组中指定传递给 CStatusBar::SetIndicators 的标识(如 ID_INDICATOR_CAPS),则框架将自动更新 Caps Lock、Num Lock 或 Scroll Lock 指示符。CTRLBARS 阐释如何用改写 (OVR) 状态扩展标准状态栏指示符,改写 (OVR) 状态是用户通过 Insert 键切换的。这需要 ID_TOGGLE_INSERT 命令(映射为 VK_INSERT 键)的消息处理程序和在“改写”模式打开时显示的文本“OVR”的资源字符串 (ID_INDICATOR_OVR)。资源标识 ID_INDICATOR_OVR 是预定义的 MFC 常数。

  • 对话栏,它是一个布局由对话框资源模板定义的控件条。同任何控件条一样,来自对话栏中控件的通知传送到对话栏的所有者,即主框架窗口。例如,CMainFrame::OnSelChangePalette 是来自对话栏中组合框控件的 CBN_SELCHANGE 通知的处理程序。CMainFrame 还包含三个“Hide/Show”复选框中的两个(“Styles”和“Palette”)的处理程序。无需为第三个复选框“Hide/Show Toolbar”编写处理程序,因为框架为 ID_VIEW_TOOLBAR 提供标准处理程序。

  • 浮动工具调色板,其行为类似于工具栏,但显示一个二维工具按钮数组并以无模式窗口的形式在所有者框架窗口上浮动。浮动工具调色板在可重用的类 CPaletteBar(从 CToolBar 派生)中实现。从 CToolBar 派生这一事实为 CPaletteBar 提供了工具栏按钮行为。在 CPaletteBar 中实现的调色板特定的行为包括:

    • 浮动 (WS_POPUP) 窗口样式。

    • 将工具按钮以二维方式排列成行和列:创建、绘图和按钮命中测试。

    • 细(没有文本)标题栏。

    • 使用描画边框的可移动调色板。

  • CTRLBARS 还阐释如何使用 ON_COMMAND_EXON_UPDATE_COMMAND_UI_RANGE技术说明 31 中讨论了由 CTRLBARS 阐释的许多控件条自定义选项。

安全说明:

提供该示例代码是为了阐释一个概念,并不代表着最安全的编码实践,因此不应在应用程序或网站中使用该示例代码。对于超出本示例代码的预期用途以外的使用所造成的偶然或继发性损失,Microsoft 不承担任何责任。

获取示例和安装示例的说明:

  • 在 Visual Studio 的“帮助”菜单上,单击“示例”。

    有关更多信息,请参见定位示例文件

  • 示例的最新版本和完整列表可以从 Visual Studio 2008 Samples page(Visual Studio 2008 示例页面)联机获取。

  • 还可以在计算机的硬盘上查找示例。默认情况下,示例和自述文件将复制到 \Program Files\Visual Studio 9.0\Samples\ 下的文件夹中。对于 Visual Studio 速成版,所有示例都位于联机位置。

生成并运行示例

生成并运行 CTRLBARS 示例

  1. 打开解决方案 Ctrlbars.sln。

  2. 在“生成”菜单中单击“生成”。

  3. 在“调试”菜单中,单击“开始执行(不调试)”。

首次运行 CTRLBARS 时,所有不同的控件都是可见的。

  • 包含 5 个按钮的工具栏位于菜单栏的紧下方。第一个按钮(粗向上箭头)在“短格式”(5 个按钮)和“长格式”(10 个按钮)之间切换工具栏的排列。除第一个 Short/Long 按钮和用于打开“关于”框的“帮助”按钮外,其他按钮始终是不活动的。

  • 第二个工具栏位于第一个工具栏的紧下方。在这个名为“样式栏”的工具栏中可以指定下列文本对齐样式之一:“左对齐”、“居中”、“右对齐”或“两端对齐”。选择以上样式之一除了会更改“样式栏”的状态外,没有其他任何影响。

  • 状态栏位于窗口的底部。

  • 浮动调色板(包含 3 行 4 列的工具按钮数组)位于窗口的顶部。

  • 对话栏位于窗口的左边框。由于此控件条的布局是在对话框模板资源 (IDD_VIEW_SELECT) 中定义的,因此它是对话栏。

“视图”菜单允许隐藏或显示前四个控件条中的任意一个。对话栏总是可见的。“Tools”、“Styles”和“Palette”控件条的隐藏/显示状态立即反映在对话栏的“Hide/Show”复选框中。还可通过切换复选框来隐藏或显示其他控件条之一。

利用“视图”菜单上的 Dlg Bar Top 命令,可以对控件条进行重新排列,使对话栏位于控件条 Z 顺序的顶部。当对话栏位于顶部时,它沿窗口的整个左边框(菜单和标题栏除外)扩展。这两个工具栏的左端与对话栏相接。当对话栏返回到它的原始 Z 顺序位置(位于所有其他控件条之后)时,对话栏的顶部与第二个工具栏的下边缘相接,而对话栏的底部与状态栏的上边缘相接。这反映了按先到先服务的基础给控件条分配窗口空间的基本算法。

“样式”菜单允许选择下列四个文本对齐样式之一:“左对齐”、“居中”、“右对齐”或“两端对齐”。所做的任何选择都立即反映在“样式栏”的组合框和相应的按钮中。同样,既可以通过在“样式栏”的组合框中选择某个样式,也可以通过按四个按钮之一来进行选择。新选择立即反映在其他控件的状态和“Style”菜单中。

“Palette”菜单允许将调色板的工具排列方式从 3 行 4 列改为 2 行 6 列。

当从“Palette”中选择一个工具时,状态栏消息行显示“You have selected the <type> tool”,其中 <type> 指示选择了 12 个工具中的哪一个。此选择反映在对话栏的组合框中。也可以使用此组合框选择工具。

状态栏除了显示最近选择的工具外,还显示 Ins、Caps Lock 和 Num Lock 这三个键的状态。

关键字

此示例说明以下关键字:

AfxFormatString1; AfxGetApp; AfxIsValidAddress; AfxRegisterWndClass; AfxThrowResourceException; BitBlt; CBrush::CreateSolidBrush; CCmdUI::ContinueRouting; CCmdUI::Enable; CCmdUI::SetCheck; CCmdUI::SetText; CComboBox::AddString; CComboBox::Create; CComboBox::GetCurSel; CComboBox::GetLBText; CComboBox::SetCurSel; CControlBar::GetBarStyle; CControlBar::SetBarStyle; CDC::Attach; CDC::Detach; CDC::PatBlt; CDC::RectVisible; CDialogBar::Create; CDumpContext::GetDepth; CFont::CreateFontIndirect; CFrameWnd::LoadFrame; CFrameWnd::RecalcLayout; CFrameWnd::SetMessageText; CGdiObject::Attach; CObject::AssertValid; CObject::Dump; CRect::Height; CRect::InflateRect; CRect::SetRectEmpty; CRect::Width; CStatusBar::Create; CStatusBar::GetPaneInfo; CStatusBar::SetIndicators; CStatusBar::SetPaneInfo; CString::LoadString; CToolBar::CToolBar; CToolBar::CommandToIndex; CToolBar::Create; CToolBar::GetButtonInfo; CToolBar::GetItemID; CToolBar::GetItemRect; CToolBar::LoadBitmap; CToolBar::SetButtonInfo; CToolBar::SetButtons; CToolBar::SetHeight; CToolBar::SetSizes; CWinApp::InitInstance; CWinApp::OnIdle; CWnd::ClientToScreen; CWnd::CreateEx; CWnd::GetCapture; CWnd::GetClientRect; CWnd::GetDC; CWnd::GetDlgItem; CWnd::GetOwner; CWnd::GetParentFrame; CWnd::GetSafeHwnd; CWnd::GetStyle; CWnd::GetWindowRect; CWnd::Invalidate; CWnd::InvalidateRect; CWnd::OnCancelMode; CWnd::OnCreate; CWnd::OnLButtonDown; CWnd::OnMouseActivate; CWnd::OnMouseMove; CWnd::OnSysColorChange; CWnd::PreCreateWindow; CWnd::ReleaseDC; CWnd::SendMessage; CWnd::SetCapture; CWnd::SetFont; CWnd::SetWindowPos; CWnd::ShowWindow; CWnd::UpdateDialogControls; CWnd::UpdateWindow; CreateBitmap; CreateCompatibleBitmap; CreateCompatibleDC; CreateDIBitmap; CreatePatternBrush; CreatePen; CreateSolidBrush; DeleteDC; DeleteObject; FillRect; FindResource; FrameRect; FreeResource; GetActiveWindow; GetBValue; GetCapture; GetDC; GetDeviceCaps; GetGValue; GetNextWindow; GetObjectType; GetParent; GetRValue; GetStockObject; GetSysColor; GetSystemMetrics; GetVersion; GetWindow; HIBYTE; InvertRect; LOBYTE; LoadCursor; LoadIcon; LoadResource; LockResource; MAKEINTRESOURCE; OffsetRect; PatBlt; RGB; ReleaseCapture; ReleaseDC; SelectObject; SendMessage; SetActiveWindow; SetBkColor; SetCapture; SetROP2; SetRect; SetTextColor; StretchDIBits; UpdateWindow; free; lstrcpy; malloc; memcpy; memset

说明:

某些示例(如此示例)尚未经过修改以反映 Visual C++ 向导、库和编译器中所做的更改,但仍演示了如何完成所需的任务。

请参见

其他资源

MFC 示例