为什么我在OnPaint中更改字体大小时会得到StackOverflowException

时间:2013-01-17 10:19:19

标签: c#

我尝试在运行时更改字体大小,如下面的代码,但我总是得到StackOverflowException

protected override void OnResize(EventArgs e)
{
    this.bitmapDoubleBuffer = new Bitmap(base.Width, base.Height);
    this.backGraphics = Graphics.FromImage(this.bitmapDoubleBuffer);
}

public void ReDrawRuntime()
{
    SizeF sizeF = this.backGraphics.MeasureString(this.Text, this.Font);
    if (sizeF.Width > this.Size.Width)
    {
        this.Font = new Font(this.Font.Name, 20, this.Font.Style);
        sizeF = this.backGraphics.MeasureString(this.Text, this.Font);
    }
    this.backGraphics.DrawString(this.Text, 
                this.Font, 
                this.solidBrushForeColor, 
                (float)((int)width), 
                (float)((int)height));
    this.graphicsDoubleBuffer.DrawImage(this.bitmapDoubleBuffer, 0, 0);
 }

1 个答案:

答案 0 :(得分:3)

原因是更改字体大小会增加文本drwn上控件的大小,这将会重新调整事件agin(查看this.Font =..,这!!),这将运行你的再次编码,概率(根据例外)将验证为true:

if (sizeF.Width > this.Size.Width)

再次出现条件等......

所以一般规则是:不要在OnResize内更改控件的形状,在其他地方执行。