如何实现瑞星那样淡入淡出的程序启动界面?
解决方案 »
- inttostr 溢出问题
- delphi的update 问题,请高手求助~~
- 多线程的问题
- 怎么样动态创建webbrowser?麻烦给个例子,谢谢。
- 关于dbgrid现实的问题
- 熟悉DShow接口的朋友请进
- 任何调整窗口在dpr文件中的create顺序?
- 高手请进,如何将一个二进制文件中的内容写到数据库表中的某个字段!
- 求救!求救!会用delphi收email的请与我联系:我的Email: [email protected], QQ: 78402308
- 有关activeform的问题,怎么不能使用数据模块?
- 从1234中取出第一个数的函数是什么?因为我要判断1234和g234第一个数是1还是g.thank!
- 100分求教关于问题DBgrid的问题
AlphaBlend=true;
AlphaBlendValue="0--255";//自己控制
在OnTimer事件中设置:bgein
AlphaBlendValue:=i;
i:=i+10;
end;用Delphi6做更容易!
在Form的OnCreate中添加:
AnimateWindow(Self.Handle, 250, AW_BLEND or AW_ACTIVATE);
类似网络蚂蚁的弹出通知窗口:
procedure TForm1.FormShow(Sender: TObject);
begin
AnimateWindow (Handle, 400, AW_CENTER);
/// AnimateWindow (Handle, 400, AW_BLEND); ///淡入
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
AnimateWindow (Handle, 400, AW_CENTER or AW_HIDE);
/// AnimateWindow (Handle, 400, AW_BLEND or $00010000); ///淡出
end;在form上胡乱放些控件,然后
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
AutoScroll := False;
repeat
ScaleBy (93, 100);
Application.ProcessMessages;
until Height < 70;
end;不知大家还有没有别的有意思的东西,拿出来同乐吧!
(注:上面的程序是从国外的一篇文章上找的)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;效果也还可以
to 烂泥:高!我再增加一点趣味性:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
// 正常的工作在此进行
if CanClose then
begin
Randomize;
AnimateWindow(handle,200,AW_HIDE or Random(16)+1);
end;
end;
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;
procedure FadeOut; //我添加的,在关闭时调用
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 GetWindowsVersion(var Major : integer; var Minor : integer);
procedure Register;implementationconst
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 }
procedure TFadeWindow.FadeOut ;
begin
CanHide := False;
FadeAlpha := FMaxAlpha;
SetWndAlpha(FadeAlpha);
FadeTimer.OnTimer := OnFadeHide;
FadeTimer.Enabled := True;
end;
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 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); //判断是否是WIN2000以上的版本。
{begin
SetLayeredWindowAttributes(FFadeWin.Handle,
0,
Alpha,
LWA_ALPHA); }
var
major, minor : integer;
old: longint;
User32: Cardinal;
SetLayeredWindowAttributes: function (hwnd: LongInt; crKey: byte; bAlpha: byte; dwFlags: LongInt): LongInt; stdcall;
begin
GetWindowsVersion(major, minor);
if ((major >= 5) and (minor >= 0)) then //Windows 2000(NT5)
begin
User32 := LoadLibrary('USER32');
if User32 <> 0 then
try
SetLayeredWindowAttributes := GetProcAddress(User32, 'SetLayeredWindowAttributes');
if @SetLayeredWindowAttributes <> nil then
SetLayeredWindowAttributes(FFadeWin.Handle,
0,
Alpha,
LWA_ALPHA);
finally
FreeLibrary(User32);
end;
end;
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 GetWindowsVersion(var Major : integer;var Minor : integer);
var
l : longint;
begin
l := GetVersion;
Major := LoByte(LoWord(l));
Minor := HiByte(LoWord(l));
end;procedure Register;
begin
RegisterComponents('Flier', [TFadeWindow]);
end;end.