为什么在我使用Canvas时重写的Paint过程会一次又一次地调用自身?

Jav*_*vid 2 delphi

当我从此类开发自己的组件时遇到了这个问题:TImage 我使用了以下代码:

procedure Paint;override;
begin
inherited
canvas.TextOut(5,5,'Hi')
end;
Run Code Online (Sandbox Code Playgroud)

提前致谢

GJ.*_*GJ. 5

因为TImage是TGraphicControl的后代,并且Paint程序在WMPaint(windows WM_PAINT)消息内处理。因此,当您在TImage画布上绘制(在绘制过程中)时,Windows将发送WM_PAINT消息,并再次调用Paint。

编辑:一种方法是...

procedure TMyImage.Paint;
const
  Text = 'Hi';
begin
  inherited;
  Windows.ExtTextOut(Canvas.Handle, 5, 5, 0, nil, PChar(Text), Length(Text), nil);
end;
Run Code Online (Sandbox Code Playgroud)

由于Windows.ExtTextOut是API调用,因此不会发送WM_PAINT消息,例如...

canvas.TextOut(5,5,'Hi') 
Run Code Online (Sandbox Code Playgroud)

...内部调用FreeImage过程。