1

私は単純なタスクを達成しようとしていますが、GDI+ を使用して例を見つけることができません。私のコードでは、画像の位置を変更する必要があります(より具体的には上)が、より良い方法でそれを行うことができるかどうかわかりません。これは私が今それを行う方法です:

procedure TForm2.Timer1Timer(Sender: TObject);
var
  I: Integer;
begin
  if image1.Top = -93 then
  Begin
    for I := -93 to -1 do
    Begin
    Sleep(10);
    image1.Top := Image1.Top + 1;
    Application.ProcessMessages;
  End;
End else if image1.Top = 0 then
Begin
  for I := 0 downto -92 do
  Begin
    Sleep(10);
    image1.Top := Image1.Top - 1;
    Application.ProcessMessages;
  End;
End;
end;

とてもシンプルですが、スムーズにはいきませんが、各ステップでジャンプして再描画します。

私はあなたの助けに感謝します。

更新: TLama と彼のインスピレーションのおかげで、デルファイ 2007 用のこのGDIPlus 実装を見つけました。

4

1 に答える 1

1

コントロールを移動することは、GDI+ に依存しない、何かをアニメーション化するための間違った方法です。代わりに、アニメーションのために変更したい位置を記憶し、OnTimerイベントでそれを変更し、ターゲット コントロールを無効にすることをシステムに伝える必要があります。次に、コントロールのOnPaintイベントで、その位置で必要なものをレンダリングする必要があります。

は主に静的な画像に使用され、動的なレンダリングには使用されないため、最初にTImageコンポーネントをに置き換えます。また、2 つのタイマーを使用します。1 つは上向きのアニメーション用で、もう 1 つは下向きのアニメーション用です。TPaintBoxTImage

次のコードは、タイマーの概算を考慮しておらず、あまり知られていないDelphi 2009 GDI+ LibraryDelphi のラッパーを使用しています。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, GdiPlus;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Timer2: TTimer;
    PaintBox1: TPaintBox;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure PaintBox1Paint(Sender: TObject);
  private
    GPImage: IGPImage;
    FImageTop: Integer;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FImageTop := 0;
  Timer1.Interval := 15;
  Timer2.Interval := 15;
  DoubleBuffered := True;
  Timer1.Enabled := True;
  Timer2.Enabled := False;
  GPImage := TGPImage.Create('d:\Image.jpg');
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  // no need for the following line since it's a reference of the interface
  // GPImage := nil;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if (FImageTop > -93) then
  begin
    FImageTop := FImageTop - 1;
    PaintBox1.Invalidate;
  end
  else
  begin
    Timer1.Enabled := False;
    Timer2.Enabled := True;
  end;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
  if (FImageTop < 0) then
  begin
    FImageTop := FImageTop + 1;
    PaintBox1.Invalidate;
  end
  else
  begin
    Timer2.Enabled := False;
    Timer1.Enabled := True;
  end;
end;

procedure TForm1.PaintBox1Paint(Sender: TObject);
var
  GPGraphics: IGPGraphics;
begin
  GPGraphics := TGPGraphics.Create(PaintBox1.Canvas.Handle);
  GPGraphics.DrawImage(GPImage, 0, FImageTop);
end;

end.
于 2013-03-24T04:07:09.080 に答える