标签后绘制额外的矩形

Extra rectangle gets drawn after label

我想将下面的彩色面板添加到我的表单中:

为此,我创建了自定义面板,它将根据单选按钮选择更改边框颜色。我的面板代码是

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. 创建了一个 parent 信息面板 2. 创建了一个 child 带有图片框的面板 3. parent 信息面板中的一个标签显示信息

现在,对于 parent 面板,我正在根据用户选择更改颜色 [back, border] 和文本,对于 child 面板,我不会更改边框颜色,但会根据用户选择更新背景颜色用户选择。

下面是更改面板颜色、图像、文本更新的代码:

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

注意:使用下一行字符显示多行标签文本

输出: 一切正常,但在标签文本的末尾,我得到了另一个矩形框。我想知道为什么会这样显示?我做错了吗?请帮我解决这个问题。

问题是您正在使用 e.ClipRectangle。它会通知您 控件的哪个部分 需要重绘。有时这只是控件的一小部分而不是整个控件(在您的情况下是额外矩形的区域)。始终绘制控件的完整矩形。

此外,您必须处理掉 PenSolidBrush。如果不这样做会导致内存泄漏。利用 using statement.

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