在我的程序中,我有一个分组框,我不喜欢Visual Studio中提供的groupbx不具有边框颜色属性,因此我使用此代码创建了自己的分组框。

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


效果很好,我得到了一个黑色边框组框,而不是灰色框,除非在移动窗口时,该组框会像这样出现故障,c# - 编写自己的分组框时出现UI故障-LMLPHP

有没有解决的办法,还是我必须使用Visual Studio组框来防止此问题?我正在使用C#winforms

最佳答案

PaintEventArgs.ClipRectangle的文档具有误导性-获取在其中绘制的矩形。实际上,此属性表示窗口的无效矩形,它并不总是完整的矩形。它可用于跳过对该矩形外部的元素的绘制,但不能用作绘制的基础。

但是,所有绘制的基本矩形应该是要绘制的控件的ClientRectangle属性。因此,只需将e.ClipRectangle替换为this.ClientRectangle

关于c# - 编写自己的分组框时出现UI故障,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43495354/

10-12 00:11