C# 标题控件





5.00/5 (12投票s)
2004年6月21日
7分钟阅读

77235

1738
.NET 对系统 Header 控件的封装。
引言
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 修复。控件在运行时调整大小时会闪烁。