2013-10-03 9 views
4

У меня есть поиск и результат не может решить мой случай. На самом деле у меня есть панель, и я хочу, чтобы панель имела более толстую границу, чем Windows. мне нужно BorderStyleустановить панель границы толщина в C# winform

BorderStyle.FixedSingle 

толще .. Благодаря перед тем

+1

Используйте событие Paint(), чтобы оно выглядело так густо, как вы хотите. –

+0

Это [дубликат] (http://stackoverflow.com/questions/1852829/i-want-to-make-a-panel-have-a-thick-border-can-i-set-this-somehow) , Тем не менее, принятый ответ здесь - единственный, который работал для меня. Другие решения обрезаны с правой и нижней границ. – nunzabar

ответ

14

Вы должны настроить свой собственный 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:

Screen shot of panel with border thickness of 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); 
+0

Спасибо, вот что я хочу: D – rifleon

+3

Прикрепите панель справа + снизу и измените размер формы, чтобы увидеть, как это пошло не так. –

+0

@HansPassant спасибо за указание, похоже, при настройке управления нам всегда нужно добавлять обработку кода 'resizing'. –

0

Создайте новую, чуть большую панель и установите цвет фона на черный (или что-то еще). Поместите оригинальную панель ВНУТРИ БОЛЬШОЙ панели.