在开发Windows应用程序时,经常需要使用到各种GUI控件。虽然许多常用的控件在不同版本的Windows和开发环境中都有提供,但并非所有的Windows公共控件都包含在.NET Framework中。例如,曾经在开发一个Windows Forms应用程序时需要使用到Header控件,但发现它并不包含在.NET Framework中,因此不得不自己实现一个.NET封装,并在此与大家分享。
由于时间有限,并没有实现标准Header控件的所有功能,只实现了最常用的一些功能。例如,没有实现自定义绘制和过滤器。对于那些需要在.NET Windows Forms应用程序中使用Header控件的人来说,这是一个不错的选择。
使这个控件的API与其他.NET Framework控件类似,因此如果之前使用过它们,学习这个控件将会很容易。它有一个与WinAPI Header控件项相对应的节的集合,并且会根据通知触发事件。可以通过相应的属性更改控件窗口的样式。
此外,还提供了设计时支持,可以将这个控件安装到工具箱中,并在表单设计器中使用它。在VS.NET中,点击"工具"->"自定义工具箱";在VS 2003中,从工具箱上下文菜单中选择"添加/移除项",在出现的对话框中激活".NET Framework组件"标签页,然后点击"浏览"按钮,打开SpHeader.dll文件。
还制作了一个简单的应用程序来演示和测试控件的功能。
以下是主要类的简短描述。不需要写一个长篇手册,因为可以通过源代码更快地学习它。
代表Header控件的节(或项)。它保存文本、图像索引、位图和其他由Windows Header控件的项支持的属性。此类派生自Component,这使得可以在设计时编辑对象,并且实现了ICloneable接口,允许创建自身实例的浅副本。
- Header: 获取该节附加到的Header控件的引用。
- Index: 获取该节在Header控件的HeaderSectionCollection中的位置。
- Width: 获取或设置节的宽度(以像素为单位)。
- Text: 获取或设置节上显示的文本。
- ImageIndex: 获取或设置节上显示的图像的索引。如果不显示图像,则将此值设置为-1。
- Bitmap: 获取或设置要在节上显示的附加位图。
- RightToLeft: 获取或设置一个值,指示节的文本是否从右到左显示。
- ContentAlign: 获取或设置节上显示的文本和图像的水平对齐方式。
- ImageAlign: 获取或设置节上显示的图像相对于文本的对齐方式。
- SortMark: 获取或设置要在节上显示的排序标记,而不是位图。排序标记仅当控件与Comctl32.dll的6.0版本一起使用时显示,该版本随Microsoft Windows XP或更高版本一起提供。
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()
创建节的浅副本。
代表位于Header控件中的节(或项)的集合。要添加、删除和修改控件的节,请使用这个集合。
与WinAPI Header控件的逻辑不同,集合中的所有节都按照它们显示的顺序保持。不必像使用WinAPI消息那样处理索引和顺序。这似乎只是为了提供向后兼容性,可能会给.NET开发者带来不必要的混淆和错误。因此,做了一些不同的处理。在这里,处理HeaderSection对象及其集合,节的顺序对应于其在集合中的索引,因此根本不需要WinAPI Header项索引。
- Header: 获取拥有该集合的Header控件的引用。
- Count: 获取集合中的元素数量。
- this[int index]: 获取或设置集合中的节。正在设置的节不能已经附加到这个或另一个Header控件。
public void Insert(int index, HeaderSection item)
在指定位置插入新节到集合中。正在插入的节不能已经附加到这个或另一个Header控件。
public int Add(HeaderSection item)
将新节添加到集合的末尾。正在添加的节不能已经附加到这个或另一个Header控件。
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。此索引对应于节在Header控件中显示的顺序。
public bool Contains(HeaderSection item)
定义节是否保留在集合中。
public void CopyTo(Array aDest, int index)
将所有元素复制到数组中。
- Clickable: 获取或设置"可点击"样式。如果设置为true,节在用户点击时生成事件。
- HotTrack: 获取或设置"热跟踪"样式。如果设置为true,当鼠标指针位于其上时,节会被高亮显示。
- Flat: 如果设置为true,在Microsoft Windows XP以经典模式运行时,使Header控件以平面方式绘制。
- AllowDragSections: 确定用户是否可以将Header列拖动到另一个位置。
- FullDragSections: 如果设置为true,即使用户调整列大小时,也会导致Header控件显示列内容。
- Sections: 获取节(或项)的集合。使用这个集合来添加、移除和修改Header控件的节。
- ImageList: 获取或设置与Header控件关联的图像列表。显示在节上的图像取自这个ImageList。
- BitmapMargin: Header控件内位图周围的边距宽度。
- 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)
检索Header控件在父窗口中的正确的大小和位置。
public int SetHotDivider(int x, int y)
public int SetHotDivider(int iDevider)
更改分隔符的颜色,以指示外部拖放操作的目标。
public HitTestInfo HitTest(int x, int y)
public HitTestInfo HitTest(Point point)
测试一个点,以确定是否有任何Header项在指定的点上。
希望这篇文章能帮助更好地理解和使用.NET Windows Forms中的自定义控件。如果有任何问题或建议,请随时联系。