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

自定义选项卡控件、选项卡式框架和选项卡式 MDI

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.90/5 (137投票s)

2002 年 6 月 14 日

22分钟阅读

viewsIcon

1781854

downloadIcon

35598

一个可扩展的框架,用于在 ATL/WTL 中创建自定义选项卡,包含类似 VS.NET 的选项卡控件实现、选项卡式框架、选项卡式 MDI 等。

引言

在 Beta 2 发布后,我第一次看到了新的 Microsoft Visual Studio .NET。其中给我留下深刻印象的是选项卡看起来多么漂亮。它最终还包括了一个选项卡式 MDI。

此后不久,我发现了 Bjarke Viksøe 的 酷选项卡控件。我对“DotNetTabCtrl”特别感兴趣。Bjarke 很快链接到 Pascal Binggeli 的更新版本,该版本支持选项卡显示图像。这两个版本都有一些小问题,但是当我检查代码时,它似乎是一个优秀的构建基础。

从 Pascal 的更新开始,我开始进行自己的更新。最初的更新包括在选项卡之间添加分隔线,调整布局以更接近 VS.NET,添加用于选项卡式 MDI 的选项卡控件实现,以及添加其他改进。起初,我尝试对基本 CCustomTabCtrl 进行最小的更改。我最终开始甚至演变基本的 CCustomTabCtrl,以适应我对它的愿景。

自定义选项卡控件

CCustomTabCtrl 是基础的、模板化的 ATL::CWindowImpl 派生类,用于帮助实现自定义选项卡控件窗口。绘制采用双缓冲,实现无闪烁绘图。客户端从不直接使用此 C++ 类,而是使用从它派生的类。开箱即用地提供了少量从 CCustomTabCtrl 派生的选项卡控件。

  • DotNetTabCtrl.h”中的 CDotNetTabCtrl

    由 Daniel Bowen 编写。选项卡控件具有 VS.NET 选项卡的外观和感觉。用于 MDI 选项卡、窗格窗口选项卡等。

  • DotNetTabCtrl.h”中的 CDotNetButtonTabCtrl

    由 Daniel Bowen 编写。具有 VS.NET 样式按钮选项卡的选项卡控件(看起来像 VS.NET 中带有设计/HTML 按钮的 HTML 视图)。

  • SimpleTabCtrls.h”中的 CButtonTabCtrl,“SimpleDlgTabCtrls.h”中的 CButtonTabCtrl

    由 Bjarke Vikøe 编写,由 Daniel Bowen 更新以适应新的 CCustomTabCtrl。按钮样式选项卡。“DlgTabCtrl”版本旨在子类化现有的静态控件。

  • SimpleTabCtrls.h”中的 CFolderTabCtrl,“SimpleDlgTabCtrls.h”中的 CFolderTabCtrl

    由 Bjarke Vikøe 编写,由 Daniel Bowen 更新以适应新的 CCustomTabCtrl。梯形文件夹选项卡,类似于 Visual Studio 6 输出窗格中使用的选项卡。“DlgTabCtrl”版本旨在子类化现有的静态控件。

  • SimpleTabCtrls.h”中的 CSimpleDotNetTabCtrl,“SimpleDlgTabCtrls.h”中的 CSimpleDotNetTabCtrl

    由 Bjarke Vikøe 编写,由 Daniel Bowen 更新以适应新的 CCustomTabCtrl。这本质上是 Bjarke 最初的“CDotNetTabCtrl”的扁平选项卡外观。“DlgTabCtrl”版本旨在子类化现有的静态控件。

CCustomTabCtrl 派生选项卡控件旨在与其他通用控件(如列表视图(SysListView32)和树视图(SysTreeView32))类似地工作。已经有一个现有的选项卡控件(SysTabControl32),它是一个通用控件。那么为什么我们需要 CCustomTabCtrl 呢?因为它有一些难以实现的自定义。SysTabControl32 最初是为了在 Windows 95 及更高版本中实现任务栏而创建的(就像 SysListView32SysTreeView32 最初是为了 Windows 资源管理器而创建的)。SysTabControl32 缺少其他通用控件具有的几个功能,例如自定义绘图、插入和删除通知、位置位移等。

自定义选项卡项

CCustomTabCtrl 派生选项卡控件和 Windows 通用控件之间的区别之一是项目管理方式。通用控件旨在与任何可以处理结构和窗口编程的客户端一起使用——从 x86 汇编到 Visual Basic。大多数通用控件中的“项目”是一个结构。要获取和设置项目,您需要用一个掩码填充一个结构,以标识您感兴趣的字段。这种设计决策有几个副作用。一是经常发生比实际需要更多的“内存复制”,尤其是在获取和设置文本时。另一个是无法很好地知道特定字段是否实际在使用。另一个影响是,任何用户数据总是被放入这些结构之一的“LPARAM”中,并被强制转换为真实数据类型。

CCustomTabCtrl 采用不同的方法,允许您使用任何 C 结构或 C++ 类作为提供所需接口的项目。开箱即用提供了两个这样的类——CCustomTabItemCTabViewTabItem。结构或类的类型是选项卡控件类上的模板参数。如果您想使用选项卡控件,并拥有自己的类实例作为选项卡项,最简单的方法是继承自 CCustomTabItemCTabViewTabItem,并扩展它以提供您需要的额外功能,然后将这个新类指定为参数。要查看所需的接口,只需查看 CCustomTabItem

使用自定义选项卡控件

基于 CCustomTabCtrl 的选项卡控件旨在用作独立窗口,或子类化对话框上现有控件(如静态控件)。选项卡控件的父级负责创建、销毁、调整大小和定位选项卡控件窗口,使其与其他子窗口适当对齐。

根据您使用的自定义选项卡控件,它可能依赖于某些系统指标来确定要使用的颜色和字体。如果用户更改这些系统指标(例如,通过更改显示控制面板“外观”选项卡上的项目),选项卡控件可以拾取这些更改——但前提是您将 WM_SETTINGCHANGE 从主框架传播到选项卡控件。这可以通过在主框架中处理 WM_SETTINGCHANGE,然后调用 CWindow::SendMessageToDescendants 或等效代码来完成。请参阅随附的示例应用程序以获取示例。

本文提供的示例演示了如何将这些选项卡控件用作独立窗口,用于在子“视图”窗口之间切换,一次只显示一个子视图。

有关如何为选项卡式 MDI 使用自定义选项卡控件的简单示例,请参阅“SimpleTabbedMDIDemo”示例。在此示例中,WTL 向导运行以创建一个默认的 MDI 应用程序。将 CMainFrame 继承自 CMDIFrameWindowImpl 更改为继承自 CTabbedMDIFrameWindowImpl。将 CMDICommandBarCtrl 更改为 CTabbedMDICommandBarCtrl。然后在每个 MDI 子框架中,继承自 CTabbedMDIChildWindowImpl 而不是 CMDIChildWindowImpl

“TabDemo”示例也使用选项卡式 MDI,但此外还有一个“弹出工具窗口框架”,它使用 CDotNetTabCtrl 在子视图之间切换。它还使用 CDotNetButtonTabCtrl 为子框架在 HTML 视图和编辑视图(HTML 源代码)之间切换。

“DockingDemo”示例展示了如何将这些自定义选项卡控件与 Sergey Klimov 的 WTL Docking Windows 集成。我已获得许可,提供了他的停靠窗口的源代码。但是 - 请务必从他那里获取最新更新!在文件“TabbedDockingWindow.h”中,有一个类 CTabbedDockingWindow 继承自 CTabbedFrameImpl 和 Sergey 的 CTitleDockingWindowImpl

“TabbedSDISplitter”示例展示了在 SDI 应用程序中使用拆分器,右侧窗口“选项卡化”以显示多个视图。有关在 SDI 应用程序中以略微不同方式使用这些选项卡的另一个示例,请参阅 Sergey Klimov 的 WTL Docking Windows 中的“SDITabbedSample”以及 Igor Katrayev 的工作。

自定义选项卡控件也应该可以与其他停靠框架、拆分器等集成。只要时间允许,我将尝试提供更多示例应用程序。

选项卡式框架

TabbedFrame.h 包含使框架窗口从只有一个“视图”变为具有自定义选项卡控件的选项卡式框架窗口变得简单的类,以便在多个视图之间切换。其中包括以下类:

  • CCustomTabOwnerImpl - MI 类,有助于实现实际自定义选项卡控件窗口的父级。该类本身没有消息映射,旨在与 CWindowImpl 派生类一起继承。该类处理选项卡窗口的创建,以及根据 HWND 添加、删除、切换和重命名选项卡。
  • CTabbedFrameImpl - 基础模板,用于派生您的专用框架窗口类,以获得具有多个“视图”子窗口的框架窗口,您可以使用自定义选项卡控件(例如 CDotNetTabCtrl)在这些子窗口之间切换。
  • CTabbedPopupFrame - 从 CTabbedFrameImpl 派生的简单类,适用于实现选项卡式“弹出框架”工具窗口,带有一个或多个视图。请参阅“TabDemo”示例以获取使用此类的示例。
  • CTabbedChildWindow - 从 CTabbedFrameImpl 派生的简单类,适用于实现选项卡式子窗口,带有一个或多个视图。请参阅“TabbedSDISplitter”示例以获取使用此类的示例。

选项卡式 MDI

TabbedMDI.h 包含一些类,用于帮助使用自定义选项卡控件实现选项卡式 MDI。实现选项卡式 MDI 有多种方法。这里使用的方法是子类化操作系统自带的“MDIClient”,并要求每个 MDI 子框架继承自一个特殊类 CTabbedMDIChildWindowImpl(而不是通常的 CMDIChildWindowImpl)。其中包括以下类:

  • CTabbedMDIFrameWindowImpl - 您可以将 CMainFrame 继承自 CTabbedMDIFrameWindowImpl,而不是 CMDIFrameWindowImpl。对于一个开箱即用的 WTL MDI 应用程序,有三个 CMDIFrameWindowImpl 实例需要替换为 CTabbedMDIFrameWindowImpl
  • CTabbedMDIChildWindowImpl - 如果您希望您的 MDI 子窗口在 MDI 选项卡窗口中有一个相应的选项卡,请继承自此 C++ 类而不是 CMDIChildWindowImpl。此 C++ 类还提供了几个不错的附加功能:
    • 当子框架创建时,如果先前活动的 MDI 子窗口已最大化,则新窗口也将最大化。
    • 您的子框架类可以指定 WS_MAXIMIZE,以便它强制在开始时就最大化。
    • 提供了 SetTitle 方法来设置框架标题(以及可能相应的 MDI 选项卡文本)。
    • SetTabText 方法允许您设置相应 MDI 选项卡的文本,无论框架标题(窗口文本)是什么。
    • SetTabToolTip 方法允许您设置相应 MDI 选项卡的工具提示文本。
    • 您的派生类可以处理消息 UWM_MDICHILDSHOWTABCONTEXTMENU 以显示相应 MDI 选项卡的上下文菜单。默认上下文菜单是窗口的系统菜单。
  • CTabbedMDIClient - CTabbedMDIFrameWindowImpl 包含 CTabbedMDIClient,它子类化“MDI 客户端”窗口(来自操作系统,管理 MDI 子窗口)。它处理选项卡窗口的大小/定位,为具有活动子窗口的 HWND 的选项卡调用适当的 Display、Remove、UpdateText 等。您可以在不使用 CTabbedMDIFrameWindowImpl 的情况下使用 CTabbedMDIClient。为此,只需在您的主框架类中调用 CreateMDIClient 后,在 CTabbedMDIClient 成员变量上调用 SetTabOwnerParent(m_hWnd),然后调用 SubclassWindow(m_hWndMDIClient)
  • CMDITabOwner - MDITabOwner 是实际选项卡窗口(例如 CDotNetTabCtrl)的父级,并且是“MDI 客户端”窗口的同级。选项卡所有者在何时为选项卡显示上下文菜单时通知 MDI 子级(默认菜单是窗口的系统菜单)。当活动选项卡更改时,选项卡所有者会更改活动的 MDI 子级。它还执行隐藏和显示选项卡的实际工作。它还处理根据 HWND 添加、删除和重命名选项卡。
  • CTabbedMDICommandBarCtrl - 在您的 MDI 应用程序中,使用 CTabbedMDICommandBarCtrl 而不是 CMDICommandBarCtrl。它解决了 WTL 7.0 CMDICommandBarCtrl 中的几个错误,并允许您在子窗口最大化时启用或禁用是否要在命令栏中看到文档图标和最小化/最大化/关闭按钮。

致以前的用户

我最初将我的“DotNetTabCtrl”代码版本发布到 WTL 邮件列表网站 groups.yahoo.com 和 Bjarke Viksøe。如果您使用了从这两个地方下载的先前版本,那么只需对您的客户端代码进行几次更新以适应我所做的更新:

  • 而不是
    #include "CoolTabCtrls.h"

    现在你需要

    #include "CustomTabCtrl.h"
    #include "DotNetTabCtrl.h"
    // (include other versions of tab controls)
  • 不再调用 SetBoldSelectedTab,而是使用 CTCS_BOLDSELECTEDTAB 样式。
  • 通知不再以“TCN_”开头,现在以“CTCN_”开头(它们在重叠时与选项卡控件“TCN_”通知的数值相同)。
  • 不再使用以“TCS_”开头的选项卡控件样式,而是使用以“CTCS_”开头的自定义选项卡控件样式(它们在重叠时与选项卡控件“TCS_”样式的数值相同)。
  • 使用 CTCHITTESTINFO 而不是 TCHITTESTINFO
  • 与选项卡相关的类现在接受数据项类型的模板参数。
  • 如果您继承自 CCustomTabCtrlCDotNetTabCtrlImpl 或其他类,则会有一些其他的接口更改,希望能够显而易见地解决(否则会出现编译错误)。
  • 有关本文发布之前的文件历史,请参考以前的历史

自定义选项卡控件参考

要求

  • ATL 3.0、7.0 或 7.1
  • WTL 7.1

样式

  • CTCS_SCROLL - 这将启用“滚动按钮”。当选项卡项目无法获得所需的全部空间时,它们会溢出,并且该侧的滚动按钮将被启用。您可以调用 Get/SetScrollDeltaGet/SetScrollRepeat 方法来调整滚动量以及按住按钮时滚动重复的速度。
  • CTCS_BOTTOM - 如果设置了此样式,则选项卡窗口旨在显示在客户端区域的底部。否则,它旨在显示在客户端区域的顶部。选项卡窗口的父级有责任遵守此样式。
  • CTCS_CLOSEBUTTON - 这将启用一个“关闭”按钮。当单击此按钮时,父级会收到“CTCN_CLOSE”通知。
  • CTCS_HOTTRACK - 启用热追踪选项卡项目。如果您的目标是 Windows 2000/98 或更高版本,请务必在包含此文件(通常在预编译头文件中)之前 #define WINVER 和/或 _WIN32_WINNT 为 0x0500 或更高,以便使用新的“COLOR_HOTLIGHT”。

    注意:如果您指定 CTCS_SCROLLCTCS_CLOSEBUTTON,则无论此样式如何,这些按钮始终会被热追踪。

  • CTCS_FLATEDGE - 从 CCustomTabCtrl 派生的选项卡控件可以使用此样式来确定是否以扁平外观绘制控件轮廓。
  • CTCS_DRAGREARRANGE - 如果您设置此样式,则可以在同一选项卡控件中将选项卡项拖动到另一个位置。
  • CTCS_BOLDSELECTEDTAB - 选定选项卡的文本以选项卡字体的粗体版本呈现。
  • CTCS_TOOLTIPS - 启用工具提示显示。每个项目的工具提示默认为选项卡文本,但可以通过调用选项卡项上的 SetToolTip 进行调整。

Notifications

这些消息以 WM_NOTIFY 消息的形式发送到选项卡控件窗口的父级。

  • NM_CLICK - 在按下鼠标左键时通知选项卡控件的父窗口。消息的 lParam 是指向 NMCTCITEM 结构的指针,其中 iItem 是光标所在项目的索引,如果光标不在任何项目上方,则为 -1。在处理程序中,返回 TRUE 以阻止默认处理,或返回 FALSE 以允许默认处理。默认处理会选择光标下的项目。单击滚动或关闭按钮时不会发送此通知。
  • NM_DBLCLK - 在鼠标左键双击时通知选项卡控件的父窗口。消息的 lParam 是指向 NMCTCITEM 结构的指针,其中 iItem 是光标所在项目的索引,如果光标不在任何项目上方,则为 -1。在处理程序中,返回 TRUE 以阻止默认处理,或返回 FALSE 以允许默认处理。
  • NM_RCLICK - 在按下鼠标右键时通知选项卡控件的父窗口。消息的 lParam 是指向 NMCTCITEM 结构的指针,其中 iItem 是光标所在项目的索引,如果光标不在任何项目上方,则为 -1。在处理程序中,返回 TRUE 以阻止默认处理,或返回 FALSE 以允许默认处理。默认处理会选择光标下的项目。
  • NM_RDBLCLK - 在鼠标右键双击时通知选项卡控件的父窗口。消息的 lParam 是指向 NMCTCITEM 结构的指针,其中 iItem 是光标所在项目的索引,如果光标不在任何项目上方,则为 -1。在处理程序中,返回 TRUE 以阻止默认处理,或返回 FALSE 以允许默认处理。
  • NM_CUSTOMDRAW - 通知选项卡控件的父窗口有关绘图操作的信息。消息的 lParam 是指向 NMCTCCUSTOMDRAW 结构的指针。有关自定义绘图如何与通用控件一起工作的一般说明,请参阅 MSDN 文章“自定义控件外观”。在大多数情况下,自定义选项卡控件非常相似(特别是与自定义绘制工具栏控件)。唯一的区别是 NMCTCCUSTOMDRAW 结构允许您为非活动和选定项目设置 HFONT,而不是在每个 CDDS_ITEMPREPAINT 上将项目的字体选择到设备上下文中并返回 CDRF_NEWFONT(您仍然可以在每个 CDDS_ITEMPREPAINT 上更改 HFONT,或者您可以在 CDDS_PREPAINT 通知中设置它)。
  • CTCN_FIRST - 第一个自定义选项卡控件通知代码的值。
  • CTCN_LAST - 最后一个自定义选项卡控件通知代码的值。如果派生类想要定义自己的消息,它可以使用 CTCN_LAST - 1CTCN_LAST - 2 等。
  • CTCN_SELCHANGE - 通知选项卡控件的父窗口当前选定的选项卡已更改。消息的 lParam 是指向 NMCTC2ITEMS 结构的指针,其中 iItem1 是旧的选定项目,iItem2 是要选择的新项目。
  • CTCN_SELCHANGING - 通知选项卡控件的父窗口当前选定的选项卡即将更改。消息的 lParam 是指向 NMCTC2ITEMS 结构的指针,其中 iItem1 是旧的选定项目,iItem2 是要选择的新项目。消息的接收者应返回 TRUE 以阻止选择更改,或返回 FALSE 以允许选择更改。
  • CTCN_INSERTITEM - 通知选项卡控件的父窗口已插入一个项目。消息的 lParam 是指向 NMCTCITEM 结构的指针,其中 iItem 是插入项目的索引。
  • CTCN_DELETEITEM - 通知选项卡控件的父窗口即将删除一个项目。消息的 lParam 是指向 NMCTCITEM 结构的指针,其中 iItem 是要删除项目的索引。消息的接收者应返回 TRUE 以阻止删除,或返回 FALSE 以允许删除。
  • CTCN_MOVEITEM - 通知选项卡控件的父窗口已通过“MoveItem”调用将项目移动到另一个索引。消息的 lParam 是指向 NMCTC2ITEMS 结构的指针,其中 iItem1 是旧索引,iItem2 是新索引。
  • CTCN_SWAPITEMPOSITIONS - 通知选项卡控件的父窗口已通过“SwapItemPositions”调用交换了两个项目的位置。消息的 lParam 是指向 NMCTC2ITEMS 结构的指针,其中 iItem1 是第一个项目的索引,iItem2 是第二个项目的索引。
  • CTCN_CLOSE - 通知选项卡控件的父窗口“关闭”按钮已被单击。关闭按钮仅在设置了 CTCS_CLOSEBUTTON 的选项卡控件中显示。
  • CTCN_BEGINITEMDRAG - 通知选项卡控件的父窗口选项卡项拖动已开始。消息的 lParam 是指向 NMCTCITEM 结构的指针,其中 iItem 是正在拖动的项目的索引。
  • CTCN_ACCEPTITEMDRAG - 通知选项卡控件的父窗口选项卡项拖动已结束并被用户接受。消息的 lParam 是指向 NMCTC2ITEMS 结构的指针,其中 iItem1 是项目在其原始位置的索引,iItem2 是项目的新索引。
  • CTCN_CANCELITEMDRAG - 通知选项卡控件的父窗口选项卡项拖动已结束并被用户取消。消息的 lParam 是指向 NMCTCITEM 结构的指针,其中 iItem 是正在拖动的项目的索引。

结构体

  • NMCTCITEM -
    • NMHDR hdr; - 通用通知信息。
    • int iItem; - 与操作相关的项目的索引,如果未使用则为 -1。
    • POINT pt; - 操作点的屏幕坐标。
  • NMCTC2ITEMS -
    • NMHDR hdr; - 通用通知信息。
    • int iItem1; - 与操作相关的第一个项目的索引。
    • int iItem2; - 与操作相关的第二个项目的索引。
    • POINT pt; - 操作点的屏幕坐标。
  • CTCHITTESTINFO -
    • POINT pt; - 用于命中测试的位置,以客户端坐标表示。
    • UINT flags; - 接收命中测试结果的变量。选项卡控件将此成员设置为以下值之一:
      • CTCHT_NOWHERE - 位置不在选项卡上方。
      • CTCHT_ONITEM - 位置在选项卡项目上方。
      • CTCHT_ONCLOSEBTN - 位置在关闭按钮上方。
      • CTCHT_ONSCROLLRIGHTBTN - 位置在右滚动按钮上方。
      • CTCHT_ONSCROLLLEFTBTN - 位置在左滚动按钮上方。
  • NMCTCCUSTOMDRAW -
    • NMCUSTOMDRAW nmcd; - 通用自定义绘图结构。
    • HFONT hFontInactive; - 非活动选项卡文本的字体。
    • HFONT hFontSelected; - 选定选项卡文本的字体。
    • HBRUSH hBrushBackground; - 用于 PatBlt 到背景的 HBRUSH
    • COLORREF clrTextInactive; - 非活动选项卡文本的颜色。
    • COLORREF clrTextSelected; - 选定选项卡测试的颜色。
    • COLORREF clrSelectedTab; - 选定选项卡的背景颜色。
    • COLORREF clrBtnFace; - 用于绘制 3D 形状。默认为 COLOR_BTNFACE
    • COLORREF clrBtnShadow; - 用于绘制 3D 形状。默认为 COLOR_BTNSHADOW
    • COLORREF clrBtnHighlight; - 用于绘制 3D 形状。默认为 COLOR_BTNHIGHLIGHT
    • COLORREF clrBtnText; - 用于绘制 3D 形状。默认为 COLOR_BTNTEXT
    • COLORREF clrHighlight; - 当派生选项卡需要“高亮”颜色时使用。
    • COLORREF clrHighlightHotTrack; - 用于热追踪。
    • COLORREF clrHighlightText; - 当派生选项卡需要“高亮文本”颜色时使用。
  • CTCSETTINGS -
    • signed char iPadding; - 选项卡项填充。
    • signed char iMargin; - 选项卡项边距。
    • signed char iSelMargin; - 选定选项卡项边距。
    • signed char iIndent; - 从客户端区域左侧到第一个选项卡开始的缩进(有时在客户端区域右侧类似使用)。
    • CDotNetTabCtrlImplCDotNetTabCtrlCDotNetButtonTabCtrl 的基类)解释边距和填充如下:
      M - Margin
      P - Padding
      I - Image
      Text - Tab Text
      
      With image:
           __________________________
      
          | M | I | P | Text | P | M |
           --------------------------
      
      Without image:
           ______________________
      
          | M | P | Text | P | M |
           ----------------------

常量

  • FindItem 标志
    • CTFI_NONE - 0x0000
    • CTFI_RECT - 0x0001
    • CTFI_IMAGE - 0x0002
    • CTFI_TEXT - 0x0004
    • CTFI_TOOLTIP - 0x0008
    • CTFI_TABVIEW - 0x0010
    • CTFI_HIGHLIGHTED - 0x0020
    • CTFI_CANCLOSE - 0x0040
    • CTFI_LAST - CTFI_CANCLOSE
    • CTFI_ALL - 0xFFFF

在您 #include CustomTabCtrl.h 之前 #define 以下常量以重新定义它们。

  • 滚动重复(毫秒)。
    • CTCSR_NONE - 0
    • CTCSR_SLOW - 100
    • CTCSR_NORMAL - 25
    • CTCSR_FAST - 10
  • 拖放常量
    • CTCD_SCROLLZONEWIDTH - 20 (像素)

方法

注意:这是自定义选项卡控件与通用控件不同的一点。您不发送消息到窗口,而是调用公共方法——这很像使用 WTL 的通用控件包装器。如果您想要与这些方法对应的消息,请告诉我。

  • SubclassWindow - 当您有一个现有窗口(例如静态控件)想要子类化为自定义选项卡控件窗口时调用。
  • GetTooltips - 获取工具提示控件窗口(返回 WTL 工具提示控件窗口包装器)。
  • Get/SetImageList - 选项卡项的图像保存在图像列表中。使用 WTL 图像列表包装器。
  • Get/SetScrollDelta - 每次原子滚动操作滚动视图的像素距离。仅在设置了 CTCS_SCROLL 样式时有效。有效值为 0-63。
  • Get/SetScrollRepeat - 当按住滚动按钮时,滚动重复决定了原子滚动操作重复的速度。仅在设置了 CTCS_SCROLL 样式时有效。使用 Windows 定时器重复滚动。有效值为:ectcScrollRepeat_NoneectcScrollRepeat_SlowectcScrollRepeat_NormalectcScrollRepeat_Fast
  • InsertItem - 插入一个新的选项卡项。此方法有两个版本。第一个允许您传递选项卡项的参数。第二个允许您调用 CreateTabItem 方法创建新选项卡,设置该项的参数,然后插入该项(选项卡控件拥有使用 CreateTabItem 创建的项)。
  • MoveItem - 将现有选项卡项移动到另一个索引,并移动受影响的选项卡项索引。
  • SwapItemPositions - 交换两个选项卡项的位置。
  • DeleteItem - 删除一个选项卡项。
  • DeleteAllItems - 删除所有选项卡项。
  • GetItem - 获取指向选项卡项类的指针。选项卡项类将是 CCustomTabItem、从 CCustomTabItem 派生的类,或者与 CCustomTabItem 具有相同接口的类。
  • Get/SetCurSel - 当前选定的选项卡项。SetCurSel 将首先发送通知,表明选定的项即将更改(CTCN_SELCHANGING)。如果通知的接收者不取消尝试,则当前选择将更改,并发送另一个通知,表明选择已更改(CTCN_SELCHANGE)。
  • GetItemCount - 返回选项卡项的数量。
  • HitTest - 确定指定位置(在客户端坐标中)是否有选项卡。
  • EnsureVisible - 确保指定的选项卡项可见。仅在设置了 CTCS_SCROLL 时真正有用。
  • GetItemRect - 获取项在客户端设备坐标中的 RECT
  • HighlightItem - 类似于 SysTabControl32TCM_HIGHLIGHTITEM 以及 MFC 和 WTL 包装器 CTabCtrl::HighlightItem
  • FindItem - 查找下一个符合搜索条件的选项卡项。该函数旨在模仿 CListViewCtrl::FindItemLVM_FINDITEM 的工作方式,因为选项卡控件没有可比较的消息或函数。

致谢

我要感谢 Bjarke Viksøe 提供的原始“Cool Tab controls”以及他在其网站上慷慨分享的所有其他酷炫内容。我还要感谢所有提供反馈、提出建议并帮助其发展至今的许多其他人。

历史

  • 2002 年 7 月 4 日 - 更新了源代码和演示。
  • 2002 年 11 月 22 日 - 更新了源代码和演示。
  • 2004 年 4 月 29 日 - 更新了源代码和演示。有关更改的详细说明,请参阅每个文件的历史记录。
  • 2004 年 6 月 29 日 - 更新了源代码和演示。有关更改的详细说明,请参阅每个文件的历史记录。
  • 2005 年 3 月 15 日 - 更新了源代码和演示。支持 VC 8.0、WTL 7.5、64 位、警告级别 4。各种小错误修复。
  • 2005 年 4 月 8 日 - 更新了源代码和演示。支持 SetMinTabCountForVisibleTabs
  • 2005 年 7 月 14 日 - 更新了源代码和演示。HTML 视图焦点增强,ATL 和 WTL 使用的命名空间限定,各种其他小错误修复。
© . All rights reserved.