65.9K
CodeProject 正在变化。 阅读更多。
Home

TabCtrl - 可调节的带缩放和滚动选项卡的控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.97/5 (137投票s)

2010 年 5 月 29 日

公共领域

2分钟阅读

viewsIcon

236031

downloadIcon

22927

在本文中,您将了解一个可调整的控件,它具有缩放和滚动标签、鼠标拖动、自定义绘图等等。

Sample Image

引言

标签可以位于子窗口的顶部或底部。用户可以使用鼠标拖动标签。控件具有缩放(缩小标签)和滚动标签模式。此外,如果只有一个标签,则可以隐藏标签区域。

控件具有 28 种内置的标签绘制样式,包括 VS2003、VS2008、VS2010 和 VS2019 的标签。所有样式的绘图都是以编程方式创建的,不需要资源。您可以通过编辑现有渲染类或创建新类来创建自己的样式。

此控件基于 CWnd 类,可以作为子窗口放置在任何地方,例如,框架或对话框的客户端区域。

Using the Code

子窗口使用它们的 HWND 添加,它们可以是任何类型,例如,非模态对话框。TabCtrl 由三个区域组成:控制区域、标签区域、窗口区域。当您创建绘图类并使用 TabCtrl 函数时,这些知识可能会对您有所帮助。

Sample Image

要创建控件并将元素添加到其中,您可以执行以下步骤

#include "TabCtrl.h"

TabCtrlEx<TabCtrlStyle_VS2019_client_light> m_TabCtrl;
CListCtrl m_List1, m_List2;

...

// Creation and initialization of TabCtrl.
if( !m_TabCtrl.Create(this,WS_CHILD | WS_VISIBLE,CRect(0,0,0,0),ID_TabCtrl) )
    return -1;    // error.

// Creation of ImageList with icons for buttons (close, menu, scroll) and for tabs.
if( !m_TabCtrl.CreateSystemImage(NULL,IDB_IMAGES_SYSTEM,true,14) ||
    !m_TabCtrl.CreateImage(NULL,IDB_IMAGES_TAB_NORMAL,IDB_IMAGES_TAB_DISABLE,true,16) )
    return -1;    // error.

// Creation of child windows.
if( !m_List1.Create(WS_CLIPCHILDREN | LVS_REPORT,CRect(0,0,0,0),&m_TabCtrl,ID_List1) ||
    !m_List2.Create(WS_CLIPCHILDREN | LVS_REPORT,CRect(0,0,0,0),&m_TabCtrl,ID_List2) )
    return -1;    // error.
m_List1.InsertColumn(0,"Mail",LVCFMT_LEFT,100);
m_List2.InsertColumn(0,"Calendar",LVCFMT_LEFT,100);

// Attaching of child windows to the TabCtrl.
if( !m_TabCtrl.Add(m_List1,"Mail",0) ||
    !m_TabCtrl.Add(m_List2,"Calendar",1) )
    return -1;    // error.

// Load state from registry and update.
m_TabCtrl.LoadState(AfxGetApp(),"TabCtrl","State");
m_TabCtrl.Update();

TabCtrl 不执行任何渲染。对于它的绘制,它调用 TabCtrl::Draw 接口的函数。要绘制 TabCtrl,您需要创建一个继承自 TabCtrl::Draw 类的对象,实现它的函数,并使用 TabCtrl::SetDrawManager 函数调用将 TabCtrl::Draw 指针传递给 TabCtrl

类似地,TabCtrl::IRecalc 接口用于指定 TabCtrl 区域之间的大小和间距。TabCtrl::IBehavior 接口将帮助您调整 TabCtrl 的行为,TabCtrl::ToolTip 将帮助您为标签和按钮创建工具提示。还有一个 TabCtrl::Ability 类用于设置单击按钮的能力,以及一个 TabCtrl::Notify 类用于通知 TabCtrl 中的事件。

如果您实现了上述任何接口,那么此实现必须在控件运行的整个时间内存在。如果您只使用一种样式,则使用模板类 TabCtrlEx。样式类的名称指定为模板参数,例如

TabCtrlEx<TabCtrlStyle_VS2003_client> m_TabCtrl;

已经创建了一些样式。例如,类似于 Visual Studio 2003、2008、2010 和 2019 中的停靠/浮动面板的样式。有关所有现有样式类的列表,请参见 DemoDlg.h 文件中的 TabCtrlComplex 类。

ITabCtrlStyle::RecalcStubITabCtrlStyle::BehaviorStub 分别为 TabCtrl::IRecalcTabCtrl::IBehavior 接口的函数创建默认实现。您可以使用它们来创建自己的样式类。

在添加或删除标签以及更改其属性和状态后,控件需要调用 Update()

祝您好运!

历史

  • 2010 年 5 月 28 日:初始版本
  • 2010 年 6 月 10 日:添加了从子窗口到 TabCtrl 控件的父窗口的重定向 WM_NOTIFY 消息
  • 2010 年 6 月 12 日:更正了工具提示的错误显示
  • 2021 年 3 月 16 日:改进了文章的来源和文本
  • 2021 年 3 月 25 日:添加了一种新样式和使用鼠标滚轮滚动标签
© . All rights reserved.