C# 如何更改面板边框颜色

C# 如何更改面板边框颜色,c#,.net,winforms,drawing,C#,.net,Winforms,Drawing,在面板的属性中我已将边框样式设置为Fixed Single 当我运行我的应用程序时,它的颜色是灰色的。我不知道如何更改边框颜色 我在面板的Paint事件处理程序中尝试过这一点: private void HCp_Paint(object sender, PaintEventArgs e) { Panel p = sender as Panel; ControlPaint.DrawBorder(e.Graphics, p.DisplayRectangle, Color.Yellow

面板的属性中
我已将边框样式设置为
Fixed Single

当我运行我的应用程序时,它的颜色是灰色的。我不知道如何更改边框颜色

我在面板的
Paint
事件处理程序中尝试过这一点:

private void HCp_Paint(object sender, PaintEventArgs e)
{
    Panel p = sender as Panel;
    ControlPaint.DrawBorder(e.Graphics, p.DisplayRectangle, Color.Yellow, ButtonBorderStyle.Inset);
}
        
这将显示如下所示的边框:

但我想要一个固定的单边框,如下所示:


如何将边框设置为黄色?

您可以创建自己的
面板
类并在客户端区域绘制边框:

[System.ComponentModel.DesignerCategory("Code")]
public class MyPanel : Panel
{
    public MyPanel() 
    {
        SetStyle(ControlStyles.UserPaint | ControlStyles.ResizeRedraw | ControlStyles.DoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        using (SolidBrush brush = new SolidBrush(BackColor))
            e.Graphics.FillRectangle(brush, ClientRectangle);
        e.Graphics.DrawRectangle(Pens.Yellow, 0, 0, ClientSize.Width - 1, ClientSize.Height - 1);
    }

}
我觉得很有用


我还将面板的填充设置为边框的厚度,以便面板内的控件不会与边框重叠并隐藏边框。在我的例子中,我没有使用填充物,所以这是一个很好的解决方案,但是如果你计划使用填充物,而不仅仅是显示边框,事情可能会变得更加棘手…

如果你不想麻烦对一个面板进行分类,你可以再创建一个面板,每个维度大2像素,将其设置为边框颜色,并将其直接放在需要边框的面板后面。
只需在IDE中单击几下即可…

如果您不想按照中的建议制作自定义面板,您可以自己绘制边框:

private void panel1_Paint(object sender, PaintEventArgs e)
{
     ControlPaint.DrawBorder(e.Graphics, this.panel1.ClientRectangle, Color.DarkBlue, ButtonBorderStyle.Solid);
}

在创建我的自定义面板时经过一个变通方法。当子控件的大小>面板的大小时,我被迫应用另一个调整来解决边界重叠问题。 在调整中,不是面板绘制其边框,而是由父控件绘制其边框

    Public Class SharpPanel : Inherits Panel
      Sub New()
        Padding = New Padding(2)
        SetStyle(ControlStyles.SupportsTransparentBackColor, True)
        SetStyle(ControlStyles.ResizeRedraw, True)
        SetStyle(ControlStyles.UserPaint, True)
        SetStyle(ControlStyles.AllPaintingInWmPaint, True)
        SetStyle(ControlStyles.ContainerControl, True)
        SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
        SetStyle(ControlStyles.ContainerControl, True)
        Width = 100
        Height = 100
        TabStop = False
     End Sub
     Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
        MyBase.OnPaint(e)
        Dim p As Control = Me.Parent
        Dim gr As Graphics = p.CreateGraphics
        Dim rec As Rectangle = Me.ClientRectangle
        If Me.VerticalScroll.Visible Then
            rec.Width = rec.Width + SystemInformation.VerticalScrollBarWidth
        End If
        If Me.HorizontalScroll.Visible Then
            rec.Height = rec.Height + SystemInformation.HorizontalScrollBarHeight
        End If
        rec.Location = Me.Location
        rec.Inflate(1, 1)
        gr.DrawRectangle(New Pen(Color.Pink), rec)
End sub
End Class

这对我有用。但我有100多个面板。。。 必须有另一种方法来控制所有面板

private void HCp_Paint(object sender, PaintEventArgs e)
{
    Panel p = sender as Panel;
    ControlPaint.DrawBorder(e.Graphics, p.DisplayRectangle, Color.Yellow, ButtonBorderStyle.Inset);
}

这也对我起了作用:

private void HCp_Paint(object sender, PaintEventArgs e)
{
    Panel p = sender as Panel;
    ControlPaint.DrawBorder(e.Graphics, p.DisplayRectangle, Color.Yellow, ButtonBorderStyle.Solid);
}
边框样式的问题是由于ButtomOrderStyle选项“Inset”造成的。通过选择“ButtonOrderStyle.Solid”可以得到一条直线(也可以使用虚线、虚线)


对于许多面板,我同意最好的解决方案是创建您自己的继承自面板的类并覆盖绘制方法…

我经常在
OnPaintBackground
中添加边界绘制,以降低频率。您好,Sinatr,您能解释一下在哪里编写此代码吗?我不知道在哪里写这段代码我是新手,请告诉我整个过程。@JP程序员,
Dock.Fill
可以很容易地用锚定(设置内容控制位置并锚定
Left | Top | Right | Bottom
),这样内容就不会覆盖在客户端区域边界线上绘制的内容。不要使用
Dock.Fill
@Sinatr-我刚刚尝试了设置
位置
锚定
但无法轻松实现。设置位置允许显示左边框和上边框,但右边框和下边框重叠。我想我应该设置大小(并在面板调整大小时不断调整内容大小),以使其显示右边框和下边框?在我的例子中,我将面板的填充设置为边框的宽度,并使其工作(使用
Dock.Fill
Anchor
),这个答案是错误的。我不明白为什么我在Stackoverflow上发现了两个错误的答案,但都被投了赞成票?不得在客户区内绘制边框。边框是非客户端区域的一部分,如果您将其绘制到客户端区域,它将位于滚动条内,滚动时屏幕上会出现垃圾!这是一个很好的解决方案,但是当您的
面板中有
滚动条
时,会出现一个小问题。然后您还应该为
Scroll
事件创建处理程序。与调整大小相同。这个答案是错误的。我不明白为什么我在Stackoverflow上发现了两个错误的答案,但都被投了赞成票?不得在客户区内绘制边框。边框是非客户端区域的一部分,如果您将其绘制到客户端区域,它将位于滚动条内,滚动时屏幕上会出现垃圾!我不知道你对@Elmue有什么看法,但这个解决方案对我(显然还有其他人)非常有效。问题只是关于如何更改面板周围的边框颜色,而不是关于非客户端区域或滚动条(顺便说一句,您是否试图说客户端区域中的所有控件周围都不应该有边框??)。如果你能提供一个更好的解决方案,我们洗耳恭听,但我怀疑你只是喜欢滔滔不绝地批评,而自己却没有更好的答案。你对Windows编程的知识还不够。在Paint事件处理程序或OnPaint()中执行的任何操作都只会影响控件的客户端区域。但是滚动条是非客户端区域的一部分,面板是从ScrollableControl派生的!因此,如果您的控件有滚动条,您将在滚动条内绘制边框,这肯定是错误的解决方案。如果你想正确地做这件事,它要复杂得多。您必须处理WM_NCCALCSIZE来定义边框的宽度,并处理WM_NCPAINT来绘制边框。在MSDN中搜索并研究它!如果要控制厚度:private void panel 1u Paint(对象发送器,PaintEventArgs e){Color col=Color.DarkBlue;ButtonBorderStyle bbs=ButtonBorderStyle.Solid;int thickness=4;ControlPaint.DrawBorder(e.Graphics,this.panel 1.ClientRectangle,col,thickness,bbs,col,thickness,bbs,bbs,col,thickness,bbs);}