我需要将一些文本写入油漆盒,并在 OnPaint 事件中执行此操作。当我在方法中设置字体大小两次时,会重复调用 OnPaint 事件。

要亲自查看,请尝试以下操作:

  • 创建一个新的 VCL Forms 应用程序
  • 在表单
  • 上放置一个油漆盒
  • 将以下代码放入 OnPaint-event 中:

  • 过程 TForm1.PaintBox1Paint(Sender: TObject);
    开始
    PaintBox1.Canvas.MoveTo(random(PaintBox1.Width),random(PaintBox1.Height));
    PaintBox1.Canvas.LineTo(random(PaintBox1.Width),random(PaintBox1.Height));

    PaintBox1.Font.Size := 10;
    PaintBox1.Font.Size := 12;
    结尾;

    当您运行该应用程序时,您会在油漆盒上看到一条“跳跃”的线。但是,如果您删除设置字体大小的一行或两行,您将看到一条固定的行。

    为什么会发生这种情况,我可以做些什么来解决它?

    最佳答案

    设置 PaintBox1.Canvas.Font.Size 而不是 PaintBox1.Font.Size,您的问题将得到解决。

    至于它为什么会发生:改变一个控件的字体属性会导致它失效并重绘,并且在重绘的情况下这样做会导致无限循环。幸运的是,绘制事件是合成的,并且优先级低于其他消息,否则您的程序将挂起。

    关于delphi - 设置 Paintbox 的字体大小会导致调用 Paint,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3180096/

    10-13 02:44