只是好奇下面显示的控件,旁边有标签的直线。我试图为它找到一个类似的控件,但没有也没有任何组框设置,所以我只是制作了一个高度为 2 的 GroupBox 来复制它。
但是是否有实际的控制或设置来做到这一点?而实际控制又叫什么?
Spy++告诉我们它们实际上是两个独立的STATIC
控件(类似于Label
WinForms 中的 a)。
第一个只是一个普通的静态文本控件,上面写着“主页”。
第二个具有SS_ETCHEDHORZ
样式集,使其绘制为 3D 线。不幸的是,设置这种样式的能力并没有在 WinForms 中向我们公开。
正如您在问题中指出的那样,有一些技巧/解决方法可以让我们获得类似的外观,例如垂直压缩GroupBox
控件,或覆盖控件的OnPaint
方法Label
并使用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 上找到更多详细信息和其他示例代码。
几年前我遇到了同样的问题,最后只是为此画了一条线。
事实上,我什至使用了一张宽度足够长的固定线图像,以便通过显示图像所需的部分(宽度)在所有情况下都可以使用它。
从那以后,这个解决方案对我来说一直很好。