Как изменить цвет панели

IDE: Visual Studio, С#.net, Type = приложение для форм Windows

Привет, В свойствах панели Я установил стиль границы в 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);
}

он дает мне границу следующим образом:

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

и я хочу фиксированную единую границу следующим образом:

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

Я могу получить FixedSingle Border, но он находится в сером цвете, который по умолчанию используется системой или IDE.

Поэтому pls предлагают мне, как я делаю это в желтом цвете.

Ответ 1

Вы можете создать собственный класс 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);
    }

}

Ответ 2

Я нашел этот пост полезным:

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

Я также устанавливаю прокладку панели на толщину границы, чтобы элементы управления внутри панели не перекрывали границу и не скрывали ее. В моем случае я не использовал прокладку в противном случае, чтобы это было хорошее решение, но все может стать более сложным, если вы также планируете использовать дополнение для большего, чем просто показ границы...

Ответ 3

Если вы не хотите идти на поводу подклассификации панели, вы можете просто создать другую панель размером более 2 пикселей в каждом измерении, сделать ее цветом границы и поместить ее непосредственно за панелью, которая нуждается в границе, Это всего лишь несколько кликов в среде IDE...

Ответ 4

на тот случай, если вы не хотите создавать кастомную панель, как Синатра ответил:

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

Ответ 5

После обходного пути при создании моей пользовательской панели. Я был вынужден применить еще одну настройку, чтобы решить проблему перекрытия границ, когда размер дочернего элемента (ов)> размер панели. В настройках вместо панели, рисующей ее границу, она рисуется родительским элементом управления.

    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