对于下面显示的控件,也就是旁边有标签的直线,我很好奇。我试图找到一个类似的控件,但没有找到任何群组框设置,所以我只是制作了一个高度为2的GroupBox来复制它。
但实际上是否存在这样的控件或设置?这个实际控件叫什么?
Spy++ 工具告诉我们那实际上是两个独立的STATIC
控件(类似于 WinForms 中的 Label
)。
第一个只是一个普通的静态文本控件,显示为“主页”。
第二个设置了 SS_ETCHEDHORZ
样式,使其以 3D 线条的形式绘制。不幸的是,在 WinForms 中没有将此样式公开的方式。
正如您在问题中指出的,有一些黑科技/解决方案可以让我们达到类似的效果,比如将 GroupBox
控件垂直压缩,或重写 Label
控件的 OnPaint
方法,并使用 ControlPaint
类绘制 3D 边框。虽然它们能够工作,但我从未喜欢过它们。
但实际上你可以自己设置 SS_ETCHEDHORZ
样式,以便完全复制本机 UI。这里有一个小类可以实现这个功能。将其添加到您的项目中,编译,然后就会在工具箱中看到一个名为“HorizontalRule”的新控件。使用它与任何其他控件一样!
public class HorizontalRule : Control
{
private const int FixedHeight = 2;
private const int WS_CHILD = 0x40000000;
private const int WS_VISIBLE = 0x10000000;
private const int SS_ETCHEDHORZ = 0x00000010;
private const int SS_ETCHEDVERT = 0x00000011;
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ClassName = "STATIC";
cp.Style = WS_CHILD | SS_ETCHEDHORZ;
if (this.Visible)
{
cp.Style |= WS_VISIBLE;
}
return cp;
}
}
protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified)
{
height = FixedHeight;
base.SetBoundsCore(x, y, width, height, specified);
}
}
您还可以在CodeProject的这里找到更详细的信息和其他示例代码。
几年前我也遇到了同样的问题,最终只是为此目的画了一条线。
事实上,我甚至使用了一个足够长宽的固定线条图像,以便在所有情况下都可以通过显示所需部分(宽度)的图像来使用。
这个解决方案自那时以来一直对我很有效。