Как добавить настраиваемую границу к форме FormBorderStyle = None?

У меня есть форма со свойством FormBorderStyle, установленным на «Нет», и с настраиваемой панелью вверху для перетаскивания и кнопок.

Теперь я хотел бы сделать форму рамкой, потому что это дочерняя форма, а родительская форма имеет тот же цвет фона, что и дочерняя форма, поэтому дочернюю форму трудно увидеть. И нет, я не могу / не хочу менять цвет фона.

Помощь


person Zoef    schedule 25.01.2013    source источник
comment
Фиксированы ли ширина и высота формы?   -  person Steve    schedule 25.01.2013


Ответы (5)


Существует способ без необходимости устанавливать фоновое изображение и / или форму фиксированного размера. Думаю, это наиболее правильный и простой способ. Допустим, у вас есть форма с именем Form1, все, что вам нужно сделать, это:

Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    ControlPaint.DrawBorder(e.Graphics, e.ClipRectangle, Color.Black, ButtonBorderStyle.Solid)
End Sub

Альтернатива, если вы хотите использовать границу по умолчанию, предоставленную вашей версией Windows:

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    Me.FormBorderStyle = Windows.Forms.FormBorderStyle.Sizable
    Me.Text = ""
    Me.ControlBox = False
End Sub
person theGD    schedule 25.01.2013
comment
Я попробовал ваш первый метод, но событие рисования не запускается при загрузке формы. - person Zoef; 26.01.2013
comment
Nvm, если на форме есть панели, то не красит. - person Zoef; 26.01.2013
comment
Первый подход может дать вам очень красивую четкую границу с шириной в один пиксель. Я использовал этот подход в WinForms C # /. NET 4.5.2 и обнаружил, что обработчик отрисовки формы вызывается для каждого дочернего элемента в форме. Поэтому я добавил if (e.ClipRectangle.X == 0) перед ControlPaint.DrawBorder, чтобы гарантировать, что только форма получает границу. - person J.T. Taylor; 09.10.2015

Вы можете использовать пакеты Power Pack для Visual Basic .NET, которые можно загрузить здесь. У него есть этот элемент управления под названием LineShape, который вы можете поместить на края вашей формы без полей, как эта программа, над которой я сейчас работаю. Обратите внимание, что границы формы - это просто LineShape.

Северная граница - это просто LineShape с BorderWidth, установленным на 60, а BorderWidth других границ установлены на 10.

person Francis Rubio    schedule 11.09.2016

Может быть, вы можете использовать BackgroundImage прозрачный, за исключением границ.

person SysDragon    schedule 25.01.2013

Вы можете использовать это в событии рисования формы:

ControlPaint.DrawBorder(e.Graphics, Me.ClientRectangle, Color.Black, ButtonBorderStyle.Solid)

Это будет рисовать только границу клиента, также если вы изменяете размер формы или максимизируете форму, используйте Me.Refresh() в событиях изменения размера формы, чтобы форма перерисовывала свои границы.

person Pure    schedule 06.01.2016

Увидев ответ от theGD, я сделал то же самое для TableLayouPanel в форме:

Private Sub TableLayoutPanel1_Paint(sender As Object, e As PaintEventArgs) Handles TableLayoutPanel1.Paint
    ControlPaint.DrawBorder(e.Graphics, e.ClipRectangle, Color.DarkOrange, ButtonBorderStyle.Solid)
End Sub
person TLearnC    schedule 19.10.2016