【发布时间】:2011-03-06 11:04:30
【问题描述】:
我想在 WinForms 应用程序中创建一个简单的 3D 线条,以改善我的表单布局的视觉排列。 此行与 About Windows 对话框中的行完全相同(可在 Windows Explorer -> Help -> About Windows 中打开)。
一个例子被检查here。最后一行 (3D) 是我想要的,而不是第一行。
如何在 C# 或 Visual Basic (.NET) 中做到这一点?
【问题讨论】:
我想在 WinForms 应用程序中创建一个简单的 3D 线条,以改善我的表单布局的视觉排列。 此行与 About Windows 对话框中的行完全相同(可在 Windows Explorer -> Help -> About Windows 中打开)。
一个例子被检查here。最后一行 (3D) 是我想要的,而不是第一行。
如何在 C# 或 Visual Basic (.NET) 中做到这一点?
【问题讨论】:
添加一个带有 3D 边框且没有文本的 Label 控件,然后将高度设置为 2。
【讨论】:
如果您使用 SysInternals 的 ZoomIt 实用程序,您可以看到这只是两行代码。深灰色高于白色。使用 Graphics.DrawLine() 绘制线条非常简单,您只需要确保选择与表单的 BackColor 配合良好的深色即可。如果用户选择了另一个主题,那并不总是战舰灰色。这使得 GroupBox 技巧失败了。
此示例代码可用:
protected override void OnPaint(PaintEventArgs e) {
Color back = this.BackColor;
Color dark = Color.FromArgb(back.R >> 1, back.G >> 1, back.B >> 1);
int y = button1.Bottom + 20;
using (var pen = new Pen(dark)) {
e.Graphics.DrawLine(pen, 30, y, this.ClientSize.Width - 30, y);
}
e.Graphics.DrawLine(Pens.White, 30, y+1, this.ClientSize.Width - 30, y+1);
}
注意此代码中button1 的使用,以确保在正确的高度绘制线条,即使在重新缩放表单时也是如此。选择您自己的控件作为该行的参考。
【讨论】:
一种方法是创建一个没有标签且高度为 0(或者是 1,不太记得)的组框 - 我知道我以前使用过这个技巧,即使感觉有点 hacky :-)
【讨论】:
我也使用过GroupBox hack,它的好处是可以根据操作系统边框主题自行设置样式。
VB Power Packs 控件集合中还有一个 Line 类。里面还有一些我们也用过的好东西。
编辑:这是我使用上述方法绘制水平线的 Seperator 类。
public class Separator : GroupBox
{
// Methods
protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified)
{
base.SetBoundsCore(x, y, width, 3, specified);
}
// Properties
[DefaultValue("")]
public override string Text
{
get
{
return string.Empty;
}
set
{
}
}
}
【讨论】:
你可以通过添加一个Label并将其文本设置为下划线“_”来获得行分隔符效果
【讨论】: