アイコン化のアニメーションを表示

(Delphi 4 以前用 Tips) よくある質問です。Delphi(C++Builder)でつくったアプリケーションはアイコン化ボタンを押してもアニメーションせずにアイコン化します。これにはあれこれ理由があり、解決策もあるんですがあれこれ大変みたいです。そうこうしているうちに本家Borlandのサイトにこれの解説および解決方法が掲載されたのでそちらをご覧ください。

と、思ったらサイトが更新されてページが無くなってしまいました。ですので下にその内容とほぼ同じ物を掲載しておきます。

Delphiのアプリケーションは、非表示のApplicationウィンドウがフォームを管理しており、最小化をしても、非表示の親ウィンドウApplicationが最小化されるので(メインウィンドウはこのとき非表示になる)、アニメーションは表示されない。 最小化、復元を行なうときに、フォームの上にぴったりのサイズで Applicationウィンドウを表示すれば、アニメーションを表示させることがでる。

(※ Delphi 5 からは標準でアニメーションするようになりました)

■ アイコン化アニメーションを表示する例
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes,
  Graphics,Controls, Forms, Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    procedure MyHandle(var Msg: TMsg; var Handled: Boolean);
    procedure WMSysCommand(var Msg: TMessage); 
      message WM_SYSCOMMAND;
    procedure MinimizeForm;
    procedure RestoreForm;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.MyHandle(var Msg: TMsg; var Handled: Boolean);
begin
  if (Msg.Message = WM_SYSCOMMAND)
     and (Msg.WParam = SC_RESTORE) then 
  begin
    RestoreForm;
    Handled := True;
  end;
end;

procedure TForm1.WMSysCommand(var Msg: TMessage);
begin
  if Msg.WParam = SC_MINIMIZE then
  begin
    MinimizeForm;
  end else begin
    inherited;
  end;
end;

procedure TForm1.MinimizeForm;
begin
  with Application do 
  begin
    SetForegroundWindow(Handle);
    SetWindowPos(Handle, HWND_BOTTOM,Left, Top, Width, 0, SWP_NOZORDER);
    ShowWindow(Handle, SW_MINIMIZE);
  end;
end;

procedure TForm1.RestoreForm;
begin
  with Application do 
  begin
    SetForegroundWindow(Handle);
    ShowWindow(Handle, SW_RESTORE);
    SetWindowPos(Handle, HWND_TOP, 0, 0, 0, 0, SWP_NOZORDER);
  end;
end;

{ FormのOnCreateイベント }
procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnMessage := MyHandle;
end;

end.

(Thanx : Mr.Abe)