GDI+Visual Studio 2005Windows 2000Windows XP.NET 2.0Windows FormsIntermediateDevVisual StudioWindows.NETC#
具有可定位标题和 Windows Forms 图标的面板控件






4.93/5 (23投票s)
一个支持标题并且可以正确停靠子控件的面板控件。

引言
.NET SDK 和一些优秀的开发者已经实现了面板控件。我的控件不同之处在于它能够正确地停靠子控件。我尝试在我的一个项目中使用类似的控件,发现当子控件的停靠样式更改为“Fill”时,标题头就会消失。这迫使我捕获“Resize”事件,然后调整子控件的边界。六年前,我使用 VB6 开发了一个这样的控件(仍然可以在 VBAccelerator.com 下载)。所以,我决定重做一遍,这次使用 C#。
控件的 GUI

图 1
图 1 显示了此控件的基本布局。“显示区域”区域表示子控件的最大可用空间。
控件属性
除了基类 Panel 控件的属性之外,该控件还具有以下附加属性:
- GradientStart:控件渐变背景的起始- Color。默认值为- KnownColor.Window。
- GradientEnd:控件渐变背景的结束- Color。默认值为- KnownColor.Window。
- GradientDirection:由- LinearGradientMode枚举定义的渐变方向。默认值为- LinearGradientMode.Vertical。
- BorderStyle:控件的边框样式。默认值为- Shadow。可用值为:
- None- 不绘制边框。
- Single- 使用指定的- BorderColor绘制一个像素宽的彩色边框。
- Shadow- 使用指定的- BorderColor绘制一个像素宽的边框,并在其周围添加阴影。
- Inset- 绘制边框以创建凹陷控件的外观。
- Outset- 绘制边框以创建凸起控件的外观。
- Groove- 绘制边框以创建凹陷边框的外观。
- Ridge- 绘制边框以创建凸起边框的外观。
- BorderColor:用于绘制控件边框的- Color。默认值为- KnownColor.ActiveCaption。
- CaptionText:将在标题中显示的文本。默认值为“HeaderPanel”。
- TextAntialias:一个布尔值,用于确定标题头中的每个字符是否使用抗锯齿字形位图绘制。默认值为- true。
- CaptionVisible:一个布尔值,指示标题头是否可见。默认值为- true。
- CaptionHeight:标题头的像素高度。默认值为“24”像素。
- CaptionBeginColor:标题渐变背景的起始- Color。默认值为- KnownColor.InActiveCaption。
- CaptionEndColor:标题渐变背景的结束- Color。默认值为- KnownColor.ActiveCaption。
- CaptionGradientDirection:由- LinearGradientMode枚举定义的渐变方向。默认值为- LinearGradientMode.Vertical。
- CaptionPosition:标题的位置。有效值为:
- Top:在顶部显示标题面板。
- Bottom:在底部显示标题面板。
- Left:在左侧显示标题面板。
- Right:在右侧显示标题面板。
- PanelIcon:将在标题头中显示的图标。
- PanelIconVisible:一个布尔值,指示标题图标是否可见。默认值为- false。
子控件停靠
如前所述,对于其他类似的控件,当子控件的 Dock 属性更改为“Fill”时,子控件会覆盖面板控件的整个客户端区域。这不是我期望的行为。为了克服这个问题,我有多种选择。
- 第一个也是非常明显的选择是添加一个 Picturebox控件并将其Dock属性设置为“Top”。但不知何故,我并不喜欢这个主意。
- 我脑海中第二个想法是某种程度上改变控件的 ClientArea,然后捕获WM_NC*消息来绘制非客户端区域。事实证明ClientRectangle属性是readonly的,并且拦截WM_NC*消息需要大量代码。所以,这是我为实现此功能保留的最后一个选择。
MSDN 库
搜索 MSDN 文档后发现,每个 Windows 控件都公开一个名为 DisplayRectangle 的属性。进一步深入文档,我了解到 DisplayRectangle 属性返回控件显示区域的客户端矩形。对于基类控件,这等于客户端矩形。但是,继承控件可能会希望更改这一点,如果它们的客户端区域与其显示区域不同的话。显示矩形是包围控件的最小矩形,用于布局控件。就是这个。我一直在寻找的简单解决方案。
类似控件
- Nice Panel:Pure Components 提供的一个非常好的控件。还支持页脚。
- Extended .NET Controls:Hooyberghs Johnny 提供的一个非常好的控件。
- GroupControl:与标准控件相比,此 GroupControl 提供了两个显著优势:它提供自动内容滚动和可自定义的标题位置。
缺失的功能
这是我希望包含的一些附加功能的简要列表。(欢迎所有建议。)
- 可自定义的标题位置,这是 GroupControl 中的一个功能。
- 可自定义的阴影宽度和颜色。
- 根据当前字体和图标尺寸自动调整 CaptionHeight。
版本历史
- 2006 年 5 月 26 日:首次发布。
- 2006 年 5 月 31 日:第二次发布。现在 Caption可以显示在Top、Bottom、Left和Right四个位置之一。Caption的Font和Height现在使用SystemInformation类进行默认设置。
- 2006 年 6 月 9 日:第三次发布。增加了对更多边框样式的支持。纠正了 Mr. leonardas 指出的 resize 错误。
- 2006 年 6 月 26 日:修复了 luyuxun 报告的 bug。控件现在会拦截 WM_NCxxxx消息来调整客户端和非客户端区域。这要归功于 Mr. Szymon Kobalczyk。


