当用户绘制的控件大小增加时,新区域不会重新绘制

TX_*_*TX_ 6 .net c# drawing winforms

我想我在这里缺少一些微不足道的东西.我直接从中导出了简单的控件Control.我正在覆盖OnPaint并绘制矩形(e.Graphics.DrawRectangle)和其中的文本(e.Graphics.DrawString).我没有覆盖任何其他成员.

当控件调整到较小的尺寸时,它会很好地自我绘制,但是当它被调整到更大的尺寸时,新区域不会被正确重新绘制.一旦我再次将其调整为较小的尺寸,即使按一个像素,一切都正确重新绘制.

OnPaint被正确调用(正确PaintEventArgs.ClipRectangle设置到新区域),但无论如何都不会绘制新区域(出现工件).

我错过了什么?

编辑:

码:

protected override void OnPaint(PaintEventArgs e)
{
    // Adjust control's height based on current width, to fit current text:

    base.Height = _GetFittingHeight(e.Graphics, base.Width);

    // Draw frame (if available):

    if (FrameThickness != 0)
    {
        e.Graphics.DrawRectangle(new Pen(FrameColor, FrameThickness),
            FrameThickness / 2, FrameThickness / 2, base.Width - FrameThickness, base.Height - FrameThickness);
    }

    // Draw string:

    e.Graphics.DrawString(base.Text, base.Font, new SolidBrush(base.ForeColor), new RectangleF(0, 0, base.Width, base.Height));
}

private int _GetFittingHeight(Graphics graphics, int width)
{
    return (int)Math.Ceiling(graphics.MeasureString(base.Text, base.Font, width).Height);
}
Run Code Online (Sandbox Code Playgroud)

WTF?

Lar*_*ech 11

尝试在构造函数中添加:

public MyControl() {
  this.ResizeRedraw = true;
  this.DoubleBuffered = true;
}
Run Code Online (Sandbox Code Playgroud)

并在您的绘画事件中,清除上一张图:

protected override void OnPaint(PaintEventArgs e) {
  e.Graphics.Clear(SystemColors.Control);
  // yada-yada-yada
}
Run Code Online (Sandbox Code Playgroud)