Как создать строку в приложении WinForms?

Я хочу создать простую 3D-линию в приложении WinForms, чтобы улучшить визуальное расположение макета формы. Эта строка очень похожа на строку в диалоговом окне О Windows (можно открыть в Проводнике Windows → Справка → О Windows).

Пример можно проверить здесь. Последняя строка (3D) является той, которую я хочу, а не первой.

Как это можно сделать на С# или Visual Basic (.NET)?

Спасибо

Ответ 1

Если вы используете утилиту ZoomIt от SysInternals, вы можете видеть, что это просто две строки. Темно-серый над белым. Линии рисования достаточно просты с помощью 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);
    }

Обратите внимание на использование кнопки 1 в этом коде, чтобы удостовериться, что линия нарисована на правильной высоте, даже когда форма перемасштабирована. Выберите свой собственный контроль в качестве ссылки для линии.

Ответ 2

Добавьте элемент управления Label с трехмерной рамкой и без текста установите высоту на 2.

Ответ 3

Я также использовал взлом GroupBox, и он получил преимущество стилизации в зависимости от темы границы ОС.

Существует также класс Line в VB Power Packs. Там есть еще несколько плюсов, которые мы тоже использовали.

Изменить: Здесь мой класс 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
        {
        }
    }
}

Ответ 4

Один из способов - создать групповой ящик без метки и высоты 0 (или это 1, не совсем помню). Я знаю, что раньше использовал этот трюк, даже если он чувствует себя немного взломанным:-)

Ответ 5

Вы можете получить эффект разделителя строк, добавив метку и установив ее текст в качестве подчеркивания "_"