德尔福在屏幕上移动图像,从边缘反弹

时间:2013-07-15 15:45:12

标签: image delphi screensaver

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

到目前为止,使用GDIPLUS,我执行以下操作......

Image1: IGPImage; 
Image2: IGPImage;

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

并在OnPaint的{​​{1}}事件中按如下方式绘制。 TPaintBox组件将事件提供给TTimer Invalidate

TPaintBox

然而,结果并不完全令人满意,因为徽标闪烁了一点,屏幕上的移动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; 永远需要到达任何一侧。我不知道如何加快速度,同时保持徽标在屏幕上的平滑过渡。

我很感激我能得到的任何帮助。我目前在Windows XP上使用Delphi XE。

问候,彼得

1 个答案:

答案 0 :(得分:0)

我知道这是一个老问题,但是它应该得到答案。

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

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

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