如何使用 Canvas.CopyRect() 绘制 Timage 的新副本

Tom*_*Tom 0 delphi

我有一个代码可以在 timage 上绘制一条移动线,我希望以前的旧线总是消失,但是这段代码使所有线永远出现在那里......当我启用 DoubleBuffering 以形成时,下面的代码可以正常工作,但是位于 myimg 中的背景位图根本不显示。

  Fbitmap.Canvas.Pen.Color:=clRed;
  Fbitmap.Canvas.Pen.Width:=2;
  Fbitmap.Canvas.MoveTo(Xo,Yo);
  Fbitmap.Canvas.LineTo(Xs,Ys);
  myimg.Canvas.CopyRect(Rect(0, 0, Width, Height), FBitmap.Canvas, Rect(0, 0, Width, Height));
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 6

发生这种情况并不奇怪。TImage用于静态图像。当你在它的画布上画画时,你画的东西会留在那里。那是设计使然。

在我看来,您选择了错误的控件。明显的候选人是:

  • 一个TPaintBox。在OnPaint处理程序中绘制背景,然后绘制线条。
  • 一个自定义控件,它根据 绘制背景WM_ERASEBKGND,并根据绘制前景WM_PAINT

后一种选择对您来说可能有点矫枉过正,但根据我的经验,它是防止闪烁的最佳方法。