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

C# 标题控件

starIconstarIconstarIconstarIconstarIcon

5.00/5 (12投票s)

2004年6月21日

7分钟阅读

viewsIcon

77235

downloadIcon

1738

.NET 对系统 Header 控件的封装。

Sample Image - demo.gif

引言

Windows 为开发者提供了许多有用的控件。我们中的许多人已经习惯于使用这些控件来构建 GUI,并依靠它们在各种 Windows 版本和开发环境中都可用。

但是并非所有 Windows 公共控件(或其封装)都随 .NET Framework 一起提供。我曾经需要为 Windows 窗体应用程序添加标题控件,但找不到,于是不得不自己实现了一个 .NET 封装,现在可以与您分享。

不幸的是,我没有足够的时间来支持标准标题控件的所有可用功能,所以我只实现了最常用的通用功能。实际上,我只是没有实现所有者绘制和过滤器。

所以,对于那些需要在 .NET Windows 窗体应用程序中使用标题控件的人来说,它就在这里。

概述

我使控件的 API 与其他 .NET Framework 控件相似,所以如果您以前使用过它们,学习这个控件会很容易。

它有一个与 WinAPI 标题控件项对应的节集合,并且会根据通知触发事件。控件窗口的样式可以通过相应的属性进行更改。

还提供了设计时支持,因此您可以将此控件安装到工具箱中并在窗体设计器中使用它。要在 VS.NET 中实现此目的,请单击“工具”->“自定义工具箱”;或者在 VS 2003 中,从“工具箱”上下文菜单中选择“添加/删除项”,然后在出现的对话框中,激活“.NET Framework 组件”选项卡,然后单击“浏览”按钮,并打开 *SpHeader.dll* 文件。

此外,我还制作了一个简单的应用程序来演示和测试控件的功能。

控件类

以下是对主要类的简要描述。我不需要写冗长的手册,因为您可以更快地从源代码中学习。

HeaderSection 类

表示标题节(或项)。它包含文本、图像索引、位图以及 Windows 标题控件项支持的其他属性。该类继承自 *Component*,这使得可以在设计时编辑该对象,并且它实现了 *ICloneable* 接口,允许创建该实例的浅拷贝。

属性

  • Header - 获取附加到该节的标题控件的引用。
  • Index - 获取此节在标题控件的 *HeaderSectionCollection* 中的位置。
  • Width - 获取或设置节的宽度(以像素为单位)。
  • Text - 获取或设置显示在节上的文本。
  • ImageIndex - 获取或设置显示在节上的图像的索引。如果不需要显示图像,请将此值设置为 -1。
  • Bitmap - 获取或设置显示在节上的附加位图。
  • RightToLeft - 获取或设置一个值,该值指示节的文本是否从右到左显示。
  • ContentAlign - 获取或设置显示在节上的文本和图像的水平对齐方式。
  • ImageAlign - 获取或设置显示在节上的图像相对于文本的对齐方式。
  • SortMark - 获取或设置要在节中显示的位图而不是排序标记。仅当控件与随 Microsoft Windows XP 或更高版本一起提供的 *Comctl32.dll* 版本 6.0 一起使用时,才会显示排序标记。

构造函数

  • public HeaderSection()
  • public HeaderSection(string text, int cxWidth)
  • public HeaderSection(string text, int cxWidth, int iImage)
  • public HeaderSection(string text, int cxWidth, object tag)
  • public HeaderSection(string text, int cxWidth, int iImage, object tag)
  • public HeaderSection(string text, int cxWidth, Bitmap bitmap)
  • public HeaderSection(string text, int cxWidth, int iImage, Bitmap bitmap)
  • public HeaderSection(string text, int cxWidth, int iImage, Bitmap bitmap, HorizontalAlignment enContentAlign)
  • public HeaderSection(string text, int cxWidth, int iImage, Bitmap bitmap, HorizontalAlignment enContentAlign, LeftRightAlignment enImageAlign)
  • public HeaderSection(string text, int cxWidth, int iImage, Bitmap bitmap, HorizontalAlignment enContentAlign, LeftRightAlignment enImageAlign, object tag)
  • public HeaderSection(string text, int cxWidth, int iImage, Bitmap bitmap, RightToLeft enRightToLeft, HorizontalAlignment enContentAlign, LeftRightAlignment enImageAlign, HeaderSectionSortMarks enSortMark, object tag)

方法

  • public virtual object Clone()

    创建节的浅拷贝。

HeaderSectionCollection 类

表示标题控件中节(或项)的集合。要添加、删除和修改控件的节,请使用此集合。

与 WinAPI 标题控件的逻辑不同,集合中的所有节都按显示顺序保存。您无需像使用 WinAPI 消息那样处理索引和顺序。这似乎是为了提供向后兼容性*,并可能给 .NET 开发人员带来不必要的困惑和错误。因此,我以一种略有不同的方式进行了处理。在这里,您处理 *HeaderSection* 对象及其集合,节的顺序对应于其在集合中的索引,因此完全不需要 WinAPI 标题项索引。

* 最好使用句柄而不是索引,就像在 *ListView* 中一样。

属性

  • Header - 获取拥有该集合的标题控件的引用。
  • Count - 获取集合中元素的数量。
  • this[int index] - 获取或设置集合中的节。要设置的节不能已附加到此控件或其他标题控件。

方法

  • public void Insert(int index, HeaderSection item)

    在指定位置将新节插入集合。要插入的节不能已附加到此控件或其他标题控件。

  • public int Add(HeaderSection item)

    将新节添加到集合的末尾。要添加的节不能已附加到此控件或其他标题控件。

  • public void RemoveAt(int index)

    从集合中移除指定位置的节。

  • public virtual void Remove(HeaderSection item)

    从集合中移除给定的节。

  • public void Move(int iFrom, int iTo)

    将节从一个位置移动到另一个位置。

  • public void Clear()

    从集合中移除所有节。

  • public int IndexOf(HeaderSection item)

    定义给定节在集合中的索引,如果未找到节,则返回 null。此索引对应于节在标题控件中的显示顺序。

  • public bool Contains(HeaderSection item)

    定义节是否保留在集合中。

  • public void CopyTo(Array aDest, int index)

    将所有元素复制到数组。

Header 类

属性

  • Clickable - 获取或设置“Clickable”样式。如果设置为 true,则当用户单击节时,该节会触发事件。
  • HotTrack - 获取或设置“HotTrack”样式。如果设置为 true,则当鼠标指针位于节上时,该节会高亮显示。
  • Flat - 如果设置为 true,则在 Microsoft Windows XP 以经典模式运行时,标题控件将以平面样式绘制。
  • AllowDragSections - 确定用户是否可以将标题列拖到另一个位置。
  • FullDragSections - 如果设置为 true,则在用户调整列大小时,标题控件将显示列内容。
  • Sections - 获取节(或项)的集合。使用此集合添加、删除和修改标题控件的节。
  • ImageList - 获取或设置与标题控件关联的图像列表。显示在节上的图像取自此 *ImageList*。
  • BitmapMargin - 围绕现有标题控件中位图的边距宽度。

事件

  • SectionClick - 当用户单击节时引发。
  • SectionDblClick - 当用户双击节时引发。
  • DividerDblClick - 当用户双击节的分隔线时引发。
  • BeforeSectionTrack - 当用户即将开始调整节大小时引发。此操作可以被取消。
  • SectionTracking - 当用户正在调整节大小时引发。此操作可以被取消。
  • AfterSectionTrack - 当用户调整完节大小时引发。
  • BeforeSectionDrag - 当用户即将开始将节拖动到另一个位置时引发。此操作可以被取消。
  • AfterSectionDrag - 当用户将节拖动到另一个位置时引发。

方法

  • public void BeginUpdate()

    在调用 *EndUpdate* 方法之前,阻止控件进行绘制。

  • public void EndUpdate()

    在 *BeginUpdate* 方法暂停绘制后,恢复控件的绘制。

  • public Rectangle GetSectionRect(HeaderSection item)

    返回节的矩形区域。

  • public void CalculateLayout(Rectangle rectArea, out Rectangle rectPosition)

    检索标题控件在父窗口中的正确大小和位置。

  • public int SetHotDivider(int x, int y)
  • public int SetHotDivider(int iDevider)

    更改标题项之间的分隔线的颜色,以指示外部拖放操作的目标。

  • public HitTestInfo HitTest(int x, int y)
  • public HitTestInfo HitTest(Point point)

    测试一个点,以确定指定点处的标题项(如果有)。

结论

享受。

已知问题和 bug

  • 使用 Visual Studio.NET 时,无法在设计模式下用鼠标调整节的大小。但在 Visual Studio 2003 中则可以正常工作。

历史

  • 2004年6月17日 - 发布版本 1.0.0.0。
  • 2004年6月24日 - Bug 修复。控件在运行时调整大小时会闪烁。
© . All rights reserved.