在c#winform中设置面板边框厚度

时间:2013-10-03 16:00:03

标签: c# winforms border formborderstyle thickness

我有搜索,结果无法解决我的情况。 实际上我有一个面板,我希望面板的边框比Windows更厚。 我需要BorderStyle

BorderStyle.FixedSingle

较厚.. 先谢谢

3 个答案:

答案 0 :(得分:17)

您必须使用一些自定义绘画自定义您自己的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);

调整大小时可能会看到一点闪烁,只需添加此代码即可为panel1启用doubleBuffered:

typeof(Panel).GetProperty("DoubleBuffered",
                          BindingFlags.NonPublic | BindingFlags.Instance)
             .SetValue(panel1,true,null);

答案 1 :(得分:0)

创建一个稍大的新面板,并将背景颜色设置为黑色(或其他)。将原始面板放在较大的面板内。

答案 2 :(得分:0)

要创建带有边框的面板,请在面板中放置一个面板。 “边界面板”具有所需边框颜色的背景色和填充,而padding的大小是所需边框thickness

此解决方案的优点是没有闪烁,并且调整大小没有问题。

enter image description here

enter image description here

这可以非常简单地在设计器中或在后面的代码中创建。

后面的代码:

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;