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。