【问题标题】:set panel border thickness in c# winform在c#winform中设置面板边框厚度
【发布时间】:2013-10-03 16:00:02
【问题描述】:

我进行了搜索,但结果无法解决我的问题。 实际上我有一个面板,我希望面板的边框比 Windows 给定的更厚。 我需要边框样式

BorderStyle.FixedSingle

更厚.. 谢谢之前

【问题讨论】:

  • 使用 Paint() 事件让它看起来像你想要的那样厚。
  • 这是duplicate。但是,这里接受的答案是唯一对我有用的答案。其他解决方案剪掉了右边框和下边框。

标签: c# winforms border formborderstyle thickness


【解决方案1】:

你必须用一点自定义绘画来自定义你自己的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的Size是在画线中间计算的,假设你画线的粗细为4,会有2外2内偏移.

我没有测试Hans 先生给出的案例,要修复它只需为您的panel1 处理事件SizeChanged,如下所示:

private void panel1_SizeChanged(object sender, EventArgs e){
   panel1.Invalidate();
}

您也可以使用Reflection 设置ResizeRedraw = true,而不必像上面这样处理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);

【讨论】:

  • 谢谢,这正是我想要的:D
  • 将面板停靠在右侧+底部并调整表单大小以查看是否出错。
  • @HansPassant 感谢您指出这一点,看起来在自定义控件时我们总是必须添加代码处理resizing
  • @KingKing 我的收藏中还有一个。
  • @HighCore 你一直在收集什么?不要告诉我你一直在收集winforms sample code 以便更好地学习它:)))
【解决方案2】:

要创建一个带边框的面板,我将一个面板放在一个面板中。 “边框面板”具有所需边框颜色的背景颜色和填充,而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;

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-13
      • 2013-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多