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






4.97/5 (137投票s)
在本文中,您将了解一个可调整的控件,它具有缩放和滚动标签、鼠标拖动、自定义绘图等等。
引言
标签可以位于子窗口的顶部或底部。用户可以使用鼠标拖动标签。控件具有缩放(缩小标签)和滚动标签模式。此外,如果只有一个标签,则可以隐藏标签区域。
控件具有 28 种内置的标签绘制样式,包括 VS2003、VS2008、VS2010 和 VS2019 的标签。所有样式的绘图都是以编程方式创建的,不需要资源。您可以通过编辑现有渲染类或创建新类来创建自己的样式。
此控件基于 CWnd
类,可以作为子窗口放置在任何地方,例如,框架或对话框的客户端区域。
Using the Code
子窗口使用它们的 HWND
添加,它们可以是任何类型,例如,非模态对话框。TabCtrl
由三个区域组成:控制区域、标签区域、窗口区域。当您创建绘图类并使用 TabCtrl
函数时,这些知识可能会对您有所帮助。
要创建控件并将元素添加到其中,您可以执行以下步骤
#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::RecalcStub
和 ITabCtrlStyle::BehaviorStub
分别为 TabCtrl::IRecalc
和 TabCtrl::IBehavior
接口的函数创建默认实现。您可以使用它们来创建自己的样式类。
在添加或删除标签以及更改其属性和状态后,控件需要调用 Update()
。
祝您好运!
历史
- 2010 年 5 月 28 日:初始版本
- 2010 年 6 月 10 日:添加了从子窗口到
TabCtrl
控件的父窗口的重定向WM_NOTIFY
消息 - 2010 年 6 月 12 日:更正了工具提示的错误显示
- 2021 年 3 月 16 日:改进了文章的来源和文本
- 2021 年 3 月 25 日:添加了一种新样式和使用鼠标滚轮滚动标签