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

类似于 Internet Explorer 7 的标签控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.33/5 (13投票s)

2006年12月8日

4分钟阅读

viewsIcon

161480

downloadIcon

5644

一个(相当)简单的标签控件,带有可关闭的标签。

Sample Image - TabPages.jpg

引言

最近,我的几个项目都需要处理多个文档的能力。我认为 IE7 的标签页是处理此问题的不错方式,由此产生了此控件。

概述

此控件本质上是一个托管的页面(或控件)集合。它是事件驱动的,会指示何时添加、删除、选择或关闭了页面。关闭事件是可以取消的,允许您在满足特定条件之前阻止页面关闭。

我应该补充一点,不支持通过 IDE 添加标签页。我曾考虑过这样做,但它并没有太大意义。我的所有项目都涉及在运行时打开和关闭的文档,因此我设计此控件时已考虑到这一点。

使用控件

创建控件

要创建此控件,请添加对 TabPages.dll 的引用,然后以编程方式或通过 IDE 创建 TabPages.PageCollection 控件。

添加页面

要添加页面,请调用 Add 方法。此方法以 TabPage 对象作为参数。TabPage 对象包含文本、一个控件(您希望在选中标签页时显示的控件)以及一个可选的 toolTip 字符串,该字符串将在鼠标悬停在标签页上时显示。

删除页面

要删除页面,请调用 RemoveRemoveAtClear 方法。这些方法对应于 IList(Of TabPage) 方法。

您还可以调用要关闭的 TabPageClose 方法(这将引发 PageClosing 事件,而 Remove 方法则不会)。

事件

PageCollection 控件的用户会关注几个事件,它们定义如下:

Public Event PageAdded(ByVal page As TabPage)

Public Event PageRemoved(ByVal page As TabPage)

Public Event CurrentPageChanged_
	(ByVal currentPage As TabPage, ByVal previousPage As TabPage)

Public Event PageClosing(ByVal page As TabPage, ByRef cancel As Boolean)

当页面添加到集合时,会触发 PageAdded 事件。

当页面从集合中删除时,会触发 PageRemoved 事件。

当前选定的页面更改时(当不同的标签页成为活动标签页时),会触发 CurrentPageChanged 事件。此事件会传递当前选定的标签页和之前选定的标签页。

当页面尝试关闭时,会触发 PageClosing 事件。当用户单击关闭按钮或调用 TabPageClose 方法时,会触发此事件。调用 RemoveRemoveAtClear 时,不会触发此事件。page 参数指示哪个页面正在尝试关闭,而 cancel 参数允许取消关闭。如果未取消关闭,该页面将从集合中移除,并触发 PageRemoved 事件。

外观

此控件的外观可以更灵活,但目前已足够。在自定义 PageCollection 控件的外观时,有两个属性值得关注。

TabColor 属性指定用于生成控件主题的颜色。所有渐变、边框和菜单颜色都从此颜色生成。随意尝试,看看您喜欢什么。我最喜欢的 TabColorLightGrayLightSteelBlue

TopMargin 属性指定选中标签页的高度与未选中标签页的高度之间的差值。

兴趣点

正如我之前所说,此控件相当简单。但在开发过程中有两个半挑战。

闪烁

最初的版本闪烁得非常厉害,即使我使用了双缓冲。我通过将 WM_SETREDRAW 消息传递给 SendMessage API 方法解决了这个问题。现在它和......呃......Bono 或其他什么平滑的人一样平滑。

Private Const WM_SETREDRAW As Integer = &HB

Private Declare Auto Function SendMessage Lib "User32" Alias "SendMessage" _
	(ByVal hWnd As IntPtr, ByVal msg As Integer, _
	ByVal wParam As Integer, ByVal lParam As Integer) As Boolean

当时的情况是,每次我调整大小时(或添加/删除控件时),我都会重新生成显示的标签控件列表。每次列表重新生成时,每个标签都会失效。这很糟糕。WM_SETREDRAW 基本上是告诉句柄(控件)在您指示之前不要再进行绘制。有关更多信息,请参见项目中的 FlickerFreeControl

菜单主题

我想要的另一件事是菜单的颜色方案与标签页匹配。为此,我继承了 ToolStripRenderer。我以前从未使用过它,但它允许您自定义 toolstrip 对象(在本例中为我的上下文菜单)的绘制。有关实现,请参见源代码中的 DropDownRenderer 类。

结论

我不会重复自己。我希望您喜欢这个控件。如果您对其进行了重大改进,请将它们发给我,以便我能从中受益。祝您愉快。

历史

  • 2006 年 12 月 8 日:初次发布
© . All rights reserved.