我刚刚开始将一个庞大的代码库转换为 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 应用程序。