0

我刚刚开始将一个庞大的代码库转换为 FireMonkey,但我遇到了一些困难。

让我绊倒的一件事是 TControl.Canvas 的一个主要问题。如果我没有正确调用它,那么绘制到 TCanvas,实际上绘制到表单画布(具体来说,它在表单上的 0,0 处绘制,而不是我的自定义控件的客户端原点)。

例如,在 MouseMove 事件中,我需要绘制一个选择。这是一些示例代码:

procedure TMyCustomControl.MouseMove(Shift: TShiftState; sX, sY: Single);
begin
  inherited;

  ...
  Paint();
end;

procedure TMyCustomControl.Paint();
begin
  PaintToCanvas(Canvas);
end; 

在 FireMonkey 中使用此代码,绘画是到窗体(即在窗体上的 0,0 处输出)。

如果我将 MouseMove 中的代码更改为 Repaint(); 然后它会正确地绘制到我的控制之下。

显然,使用 FMX,我需要触发控件的实际绘制(而不是直接绘制),否则 Canvas 无效。

我需要的是解释为什么它会这样工作。我的代码中有很多画布绘图,所以我需要了解这一点,以便找出其他不兼容的代码。

系统:Delphi 10.3 Rio,32 或 64 位 Windows 应用程序。

4

0 回答 0