XP 风格可折叠组合框






4.84/5 (31投票s)
2006年1月26日
3分钟阅读

254755

8160
本文介绍了一种XP风格的可折叠GroupBox。
- 下载 .NET 2.0 演示项目 - 5.29 Kb
- 下载 VS.NET 2005 源代码 - 22.7 Kb
- 下载 .NET 1.1 演示项目 - 11.3 Kb
- 下载 VS.NET 2003 源代码 - 15.6 Kb
引言
有时,需要在一个可以折叠的容器中显示信息。 当然,有一些控件,例如 XP Sidebar 等等,但是对于我的需求,我想要一些看起来和工作方式都与标准GroupBox
完全一样的东西。 所以,我只是扩展了GroupBox
控件以提供此功能。
背景
我在网上搜索了现有的控件,遇到了jeffb42的一个控件,它几乎是我想要的,但是我已经开发了.NET 2.0一段时间了,旧格式的设计与我表单上的普通GroupBox
es不相符。 而且,该版本由于某些原因不允许我轻松地向框中添加其他控件。 因此,我基于 jeffb42 的版本创建了自己的版本。
使用代码
这个控件非常简单,几乎不需要说明。 它可以像普通的GroupBox
一样使用。 提供完整的设计时支持,因此只需将控件拖放到您的表单上并添加您想要的内容即可。
控件背后
查看代码,可以看到创建此控件不需要太多操作。 重写了常用的方法来控制绘制和处理鼠标点击折叠状态切换按钮。
protected override void OnMouseUp(MouseEventArgs e)
{
if (m_toggleRect.Contains(e.Location))
ToggleCollapsed();
else
base.OnMouseUp(e);
}
protected override void OnPaint(PaintEventArgs e)
{
HandleResize();
DrawGroupBox(e.Graphics);
DrawToggleButton(e.Graphics);
}
对于绘制,我使用了System.Windows.Forms
中的一个名为DrawGroupBox
的方法。 这消除了绘制弧线和直线或担心匹配普通GroupBox
颜色的所有需要。 但是,当在此框上绘制GroupBox
文本时,您会得到删除线效果。 为了克服这个问题,我绘制一条与测量文本长度相同的线条,其颜色与控件的颜色相同,因此不会被看到。
void DrawGroupBox(Graphics g)
{
// Get windows to draw the GroupBox
Rectangle bounds = new Rectangle(ClientRectangle.X,
ClientRectangle.Y + 6, ClientRectangle.Width,
ClientRectangle.Height - 6);
GroupBoxRenderer.DrawGroupBox(g, bounds, Enabled ?
GroupBoxState.Normal : GroupBoxState.Disabled);
// Text Formating positioning & Size
StringFormat sf = new StringFormat();
int i_textPos = (bounds.X + 8) + m_toggleRect.Width + 2;
int i_textSize = (int)g.MeasureString(Text, this.Font).Width;
i_textSize = i_textSize < 1 ? 1 : i_textSize;
int i_endPos = i_textPos + i_textSize + 1;
// Draw a line to cover the GroupBox
// border where the text will sit
g.DrawLine(SystemPens.Control, i_textPos,
bounds.Y, i_endPos, bounds.Y);
// Draw the GroupBox text
using (SolidBrush drawBrush = new
SolidBrush(Color.FromArgb(0, 70, 213)))
g.DrawString(Text, this.Font, drawBrush, i_textPos, 0);
}
void DrawToggleButton(Graphics g)
{
if(IsCollapsed)
g.DrawImage(Properties.Resources.plus, m_toggleRect);
else
g.DrawImage(Properties.Resources.minus, m_toggleRect);
}
关注点
如果您在DockStyle
状态为Fill
的情况下使用此控件,那么您会注意到该控件不会折叠。 这是因为父控件强制控件填充其空间。 因此,控件上有一个事件,当折叠状态更改时会触发。 父控件可以使用它来将自身调整为GroupBox
的大小。
历史
好的,在收到有关此控件的 1.1 版本的请求后,我以为我可以尝试一下。 在大约一年没有使用 Visual Studio 2003 之后,切换回它是一种震惊。 现在,我在 2.0 解决方案中使用的大部分方法在 1.1 中都不可用,尤其是绘制圆角矩形。 我没有自己计算所有点和曲线,而是浏览了 CodeProject,因为肯定有人以前做过。 当然,有人做过,Arun Reginald 的文章提供了一个简单的解决方案。
其余的与 2.0 解决方案中的几乎相同。 我使用了 Barretto VN 的想法来添加XP 主题到项目中使用的所有控件。