.net 如何更改面板边框颜色

c6ubokkw  于 2023-10-21  发布在  .NET
关注(0)|答案(6)|浏览(161)

Panel的属性中,我将边框样式设置为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);
}

这将显示如下边框:

但我想要一个固定的单一边界,像这样:

如何将边框设置为黄色?

jtjikinw

jtjikinw1#

如果你不想像@Sinatr的回答中建议的那样制作一个自定义面板,你可以自己绘制边框:

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

knpiaxh12#

您可以创建自己的Panel类并在客户区中绘制边框:

[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);
    }

}
ldfqzlk8

ldfqzlk83#

如果你不想麻烦地给一个面板划分子类,你可以创建另一个面板,每个尺寸大2个像素,使其成为边框颜色,并将其直接放置在需要边框的面板后面。这只是在IDE中点击几下...

xjreopfe

xjreopfe4#

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

u5i3ibmn

u5i3ibmn5#

这也对我起作用:

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

边框样式的问题是由于ButtonBorderStyle选项“Inset”。通过选择“ButtonBorderStyle.Solid”你得到一条线(也有点线,虚线.可用)。
对于许多面板,我同意最好的解决方案是创建自己的类,继承自Panel并覆盖Paint方法。

ghg1uchk

ghg1uchk6#

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

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

相关问题