Я хочу создать простую 3D строку в приложении WinForms для улучшения визуального расположения моего макета формы. Эта строка является exacly как строка приблизительно в диалоговом окне Windows (может быть открыт в Windows Explorer-> Справка-> О Windows).
Пример быть проверенным здесь. Последняя (3D) строка является той, которую я хочу, не первый.
Как это может быть сделано в C# или Visual Basic (.NET)?
Спасибо
Если вы воспользуетесь утилитой 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);
}
Обратите внимание на использование кнопки button1 в этом коде, чтобы убедиться, что линия рисуется с правильной высотой, даже когда форма масштабируется. Выберите свой собственный элемент управления в качестве ссылки для линии.
Один из способов - создать групповой блок без метки и высотой 0 (или это 1, не совсем помню). Я знаю, что использовал этот трюк раньше, даже если он кажется немного взломанным: -)
Я тоже использовал GroupBox hack, и у него есть преимущество - он сам себя стилизует на основе темы границ ОС.
В коллекции элементов управления VB Power Packs также есть класс Line. Там есть еще несколько полезных элементов, которые мы тоже использовали.
Edit: Вот мой класс 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
{
}
}
}