1

我以前没有真正使用过图形,但我需要设计一个动画的屏幕保护程序,即。在屏幕上移动公司徽标,从侧面反弹。

到目前为止,使用 GDIPLUS,我做了以下......

Image1: IGPImage; 
Image2: IGPImage;

Image1 := TGPImage.Create('background.png');
Image2 := TGPImage.Create('logo.png');

并绘制如下,OnPaint如果 a TPaintBoxTTimer组件将事件提供InvalidateTPaintBox.

procedure TFormMain.PaintBox1Paint(Sender: TObject);
var
  GPGraphics: IGPGraphics;
  i: integer;
begin
  GPGraphics := TGPGraphics.Create(PaintBox1.Canvas.Handle);

  //Restore the background
  GPGraphics.DrawImage(Image1, 0, 0);

  // Determine the next position of the logo
  // We will also determine here if we are at the edges (not shown)
  X := X + 1;
  Y := Y + 1;

  // Draw the logo somewhere on the screen
  GPGraphics.DrawImage(Image2, X, Y);
end;

然而,结果并不完全令人满意,因为徽标会闪烁一点,并且屏幕上的移动(1680x1050 pixels, 32 bit colour)需要永远到达任何一侧。我不知道如何在保持徽标在屏幕上平滑过渡的同时加快速度。

我目前在 Windows XP 上使用 Delphi XE。

4

1 回答 1

0

我知道这是一个老问题,但值得回答。

为避免 GDI+ 闪烁,与许多其他图形系统一样,您需要将完整的图像投射到屏幕上。

在您的情况下,这意味着您必须创建一个具有屏幕大小的位图,为该位图绘制背景,然后在该位图上绘制您喜欢的任何图像,最后在屏幕上绘制该位图。这根本不会轻弹。

当然,位图只需创建一次并随意重复使用。OnPaint 将绘制该位图。在其他地方,您的计时器例程,您在位图中绘制然后使窗口无效,这反过来将触发 OnPaint 事件。

于 2020-10-24T18:46:46.680 回答