这个控件是什么?GroupBox还是其他的!

6

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

但实际上是否存在这样的控件或设置?这个实际控件叫什么?

Internet Options property dialog

2个回答

12

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


0

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

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

这个解决方案自那时以来一直对我很有效。


1
如果控件的样式在未来的Windows版本中发生变化,使用图像将会成为一个问题。您的控件仍将保留旧样式。 - Antoine Aubry
从技术上讲,这是正确的,但如果只是一个简单的细线,那么它就没有太多的“风格”,所以这并不重要。我的线在XP、Vista和Windows 7中一直显示得很好,而且还有不同的主题。 - Peladao
未来版本的Windows非常有可能会大幅改变那个“简单细线”的样式。请注意,从Windows XP中的“经典”主题到Luna再到Windows Vista中的Aero,组框发生了多大的变化。(这也是为什么使用组框无法复制原始问题示例的另一个原因。) - Cody Gray
也许我没有表达清楚。我正在使用一个具有透明BackColor和BorderStyle=none的PictureBox控件。因此,除了它所持有的图像之外,控件本身的任何内容都不可见。这是一个1000x2像素的BMP资源。我相信在未来的Windows版本中,完全相同的线条仍将显示在透明背景和无边框的情况下。唯一的缺点是线条的颜色永远不会改变,因此如果窗体的背景颜色发生变化,则可能需要调整线条的颜色。 - Peladao
不是我的观点。您正在使用图像来模拟本地绘制的控件。如果将来的Windows版本中本地绘制的控件发生更改并且外观不同,该怎么办?您之前的论点质疑了这种情况的可能性,但我的回应是看看“GroupBox”控件。在过去的几个Windows版本中,它已经发生了巨大的变化。如果您试图使用图像来模拟它,它看起来会过时和错误。这就是为什么这不是一个好方法的原因。 - Cody Gray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接