Дополнительный прямоугольник рисуется после метки - PullRequest
0 голосов
/ 06 октября 2019

Я хочу включить цветную панель ниже в мою форму:

enter image description here

Для этого я создал пользовательскую панель, которая будет менять цвет границы на основеВыбор радиокнопки. Код моей панели

InfoPanel.cs

 class InfoPanel : Panel
 {
     private Color colorBorder = Color.Transparent;

     public InfoPanel()
         : base()
     {
         this.SetStyle(ControlStyles.UserPaint, true);
     }

     protected override void OnPaint(PaintEventArgs e)
     {
         base.OnPaint(e);
         e.Graphics.DrawRectangle(
             new Pen(
                 new SolidBrush(colorBorder), 2),
                 e.ClipRectangle);            
         e.Graphics.DrawLine(new Pen(new SolidBrush(colorBorder), 0), 50, 0, 50, 50); //drawing a line to split the child & parent info panel
     }

     public Color BorderColor
     {
         get
         {
             return colorBorder;
         }
         set
         {
             colorBorder = value;
         }
     }
 }

В моей форме 1. создан один родительский Info Panel 2. создан один дочерний модуль с полем Picture 3. Одна метка на родительской информационной панели для отображения информации

Теперь для родительской панели я меняю цвета [назад, граница] и текст на основе выбора пользователя, а для дочерней панели я не изменяю цвет границы, но обновляю обратноцвет зависит от выбора пользователя.

Ниже приведен код для изменения цвета панели, изображения, обновления текста:

private void rbIPAddress_CheckedChanged(object sender, EventArgs e)
{
    if (rbIPAddress.Checked)
    {                
        ParentInfoPanel.BackColor = System.Drawing.ColorTranslator.FromHtml("#FFFFEE");
        ParentInfoPanel.BorderColor = System.Drawing.ColorTranslator.FromHtml("#DADA85");
        ChildInfoPanel.BackColor = System.Drawing.ColorTranslator.FromHtml("#F6F6D8");
        InfoPanelPictureBox.Image = Template.InfoPanelInfoImage;
        Infolabel.Text = "IP Address is already configured. You can switch to Forward Lookup Zone by choosing other configuration. *IP Address \ncan be either LB IP Address.";
        txtBoxIPAddress.Enabled = true;
        textBoxPort.Enabled = true;   
    }
    else
    {
        Infolabel.Text = "";
        txtBoxIPAddress.Text = "";
        txtBoxIPAddress.Enabled = false;
        textBoxPort.Enabled = false;
    }
}

private void rbForwardLookupZone_CheckedChanged(object sender, EventArgs e)
{
    if (rbForwardLookupZone.Checked)
    {
        ParentInfoPanel.BackColor = System.Drawing.ColorTranslator.FromHtml("#FFFFEE");
        ParentInfoPanel.BorderColor = System.Drawing.ColorTranslator.FromHtml("#DADA85");
        ChildInfoPanel.BackColor = System.Drawing.ColorTranslator.FromHtml("#F6F6D8");
        InfoPanelPictureBox.Image = Template.InfoPanelInfoImage;
        Infolabel.Text = "Forward Lookup Zone is already configured. You can switch to IP Address by choosing other configuration and \nchanging port number will affect Firewall rules.";
        textBoxControlPlane.Enabled = true;

        if (string.IsNullOrEmpty(textBoxControlPlane.Text))
        {
            textBoxControlPlane.Text = Constants.DefaultControlPlaneDomain;
        }
    }
    else
    {
        Infolabel.Text = "";
        textBoxControlPlane.Text = "";
        textBoxControlPlane.Enabled = false;
    }
}

Примечание: использовался символ следующей строки для отображениятекст метки в несколько строк

Вывод: enter image description here enter image description here Все в порядке, но в конце текста метки я получаю еще одно прямоугольное поле. Мне интересно, почему так показывается? Я делаю не так? Пожалуйста помоги мне с этим.

1 Ответ

2 голосов
/ 06 октября 2019

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

Кроме того, вы должны избавиться от Pen и SolidBrush. Несоблюдение этого требования приводит к утечке памяти. Используйте оператор using .

using(SolidBrush brush = new SolidBrush(colorBorder))
using(Pen pen = new Pen(brush, 2))
{
    e.Graphics.DrawRectangle(pen, new Rectangle(0, 0, this.ClientSize.Width - 1, this.ClientSize.Height - 1));
    e.Graphics.DrawLine(pen, 50, 0, 50, 50);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...