动画关闭窗口的示例
【打印文章】
可以像QQ一样实现最小化窗口时窗口到系统栏的动画效果。
Unit main;
Interface
Uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
RXShell, StdCtrls;
Type TZoomDirection = (ZoomFormOpen, ZoomFormClosed);//枚举类型
Type
TFormMain = Class(TForm)
TrayIcon1: TRxTrayIcon;//Rx组件里的系统栏图标控件
Label1: TLabel;
Procedure FormShow(Sender: TObject);
procedure TrayIcon1DblClick(Sender: TObject);
Private
Procedure OnMinCmd(Var Message: Tmessage); Message WM_SYSCOMMAND; //捕获消息
Procedure FrmZoomToTray(Frm: TForm; Direction: TZoomDirection); //产生窗体从系统工作区中进入或出来的动态效果子过程
Public
{ Public declarations }
End;
Var
FormMain: TFormMain;
Implementation
{$R *.DFM}
Procedure TFormMain.FormShow(Sender: TObject);
Begin
ShowWindow(Application.Handle, SW_HIDE);//消除任务栏显示
End;
Procedure TFormMain.OnMinCmd(Var Message: Tmessage);
Begin
If (Message.WParam = SC_MINIMIZE) Then //如果是最小化消息
Begin
TrayIcon1.Active := True; //显示图标
FrmZoomToTray(FormMain,ZoomFormClosed);
FormMain.Hide; //隐藏窗体
Exit;
End;
Inherited; //让窗体处理其它消息
End;
Procedure TFormMain.FrmZoomToTray(Frm: TForm; Direction: TZoomDirection);
Var
TrayWnd: HWND;
sClassName: Array[0..255] Of Char;
xFrom, xTo: TRect;
Begin
If (Direction = ZoomFormClosed) And (Frm.Visible = False) Then
Exit;
If (Direction = ZoomFormOpen) And (Frm.Visible = True) Then
Exit;
TrayWnd := FindWindow('Shell_TrayWnd', Nil);
TrayWnd := GetWindow(TrayWnd, GW_CHILD);
Repeat
GetClassName(TrayWnd, @sClassName, 255);
If StrPas(sClassName) = 'TrayNotifyWnd' Then
Break;
TrayWnd := GetWindow(TrayWnd, GW_HWNDNEXT);
Until TrayWnd = 0;
Case Direction Of
ZoomFormOpen:
Begin
GetWindowRect(TrayWnd, xFrom);
xFrom.Left := (xFrom.Right - (xFrom.Right - xFrom.Left) Div 2);
xFrom.Right := xFrom.Left + 1;
GetWindowRect(Frm.Handle, xTo);
DrawAnimatedRects(Frm.Handle, IDANI_OPEN Or IDANI_CAPTION, xFrom, xTo);
End;
ZoomFormClosed:
Begin
GetWindowRect(Frm.Handle, xFrom);
GetWindowRect(TrayWnd, xTo);
xTo.Left := (xTo.Right - (xto.Right - xTo.Left) Div 2);
xTo.Right := xTo.Left + 1;
DrawAnimatedRects(Frm.Handle, IDANI_CLOSE Or IDANI_CAPTION, xFrom, xTo);
End;
End;
End;
procedure TFormMain.TrayIcon1DblClick(Sender: TObject);
begin
TrayIcon1.Active := False;
FrmZoomToTray(FormMain,ZoomFormopen);
FormMain.Show;
end;
End.
Unit main;
Interface
Uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
RXShell, StdCtrls;
Type TZoomDirection = (ZoomFormOpen, ZoomFormClosed);//枚举类型
Type
TFormMain = Class(TForm)
TrayIcon1: TRxTrayIcon;//Rx组件里的系统栏图标控件
Label1: TLabel;
Procedure FormShow(Sender: TObject);
procedure TrayIcon1DblClick(Sender: TObject);
Private
Procedure OnMinCmd(Var Message: Tmessage); Message WM_SYSCOMMAND; //捕获消息
Procedure FrmZoomToTray(Frm: TForm; Direction: TZoomDirection); //产生窗体从系统工作区中进入或出来的动态效果子过程
Public
{ Public declarations }
End;
Var
FormMain: TFormMain;
Implementation
{$R *.DFM}
Procedure TFormMain.FormShow(Sender: TObject);
Begin
ShowWindow(Application.Handle, SW_HIDE);//消除任务栏显示
End;
Procedure TFormMain.OnMinCmd(Var Message: Tmessage);
Begin
If (Message.WParam = SC_MINIMIZE) Then //如果是最小化消息
Begin
TrayIcon1.Active := True; //显示图标
FrmZoomToTray(FormMain,ZoomFormClosed);
FormMain.Hide; //隐藏窗体
Exit;
End;
Inherited; //让窗体处理其它消息
End;
Procedure TFormMain.FrmZoomToTray(Frm: TForm; Direction: TZoomDirection);
Var
TrayWnd: HWND;
sClassName: Array[0..255] Of Char;
xFrom, xTo: TRect;
Begin
If (Direction = ZoomFormClosed) And (Frm.Visible = False) Then
Exit;
If (Direction = ZoomFormOpen) And (Frm.Visible = True) Then
Exit;
TrayWnd := FindWindow('Shell_TrayWnd', Nil);
TrayWnd := GetWindow(TrayWnd, GW_CHILD);
Repeat
GetClassName(TrayWnd, @sClassName, 255);
If StrPas(sClassName) = 'TrayNotifyWnd' Then
Break;
TrayWnd := GetWindow(TrayWnd, GW_HWNDNEXT);
Until TrayWnd = 0;
Case Direction Of
ZoomFormOpen:
Begin
GetWindowRect(TrayWnd, xFrom);
xFrom.Left := (xFrom.Right - (xFrom.Right - xFrom.Left) Div 2);
xFrom.Right := xFrom.Left + 1;
GetWindowRect(Frm.Handle, xTo);
DrawAnimatedRects(Frm.Handle, IDANI_OPEN Or IDANI_CAPTION, xFrom, xTo);
End;
ZoomFormClosed:
Begin
GetWindowRect(Frm.Handle, xFrom);
GetWindowRect(TrayWnd, xTo);
xTo.Left := (xTo.Right - (xto.Right - xTo.Left) Div 2);
xTo.Right := xTo.Left + 1;
DrawAnimatedRects(Frm.Handle, IDANI_CLOSE Or IDANI_CAPTION, xFrom, xTo);
End;
End;
End;
procedure TFormMain.TrayIcon1DblClick(Sender: TObject);
begin
TrayIcon1.Active := False;
FrmZoomToTray(FormMain,ZoomFormopen);
FormMain.Show;
end;
End.
本栏文章均来自于互联网,版权归原作者和各发布网站所有,本站收集这些文章仅供学习参考之用。任何人都不能将这些文章用于商业或者其他目的。( Pfan.cn )
【编程爱好者论坛】