WhatsThePoint
WhatsThePoint

Reputation: 3635

UI glitch when writing own group box

in my program i have a group box, i didnt like that the groupbx provided in visual studio doesnt have a border colour property so i used this code to create my own group box.

public class MyGroupBox : GroupBox
{
    private Color _borderColor = Color.Black;

    public Color BorderColor
    {
        get { return this._borderColor; }
        set { this._borderColor = value; }
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        //get the text size in groupbox
        Size tSize = TextRenderer.MeasureText(this.Text, this.Font);

        Rectangle borderRect = e.ClipRectangle;
        borderRect.Y = (borderRect.Y + (tSize.Height / 2));
        borderRect.Height = (borderRect.Height - (tSize.Height / 2));
        ControlPaint.DrawBorder(e.Graphics, borderRect, this._borderColor, ButtonBorderStyle.Solid);

        Rectangle textRect = e.ClipRectangle;
        textRect.X = (textRect.X + 6);
        textRect.Width = tSize.Width;
        textRect.Height = tSize.Height;
        e.Graphics.FillRectangle(new SolidBrush(this.BackColor), textRect);
        e.Graphics.DrawString(this.Text, this.Font, new SolidBrush(this.ForeColor), textRect);
    }
}

which works "fine", i got myself a black border group box instead of grey, except when the window is moved the group box glitches out like so, picture

is there a fix for this or will i have to use the visual studio group box to prevent this issue? i am using C# winforms

Upvotes: 1

Views: 75

Answers (1)

Ivan Stoev
Ivan Stoev

Reputation: 205629

The documentation for PaintEventArgs.ClipRectangle is misleading - Gets the rectangle in which to paint.. Actually this property represents the invalidated rectangle of the window, which is not always the full rectangle. It can be used to skip painting of elements that are outside that rectangle, but not as base for painting.

But the base rectangle for all painting should be the ClientRectangle property of the control being painted. So simply replace e.ClipRectangle with this.ClientRectangle.

Upvotes: 2

Related Questions