Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以c#winform设置面板边框厚度_C#_Winforms_Border_Formborderstyle_Thickness - Fatal编程技术网

以c#winform设置面板边框厚度

以c#winform设置面板边框厚度,c#,winforms,border,formborderstyle,thickness,C#,Winforms,Border,Formborderstyle,Thickness,我有搜索,结果不能解决我的问题。 实际上,我有一个面板,我希望面板有比给定窗口更厚的边框。 我需要有边框的款式 BorderStyle.FixedSingle 厚的。。 感谢您的光临,您需要定制自己的面板,只需稍加定制即可: //Paint event handler for your Panel private void panel1_Paint(object sender, PaintEventArgs e){ if(panel1.BorderStyle == BorderStyle

我有搜索,结果不能解决我的问题。 实际上,我有一个面板,我希望面板有比给定窗口更厚的边框。 我需要有边框的款式

BorderStyle.FixedSingle
厚的。。
感谢您的光临,您需要定制自己的
面板
,只需稍加定制即可:

//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
的面板的屏幕截图:

注意:矩形的大小是在绘制线的中间计算的,假设您绘制的线的厚度为
4
,则会有2个外部和2个内部的偏移

我没有测试Hans先生给出的案例,要解决它,只需为您的
面板1处理事件
SizeChanged
,如下所示:

private void panel1_SizeChanged(object sender, EventArgs e){
   panel1.Invalidate();
}
typeof(Control).GetProperty("ResizeRedraw", BindingFlags.NonPublic | BindingFlags.Instance)
               .SetValue(panel1, true, null);
您还可以使用
反射设置
ResizeRedraw=true
,而不必像上面那样处理
SizeChanged
事件:

private void panel1_SizeChanged(object sender, EventArgs e){
   panel1.Invalidate();
}
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);

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

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

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

这可以非常简单,可以在设计器中创建,也可以在代码隐藏中创建

代码隐藏:

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;

使用Paint()事件使其看起来像您想要的一样厚。这是一个。然而,这里被接受的答案是唯一对我有效的答案。其他解决方案剪掉了右边和底部的边框。谢谢,这正是我真正想要的:D点击右边+底部的面板,调整窗体大小,看看是否出错。@HansPassant谢谢你指出它,看起来,在自定义控件时,我们总是必须在我的集合中再添加一个代码处理
调整大小
@KingKing。@HighCore您收集了什么?请不要告诉我您一直在收集
winforms示例代码
,以便更好地学习:)