Установить толщину границы панели в 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:

Снимок экрана панели с толщиной границы 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;

Создайте новую панель чуть большего размера и установите цвет фона на Черный (или любой другой). Поместите оригинальную панель ВНУТРИ большей панели.

Другие вопросы по тегам