Firemonkey 的 TImage 优先级中的简单绘图

问题描述 投票:0回答:0

一件很奇怪的事情发生在我身上(至少对我来说很奇怪……)。 我已经在 Firemonkey 窗体上放置了一些 TImages,并且我已经将一些图像分配给它们的位图。 他们显示正常。 然后我添加了另一个 TImage,它是空的。 我正在尝试在 TImage.Canvas 中绘制一些形状,它似乎工作正常,因为我可以在很短的时间内看到带有形状的 TImage,之后带有我的绘图的 TImage 被表单删除并且只有那些“预加载”的 TImages 保持可见。 代码正在运行,因为我可以看到 TImage 的十分之一秒,然后它消失了,只是被表单背景取消了。 我究竟做错了什么? 这是代码

Procedure NDrawCircles(var IMGTarget: TImage; xc, yc, Radius: Integer; MyPen: MyPenType);
var
   MyRect: TRectF;
   CustPattern: Array [0 .. 7] of Single;
   i: Integer;
   MyDash, bsc : Integer;
   x1, y1, x2, y2 : Extended;
   V: Single;
Begin
   bsc := IMGTarget.Canvas.BeginSceneCount;
   if bsc = 0 then
      IMGTarget.Canvas.BeginScene;
   IMGTarget.Canvas.Stroke.Kind := TBrushKind.Solid;
   IMGTarget.Canvas.Stroke.Color := MyPen.Color;
   IMGTarget.Canvas.Stroke.Thickness := MyPen.Thickness;
   IMGTarget.Canvas.Stroke.Dash := MyPen.Dash;

   x1 := xc - Radius;
   y1 := yc - Radius;
   x2 := xc + Radius;
   y2 := yc + Radius;
   MyRect := TRectF.Create(x1, y1, x2, y2);
   bsc := IMGTarget.Canvas.BeginSceneCount;
   IMGTarget.Canvas.DrawEllipse(MyRect, MyPen.Opacita);
   bsc := IMGTarget.Canvas.BeginSceneCount;
   if bsc > 0 then
      IMGTarget.Canvas.EndScene;
end;

Procedure TConfiguraDignita.DrawBaseModel;
Type
   TCircleso = Record
        XC,YC : Single;
        R : Integer;
       MyPen : MyPenType;
   end;
Var i : Integer;
    Circles : Array[1..7] of TCircleso;
Begin
   for i := 1 to 7 do
   begin
      Circles[i].XC := TargetIMG.Width / 2;
      Circles[i].YC := TargetIMG.Height / 2;
      Circles[i].MyPen.Kind := TBrushKind.Solid;
      Circles[i].MyPen.Color := claBisque;
      Circles[i].MyPen.Dash := 1;
      Circles[i].MyPen.Opacita := 1.0;
   end;
   Circles[1].MyPen.Thickness := 4.0;
   Circles[2].MyPen.Thickness := 4.0;
   Circles[3].MyPen.Thickness := 4.0;
   Circles[4].MyPen.Thickness := 2.0;
   Circles[5].MyPen.Thickness := 2.0;
   Circles[6].MyPen.Thickness := 2.0;
   Circles[7].MyPen.Thickness := 2.0;

   Circles[1].R := 600;
   Circles[2].R := 550;
   Circles[3].R := 500;
   Circles[4].R := 450;
   Circles[5].R := 400;
   Circles[6].R := 350;

   For i := 1 to 7 do
      NDrawCircles(TargetIMG, Trunc(Circles[i].XC), Trunc(Circles[i].YC), Circles[i].R, Circles[i].MyPen);

   TargetIMG.Repaint;

End;

在 FormShow 中有一个 DrawBaseModel 过程的调用。 读取 bsc 是为了查看 beginescene 调用后 BeginScene 堆栈中是否有内容。

graphics firemonkey
© www.soinside.com 2019 - 2024. All rights reserved.