C# 我想让面板有一个厚的边框。我能把这个设定好吗?

C# 我想让面板有一个厚的边框。我能把这个设定好吗?,c#,winforms,visual-studio-2008,controls,C#,Winforms,Visual Studio 2008,Controls,我想让面板有一个厚的边框。我能把这个设定好吗 另外,我用的是C。与2008年相比。吉姆 我制作了一个用户控件,并给出了一个ParentControlDesigner。正如我在评论中指出的,这并不是一个完美的解决方案。但这应该是一个很好的起点。哦,仅供参考,我也有一个可定制的边框颜色。我是受另一个SO帖子的启发来追求这个。。。这比我想象的要复杂。 要在设置边框大小时正确地重新排列,需要调用PerformLayout。OnResize中对DisplayRectangle的替代和对SetDisplay

我想让面板有一个厚的边框。我能把这个设定好吗

另外,我用的是C。与2008年相比。

吉姆

我制作了一个用户控件,并给出了一个ParentControlDesigner。正如我在评论中指出的,这并不是一个完美的解决方案。但这应该是一个很好的起点。哦,仅供参考,我也有一个可定制的边框颜色。我是受另一个SO帖子的启发来追求这个。。。这比我想象的要复杂。 要在设置边框大小时正确地重新排列,需要调用PerformLayout。OnResize中对DisplayRectangle的替代和对SetDisplayRectLocation的调用会导致子控件的正确重新定位。此外,在最左上方时,子控件没有预期的“0,0”。。。除非边框宽度设置为0。。。OnPaint提供了边界的自定义图形

祝你好运!制作作为父控件的自定义控件很棘手,但并非不可能

[Designer(typeof(ParentControlDesigner))]
public partial class CustomPanel : UserControl
{
    Color _borderColor = Color.Blue;
    int _borderWidth = 5;

    public int BorderWidth
    {
        get { return _borderWidth; }
        set { _borderWidth = value; 
            Invalidate();
            PerformLayout();
        }
    }

    public CustomPanel()  { InitializeComponent(); }

    public override Rectangle DisplayRectangle
    {
        get 
        { 
            return new Rectangle(_borderWidth, _borderWidth, Bounds.Width - _borderWidth * 2, Bounds.Height - _borderWidth * 2); 
        }
    }

    public Color BorderColor
    {
        get { return _borderColor; }
        set { _borderColor = value; Invalidate(); }
    }

    new public BorderStyle BorderStyle
    {
        get { return _borderWidth == 0 ? BorderStyle.None : BorderStyle.FixedSingle; }
        set  { }
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaintBackground(e);
        if (this.BorderStyle == BorderStyle.FixedSingle)
        {
            using (Pen p = new Pen(_borderColor, _borderWidth))
            { 
                Rectangle r = ClientRectangle; 
                // now for the funky stuff...
                // to get the rectangle drawn correctly, we actually need to 
                // adjust the rectangle as .net centers the line, based on width, 
                // on the provided rectangle.
                r.Inflate(-Convert.ToInt32(_borderWidth / 2.0 + .5), -Convert.ToInt32(_borderWidth / 2.0 + .5));
                e.Graphics.DrawRectangle(p, r);
            }
        }
    }

    protected override void OnResize(EventArgs e)
    {
        base.OnResize(e);
        SetDisplayRectLocation(_borderWidth, _borderWidth);
    }
}

这是一种操纵它,但我总是只使用一个标签,每边的边界。您必须将autosize属性设置为false,并在每一侧(左、右、上、下)停靠一个。然后只需设置宽度/高度/背景色即可


您可以轻松地将其设置为用户控件,只需公开一些自定义公共属性即可设置宽度/高度以及所有标签的背景色,以更改颜色。

只需实现面板的绘制事件并绘制边框即可。例如:

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.VisualStyles;

namespace WindowsFormsApplication1 {
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
      panel1.Paint += panel1_Paint;
    }
    VisualStyleRenderer renderer = new VisualStyleRenderer(VisualStyleElement.Button.PushButton.Normal);

    private void panel1_Paint(object sender, PaintEventArgs e) {
      renderer.DrawEdge(e.Graphics, panel1.ClientRectangle,
        Edges.Bottom | Edges.Left | Edges.Right | Edges.Top,
        EdgeStyle.Raised, EdgeEffects.Flat);
    }
  }
}

玩弄这些论点,找到你喜欢的东西。如果未启用视觉样式,则应添加代码以回退到ControlPaint.DrawBorder。Meh.

如果这只是演示文稿,请放置一个面板,用您想要的边框颜色的背景色和填充的驳接样式填充表单。在此面板内放置另一个具有标准背景色和停靠填充样式的面板。使用两个面板的填充和边距来获得所需的边框大小(我忘记了哪个参数正确应用于内面板和外面板)。将控件放置在内部面板上。当两个面板都设置为Dock=Fill时,表单大小调整将自动为您处理。您可能需要尝试一些控件,但我已经做了很多次,应用程序主窗口和弹出窗体都没有问题。

这是一篇老文章,但我仍然觉得它很有用。我刚刚发现



我昨天晚上刚做了一件类似的事。但它有点有限。如果控件的Minsize比面板大,导致它切断底部和右侧边框,这有关系吗?这是什么UI?WinForms?WPF?ASP.Net?哦,好问题。我想没关系。克里斯,这是另一个好问题。这是winforms。@jim,我将在回答中发布代码。如果我的控件的“最小大小”大于我的自定义面板(用户控件?),您的解决方案会发生什么情况。因为所有标签都在面板内部停靠,所以这一切都取决于面板的显示方式。你能解释一下你所说的“最小尺寸”比面板大是什么意思吗?我脑子里想不出一个好例子…@迈尔斯,我猜他的意思是我用几乎相同的词向他描述的。。。基本上,如果您将子控件的最小大小设置为100x100;然后将其停靠以填充。现在将父面板的大小调整为50x50。在我的“解决方案”中,子控件仍然相对于左上角正确放置,但右下角的绘制被子控件剪裁。。。我还在努力解决这个问题。。。当然我可能错了。。。他可能是别的意思。啊,我明白了。我的可能不会引起什么问题。Nobugs的答案看起来是最好的。可能有很多清洁剂,嗯。。。不完全是我所希望的。我会等着看是否有更好的答案。如果不是,我会接受这个。回答得好!这就是为什么我爱你。过去没有像这样的示例代码的日子要过得艰难得多。@nobugz,尝试在面板中放置一个控件,然后将其停靠以填充。您将看到,子控件使边界的绘制变得混乱。我最初尝试了这种方法,因为它似乎是合适的。但是,如果不重新定位显示矩形并调整其大小,停靠的--fill控件将阻止查看自定义边框。请使用面板的Padding属性保留足够的空间,以便边框可见。nvm。它和Jason Ds的东西有同样的问题。它只接受属性设置。所以它更简单,但没有更好。对不起。你的更简单。我先在任何地方使用他的代码。因此,当我的代码有相同的基本问题时,改变我的代码来使用你的方法是没有意义的。我不建议使用此渲染创建边,因为它会使底部比顶部厚。最好使用“绘制边框”或“仅绘制线条”我必须记住检查覆盖
ControlPaint.DrawBorder(e.Graphics, control.ClientRectangle,
                        Color.Black, BORDER_SIZE, ButtonBorderStyle.Inset,
                        Color.Black, BORDER_SIZE, ButtonBorderStyle.Inset,
                        Color.Black, BORDER_SIZE, ButtonBorderStyle.Inset,
                        Color.Black, BORDER_SIZE, ButtonBorderStyle.Inset);