如何实现NetAnts中通知窗口的动画效果(窗口渐渐打开,渐渐关闭)(200分)

  • 主题发起人 主题发起人 wuzhongl
  • 开始时间 开始时间
W

wuzhongl

Unregistered / Unconfirmed
GUEST, unregistred user!
在NetAnts程序中,在完成一个下载任务或一个下载任务发生错误时,
出现一个通知窗口,该窗口渐渐打开,渐渐关闭。
请问,在DELPHI中如何实现?
 
检索一下以前的答案,有过讨论。好象是AnimateWindow
 
来自:cee 时间:00-12-13 0:51:17 ID:416772
在form上胡乱放些控件,然后
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
AutoScroll := False;
repeat
ScaleBy (93, 100);
Application.ProcessMessages;
until Height < 70;
end;



来自:烂泥 时间:00-12-13 2:01:06 ID:416804
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
AnimateWindow(handle,300,AW_HIDE or AW_CENTER);

AnimateWindow(handle,300,AW_HIDE or AW_BLEND);(windwos2000 用效果好)
end;

效果也还可以
AnimateWindow在Win2K下缩放很平滑,在98下就不太好了
在NT4下没有这个函数


 
我不清楚AnimateWindow,你试试看在Show事件中来个循环,将windows的Width和Height慢
慢加大、缩小。
 
同意wjiachun,但nt4下用不得.
还有方法,你可查查已答问题
 
用AnimateWindow函数,查查《新编windows API参考大全》,有详细中文说明。
 
AnimateWindow
函数功能:该函数能在显示与隐藏窗口时能产生特殊的效果。有两种类型的动画效果:滚动动画和滑动动画。

函数原型:BOOL AnimateWindow(HWND hWnd,DWORD dwTime,DWORD dwFlags);

参数:

hWnd:指定产生动画的窗口的句柄。

dwTime:指明动画持续的时间(以微秒计),完成一个动画的标准时间为200微秒。

dwFags:指定动画类型。这个参数可以是一个或多个下列标志的组合。标志描述:

AW_SLIDE:使用滑动类型。缺省则为滚动动画类型。当使用AW_CENTER标志时,这个标志就被忽略。

AW_ACTIVE:激活窗口。在使用了AW_HIDE标志后不要使用这个标志。

AW_BLEND:使用淡出效果。只有当hWnd为顶层窗口的时候才可以使用此标志。

AW_HIDE:隐藏窗口,缺省则显示窗口。

AW_CENTER:若使用了AW_HIDE标志,则使窗口向内重叠;若未使用AW_HIDE标志,则使窗口向外扩展。

AW_HOR_POSITIVE:自左向右显示窗口。该标志可以在滚动动画和滑动动画中使用。当使用AW_CENTER标志时,该标志将被忽略。

AW_VER_POSITIVE:自顶向下显示窗口。该标志可以在滚动动画和滑动动画中使用。当使用AW_CENTER标志时,该标志将被忽略。

AW_VER_NEGATIVE:自下向上显示窗口。该标志可以在滚动动画和滑动动画中使用。当使用AW_CENTER标志时,该标志将被忽略。

返回值:如果函数成功,返回值为非零;如果函数失败,返回值为零。在下列情况下函数将失败:

窗口使用了窗口边界;窗口已经可见仍要显示窗口;窗口已经隐藏仍要隐藏窗口。若想获得更多错误信息,请调用GetLastError函数。

备注:可以将AW_HOR_POSITIVE或AW_HOR_NEGTVE与AW_VER_POSITVE或AW_VER_NEGATIVE组合来激活一个窗口。

可能需要在该窗口的窗口过程和它的子窗口的窗口过程中处理WM_PRINT或WM_PRINTCLIENT消息。对话框,控制,及共用控制已处理WM_PRINTCLIENT消息,缺省窗口过程也已处理WM_PRINT消息。

速查:WIDdOWS NT:5.0以上版本:Windows:98以上版本;Windows CE:不支持;头文件:Winuser.h;库文件:user32.lib。

 
一行搞定。
procedur TForm1.FormCreate(Sender: TObject);
Begin
AnimateWindow(self.handel,300,AW_CENTER);//300毫秒
End;
 
或者你也可以自己编程来实现 :
//假设Form2的宽度为800,高度为600
procedure TForm1.Button1Click(Sender: TObject);
var
I :Integer;
begin
for I :=0 to 100 do
begin
Form2.Width :=I*(800 div 100);
Form2.Height :=I*(600 div 100);
Form2.Left :=400- Form2.Width div 2;
Form2.Top :=300-Form2.Height div 2;
Form2.Show;
end;
end;
 
前面是渐渐打开,现在是渐渐关闭呀!!!
procedure TForm1.Button1Click(Sender: TObject);
var
I :Integer;
begin
for I :=100 downto 0 do
begin
Form2.Width :=I*(800 div 100);
Form2.Height :=I*(600 div 100);
Form2.Left :=400- Form2.Width div 2;
Form2.Top :=300-Form2.Height div 2;
Form2.Show;
end;
Form2.Close;
end;
 
AnimateWindow(handle,300,AW_HIDE or AW_CENTER);

AnimateWindow(handle,300,AW_HIDE or AW_BLEND);

加在formshow或onclose
我感觉还可以

 
AnimateWindow好像也不好,form上放一个image作背景,dwFags的很多类型都显示不了图片了
 
wuzhongl:如果对上述回答满意,可以结束问题,否则请提前问题或发表意见
 
回答很多次了[8D]
 
觉得卷兄的应该可以。
 
如果是在W2K或 WINXP中,这个东东肯定行!
{============================================================
= FadeWindow =
= =
= =
= 版本:1.0beta =
= 功能:支持在Win2k下自动实现窗口淡入淡出效果 =
= 作者:Flier (Flier@stu.ccnu.edu.cn) =
= 日期:2000年8月5日 =
= 版权:你可以在任意商业或非商业程序中使用本控件 =
= 但是在传播此控件时请不要删去以上说明 =
============================================================}
unit FadeWindow;

interface

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

type
TFadeWindow = class(TComponent)
private
OldWndProc: TFarProc;
NewWndProc: Pointer;

CanHide: Boolean;
FadeAlpha: Integer;
FadeTimer: TTimer;

FFadeWin: TForm;

FEnabled: Boolean;
FFadeTime: Integer;

FFadeShow: Boolean;
FFadeHide: Boolean;

FMinAlpha: Byte;
FMaxAlpha: Byte;
FFadeStep: Byte;

FOnFadeShowComplete: TNotifyEvent;

procedure HookParent;
procedure UnhookParent;

procedure HookWndProc(var Message: TMessage);

procedure SetMinAlpha(Value: Byte);
procedure SetMaxAlpha(Value: Byte);

procedure InitWnd;
procedure DoneWnd;
procedure SetWndAlpha(const Alpha: Byte);

procedure OnFadeShow(Sender: TObject);
procedure OnFadeHide(Sender: TObject);
protected
public
destructor Destroy; override;
constructor Create(AOwner: TComponent); override;
published
property Enabled: Boolean read FEnabled write FEnabled default True;
property FadeTime: Integer read FFadeTime write FFadeTime default 1000;

property FadeWin: TForm read FFadeWin write FFadeWin;

property FadeShow: Boolean read FFadeShow write FFadeShow default True;
property FadeHide: Boolean read FFadeHide write FFadeHide default True;

property MinAlpha: Byte read FMinAlpha write SetMinAlpha default Low(Byte);
property MaxAlpha: Byte read FMaxAlpha write SetMaxAlpha default High(Byte);
property FadeStep: Byte read FFadeStep write FFadeStep default 5;

property OnFadeShowComplete: TNotifyEvent read FOnFadeShowComplete write FOnFadeShowComplete;
end;

procedure Register;

implementation

const
MinAlpha = 0;
MaxAlpha = High(Byte);

const
user32 = 'user32.dll';

WS_EX_LAYERED = $00080000;

LWA_COLORKEY = $00000001;
LWA_ALPHA = $00000002;

function SetLayeredWindowAttributes(hWnd: HWND;
crKey: TColorRef;
bAlpha: Byte;
dwFlags: DWord): BOOL; stdcall;
external user32
name 'SetLayeredWindowAttributes';


{ TFadeWindow }
constructor TFadeWindow.Create(AOwner: TComponent);
begin
inherited Create(AOwner);

OldWndProc := nil;
NewWndProc := nil;

CanHide := False;

FadeTimer := TTimer.Create(nil);
FadeTimer.Enabled := False;

if Owner is TForm then
FFadeWin := Owner as TForm
else
FFadeWin := nil;

FEnabled := True;
FFadeTime := 1000;

FFadeShow := True;
FFadeHide := True;

FMinAlpha := Low(Byte);
FMaxAlpha := High(Byte);
FFadeStep := 5;

FOnFadeShowComplete := nil;

if not (csDesigning in ComponentState) then
HookParent;
end;

destructor TFadeWindow.Destroy;
begin
//if not (csDesigning in ComponentState) then
// UnhookParent;

FadeTimer.Free;

inherited Destroy;
end;

procedure TFadeWindow.SetMinAlpha(Value: Byte);
begin
if Value <= MaxAlpha then
begin
FMinAlpha := Value;
end
else
begin
FMinAlpha := FMaxAlpha;
FMaxAlpha := Value;
end;
end;

procedure TFadeWindow.SetMaxAlpha(Value: Byte);
begin
if Value >= MinAlpha then
begin
FMaxAlpha := Value;
end
else
begin
FMaxAlpha := FMinAlpha;
FMinAlpha := Value;
end;
end;

procedure TFadeWindow.HookParent;
begin
if Assigned(FFadeWin) and IsWindow(FFadeWin.Handle) then
begin
OldWndProc := TFarProc(GetWindowLong(FFadeWin.Handle, GWL_WNDPROC));
NewWndProc := MakeObjectInstance(HookWndProc);
SetWindowLong(FFadeWin.Handle, GWL_WNDPROC, LongInt(NewWndProc));
end;
end;

procedure TFadeWindow.UnhookParent;
begin
if Assigned(FFadeWin) and IsWindow(FFadeWin.Handle) and Assigned(OldWndProc) then
SetWindowLong(FFadeWin.Handle, GWL_WNDPROC, LongInt(OldWndProc));

if Assigned(NewWndProc) then
FreeObjectInstance(NewWndProc);

NewWndProc := nil;
OldWndProc := nil;
end;

procedure TFadeWindow.InitWnd;
var
l: Longint;
begin
l := GetWindowLong(FFadeWin.Handle, GWL_EXSTYLE);
l := l or WS_EX_LAYERED;
SetWindowLong(FFadeWin.Handle, GWL_EXSTYLE, l);
end;

procedure TFadeWindow.DoneWnd;
var
l: Longint;
begin
l := GetWindowLong(FFadeWin.Handle, GWL_EXSTYLE);
l := l and (not WS_EX_LAYERED);
SetWindowLong(FFadeWin.Handle, GWL_EXSTYLE, l);
end;

procedure TFadeWindow.SetWndAlpha(const Alpha: Byte);
begin
SetLayeredWindowAttributes(FFadeWin.Handle,
0,
Alpha,
LWA_ALPHA);
end;

procedure TFadeWindow.OnFadeShow(Sender: TObject);
begin
SetWndAlpha(FadeAlpha);
Inc(FadeAlpha, FFadeStep);
if FadeAlpha >= FMaxAlpha then
begin
(Sender as TTimer).Enabled := False;
if FadeAlpha <> FMaxAlpha then
SetWndAlpha(FMaxAlpha);
//DoneWnd;
if Assigned(FOnFadeShowComplete) then
FOnFadeShowComplete(Self);
end;
end;

procedure TFadeWindow.OnFadeHide(Sender: TObject);
begin
SetWndAlpha(FadeAlpha);
Dec(FadeAlpha, FFadeStep);
if FadeAlpha <= FMinAlpha then
begin
(Sender as TTimer).Enabled := False;
CanHide := True;
(FFadeWin as TForm).Close;
end;
end;

procedure TFadeWindow.HookWndProc(var Message: TMessage);
procedure DefaultHandler;
begin
with Message do
Result := CallWindowProc(OldWndProc, FFadeWin.Handle, Msg, wParam, lParam);
end;
begin
if FEnabled and Assigned(FFadeWin) and IsWindow(FFadeWin.Handle) then
begin
FadeTimer.Interval := FFadeTime div ((FMaxAlpha - FMinAlpha + 1) div FFadeStep);

case Message.Msg of
WM_SHOWWINDOW:
if TWMShowWindow(Message).Show then
begin
if FFadeShow then
begin
InitWnd;
FadeAlpha := FMinAlpha;
SetWndAlpha(FadeAlpha);
end;

DefaultHandler;

if FFadeShow then
begin
FadeTimer.OnTimer := OnFadeShow;
FadeTimer.Enabled := True;
end;
end
else
DefaultHandler;
WM_CLOSE:
begin
if FFadeHide then
begin
if CanHide then
begin
(FFadeWin as TForm).Visible := False;
DoneWnd;
UnhookParent;
DefaultHandler;
CanHide := False;
end
else
begin
//InitWnd;

FadeAlpha := FMaxAlpha;
SetWndAlpha(FadeAlpha);

FadeTimer.OnTimer := OnFadeHide;
FadeTimer.Enabled := True;
end;
end;
end;
else
DefaultHandler;
end
end
else
DefaultHandler;
end;

procedure Register;
begin
RegisterComponents('Flier', [TFadeWindow]);
end;

end.

 
用sleep
 
procedure TForm1.FormShow(Sender: TObject);
var
i:integer;
begin
AnimateWindow(HandLe,80,AW_CENTER);
for i:=0 to ControlCount-1 do
Controls.Refresh;
Form1.BringToFront;
end;
 
后退
顶部