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

具有可定位标题和 Windows Forms 图标的面板控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.93/5 (23投票s)

2006年5月26日

CPOL

5分钟阅读

viewsIcon

131288

downloadIcon

3979

一个支持标题并且可以正确停靠子控件的面板控件。

Sample Image - HeaderPanel.gif

引言

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

控件的 GUI

Control layout

图 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”时,子控件会覆盖面板控件的整个客户端区域。这不是我期望的行为。为了克服这个问题,我有多种选择。

  1. 第一个也是非常明显的选择是添加一个 Picturebox 控件并将其 Dock 属性设置为“Top”。但不知何故,我并不喜欢这个主意。
  2. 我脑海中第二个想法是某种程度上改变控件的 ClientArea,然后捕获 WM_NC* 消息来绘制非客户端区域。事实证明 ClientRectangle 属性是 readonly 的,并且拦截 WM_NC* 消息需要大量代码。所以,这是我为实现此功能保留的最后一个选择。

MSDN 库

搜索 MSDN 文档后发现,每个 Windows 控件都公开一个名为 DisplayRectangle 的属性。进一步深入文档,我了解到 DisplayRectangle 属性返回控件显示区域的客户端矩形。对于基类控件,这等于客户端矩形。但是,继承控件可能会希望更改这一点,如果它们的客户端区域与其显示区域不同的话。显示矩形是包围控件的最小矩形,用于布局控件。就是这个。我一直在寻找的简单解决方案。

类似控件

  • Nice Panel:Pure Components 提供的一个非常好的控件。还支持页脚。
  • Extended .NET Controls:Hooyberghs Johnny 提供的一个非常好的控件。
  • GroupControl:与标准控件相比,此 GroupControl 提供了两个显著优势:它提供自动内容滚动和可自定义的标题位置。

缺失的功能

这是我希望包含的一些附加功能的简要列表。(欢迎所有建议。)

  1. 可自定义的标题位置,这是 GroupControl 中的一个功能。
  2. 可自定义的阴影宽度和颜色。
  3. 根据当前字体和图标尺寸自动调整 CaptionHeight

版本历史

  1. 2006 年 5 月 26 日:首次发布。
  2. 2006 年 5 月 31 日:第二次发布。现在 Caption 可以显示在 TopBottomLeftRight 四个位置之一。CaptionFontHeight 现在使用 SystemInformation 类进行默认设置。
  3. 2006 年 6 月 9 日:第三次发布。增加了对更多边框样式的支持。纠正了 Mr. leonardas 指出的 resize 错误。
  4. 2006 年 6 月 26 日:修复了 luyuxun 报告的 bug。控件现在会拦截 WM_NCxxxx 消息来调整客户端和非客户端区域。这要归功于 Mr. Szymon Kobalczyk
© . All rights reserved.