Установить толщину границы панели в C# winform
Я ищу, и результат не может решить мою проблему. На самом деле у меня есть панель, и я хочу, чтобы у панели была более толстая граница, чем указано в Windows. Мне нужен BorderStyle
BorderStyle.FixedSingle
толще.. Спасибо, прежде чем
2 ответа
Вы должны настроить свой собственный Panel
с небольшой заказной росписью:
//Paint event handler for your Panel
private void panel1_Paint(object sender, PaintEventArgs e){
if(panel1.BorderStyle == BorderStyle.FixedSingle){
int thickness = 3;//it's up to you
int halfThickness = thickness/2;
using(Pen p = new Pen(Color.Black,thickness)){
e.Graphics.DrawRectangle(p, new Rectangle(halfThickness,
halfThickness,
panel1.ClientSize.Width-thickness,
panel1.ClientSize.Height-thickness));
}
}
}
Вот скриншот панели толщиной 30
:
ПРИМЕЧАНИЕ: размер Rectangle
рассчитывается в середине линии рисования, предположим, что вы рисуете линию с толщиной 4
, будет смещение 2 снаружи и 2 внутри.
Я не проверял дело, данное мистером Hans
, чтобы исправить это просто обработать событие SizeChanged
для тебя panel1
как это:
private void panel1_SizeChanged(object sender, EventArgs e){
panel1.Invalidate();
}
Вы также можете установить ResizeRedraw = true
с помощью Reflection
без необходимости обращаться с SizeChanged
событие, как указано выше, как это:
typeof(Control).GetProperty("ResizeRedraw", BindingFlags.NonPublic | BindingFlags.Instance)
.SetValue(panel1, true, null);
При изменении размера вы можете увидеть небольшое мерцание, просто добавьте этот код, чтобы включить doubleBuffered для вашей панели1:
typeof(Panel).GetProperty("DoubleBuffered",
BindingFlags.NonPublic | BindingFlags.Instance)
.SetValue(panel1,true,null);
Чтобы создать панель с рамкой, я помещаю панель в панель. "Панель границы" имеет цвет фона желаемого цвета границы и отступ, в то время какpadding
размер - желаемая граница thickness
.
Преимущество этого решения в том, что нет мерцания и проблем с изменением размера.
Это может быть очень просто создать в дизайнере или в программном коде.
Код позади:
Panel panel_Border = new Panel();
Panel panel_Embedded = new Panel();
panel_Border.BackColor = Color.Green;
panel_Border.Controls.Add(panel_Embedded);
// this is the border thickness
panel_Border.Padding = new System.Windows.Forms.Padding(6);
panel_Border.Size = new System.Drawing.Size(200, 100);
panel_Embedded.BackColor = System.Drawing.SystemColors.Control;
panel_Embedded.Dock = System.Windows.Forms.DockStyle.Fill;
Создайте новую панель чуть большего размера и установите цвет фона на Черный (или любой другой). Поместите оригинальную панель ВНУТРИ большей панели.