如何更改面板边框颜色

时间:2014-01-08 12:47:28

标签: c# .net winforms drawing

IDE:Visual Studio,C#.net,Type = Windows表单应用程序

嗨,在面板属性中,我已将边框样式设置为“固定单一” 当我运行我的应用程序时,它给我灰色。我不知道如何更改边框颜色。 我尝试过面板的Paint事件

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

它给我这样的边界:

http://i772.photobucket.com/albums/yy9/yogeshkmrsoni/giving_zps877730fc.png

我希望像这样固定单边框:

http://i772.photobucket.com/albums/yy9/yogeshkmrsoni/want_zps081e3591.png

我能够获得FixedSingle Border,但它是灰色的,默认为系统或IDE。

所以请告诉我如何用黄色制作它。

7 个答案:

答案 0 :(得分:11)

您可以在客户区创建自己的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);
    }

}

答案 1 :(得分:5)

我觉得这篇文章很有用:

https://vicky4147.wordpress.com/2007/03/04/how-to-draw-a-custom-border-around-a-form-or-control/

我还将面板的填充设置为边框的粗细,以便面板内的控件不会与边框重叠并隐藏它。在我的情况下,我没有使用填充,否则这是一个很好的解决方案,但如果你还计划使用填充不仅仅是显示边框,事情可能会变得更加棘手......

答案 2 :(得分:4)

如果您不想解决对面板进行子类化的问题,您可以在每个维度上创建另外两个大于2像素的面板,使其成为边框颜色并将其直接放在需要边框的面板后面。 这只是IDE中的几次点击......

答案 3 :(得分:4)

以防万一您不想将自定义面板设置为 Sinatra 回答:

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

答案 4 :(得分:0)

创建我的自定义面板后的解决方法。当子控件的大小>面板的大小时,我不得不进行另一项调整以解决边框重叠问题。 在此调整中,不是由面板绘制边框,而是由父控件绘制边框。

    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

答案 5 :(得分:0)

这也对我有用:

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

边框样式的问题是由于ButtomBorderStyle选项“Inset”。通过选择“ButtonBorderStyle.Solid”,您会得到一条线(也可以使用虚线、虚线...)。

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

答案 6 :(得分:-1)

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

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