5

只是好奇下面显示的控件,旁边有标签的直线。我试图为它找到一个类似的控件,但没有也没有任何组框设置,所以我只是制作了一个高度为 2 的 GroupBox 来复制它。

但是是否有实际的控制或设置来做到这一点?而实际控制又叫什么?

Internet 选项属性对话框

4

2 回答 2

11

Spy++告诉我们它们实际上是两个独立的STATIC控件(类似于LabelWinForms 中的 a)。

  • 第一个只是一个普通的静态文本控件,上面写着“主页”。

  • 第二个具有SS_ETCHEDHORZ样式集,使其绘制为 3D 线。不幸的是,设置这种样式的能力并没有在 WinForms 中向我们公开。

正如您在问题中指出的那样,有一些技巧/解决方法可以让我们获得类似的外观,例如垂直压缩GroupBox控件,或覆盖控件的OnPaint方法Label并使用ControlPaint该类绘制 3D 边框。他们工作,但我从来不喜欢他们。

但您实际上可以自己设置SS_ETCHEDHORZ样式,以便准确复制本机 UI。这是一个可以做到这一点的小类。将它添加到您的项目中,编译,您应该会在工具箱中看到一个名为“Horizo​​ntalRule”的新控件。就像使用任何其他控件一样使用它!

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 上找到更多详细信息和其他示例代码。

于 2011-02-04T11:58:00.033 回答
0

几年前我遇到了同样的问题,最后只是为此画了一条线。

事实上,我什至使用了一张宽度足够长的固定线图像,以便通过显示图像所需的部分(宽度)在所有情况下都可以使用它。

从那以后,这个解决方案对我来说一直很好。

于 2011-02-04T11:43:31.433 回答