FormContainer的窗体淡入淡出功能是怎么实现的呢? 我没有见过FormContainer但你可以用用AnimateWindow 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我没有见过FormContainer但你可以用用AnimateWindow(API) 核心API函数就是SetLayeredWindowAttributes,以下的控件代码是让你的窗口实现淡入淡出效果而设计,通过编程时动态改变AlphaValue值,您就可以看到效果了。unit TranForm; {DragonPC 2001.2.21 }interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;type TTranForm = class(TComponent) private FAlphaValue : integer ; FHandle : HWND ; procedure SetFAlphaValue(Alpha:integer) ; protected procedure UpdateDisplay ; public constructor Create(AOwner: TComponent); override; published property AlphaValue : integer read FAlphaValue write SetFAlphaValue ; end;procedure Register;function SetLayeredWindowAttributes (Handle : HWND; COLORKEY : COLORREF; Alpha : BYTE; Flags : DWORD) :Boolean; stdcall; external 'USER32.DLL';implementationprocedure Register;begin RegisterComponents('Standard', [TTranForm]);end;{ TTranForm }procedure TTranForm.SetFAlphaValue(Alpha: integer);begin if (Alpha >= 0) and (Alpha < 256) then begin FAlphaValue := Alpha ; UpdateDisplay() ; end else ShowMessage('请输入0~255之间的值!') ;end;procedure TTranForm.UpdateDisplay;begin if not (csDesigning in ComponentState) then SetLayeredWindowAttributes(FHandle, 0, FAlphaValue, 2); {我屏蔽了设计期的显示效果,如果你愿意可以改改,建议设计时最好不要看到效果}end;constructor TTranForm.Create(AOwner: TComponent);begin inherited; FAlphaValue := 255 ; FHandle := TForm(Owner).Handle ; if not (csDesigning in ComponentState) then SetWindowLong(FHandle,GWL_EXSTYLE, GetWindowLong(FHandle, GWL_EXSTYLE )or $80000 ); {我屏蔽了设计期的显示效果,如果你愿意可以改改,建议设计时最好不要看到效果}end;end.**************const WS_EX_LAYERED = $80000; AC_SRC_OVER = $0; AC_SRC_ALPHA = $1; AC_SRC_NO_PREMULT_ALPHA = $1; AC_SRC_NO_ALPHA = $2; AC_DST_NO_PREMULT_ALPHA = $10; AC_DST_NO_ALPHA = $20; LWA_COLORKEY = $1; LWA_ALPHA = $2; ULW_COLORKEY = $1 ULW_ALPHA = $2 ULW_OPAQUE = $4//新增加的常量定义function SetLayeredWindowAttributes(hwnd:HWND; crKey:Longint; bAlpha:byte; dwFlags:longint ):longint; stdcall; external user32;//函数声明procedure TForm1.FormCreate(Sender: TObject);var l:longint;begin l:=getWindowLong(Handle, GWL_EXSTYLE); l := l Or WS_EX_LAYERED; SetWindowLong (handle, GWL_EXSTYLE, l); SetLayeredWindowAttributes (handle, 0, 180, LWA_ALPHA);//第二个参数是指定透明颜色//第二个参数为0则使用第四个参数设置alpha值,从0到255,其他的我不太清楚,因为没有api帮助end; 楼上讲的详实,但有点过.用AnimateWindow很好的-------------------------------------------------------------------------------- Windows图形界面实现了卷帘、淡入淡出和弹出效果,使界面更吸引人。如果你要在你的窗体中使用这些效果,你只需要一个API函数:AnimateWindow! 这个API函数使用简单,你只需要提供你的窗体的句柄、动画进行的毫秒数和一些指定效果和方向的标志。 试着在你的窗体的OnShow事件处理函数中加入下面的代码: ... AnimateWindow(Self.Handle, 250, AW_BLEND or AW_ACTIVATE); ... 执行工程并看一下结果。很酷,是不是? 这个函数默认使用卷帘效果,但是你可以用AW_SLIDE获得幻灯效果,用AW_CENTER获得垮塌或扩展效果,用AW_BLEND获得平滑的淡入淡出效果。 还有,你可以加上AW_ACTIVATE标志如果你的窗体正在出现,或是AW_HIDE如果你的窗体将要被隐藏,这一标志颠倒动画的方向。 当你使用卷帘和淡入淡出效果时,你可以指定效果在水平和垂直轴发生的方向,添加AW_HOR_POSITIVE和AW_HOR_NEGATIVE设置x轴,添加W_VER_POSITIVE或是AW_VER_NEGATIVE设置y轴。 当你用AW_CENTER标志时,所有这些标志都可以省略。 试验不同的标志组合并看一下结果!-------------------------------------------------------------------------------- 当你玩了一段时间后,你会发现一个奇怪的地方:一些控件显示正常,其他的控件绘图有错误,还有一些根本不画!! 原因很简单,但是解决方法很麻烦。 MSDN文档说窗体中的控件的windows程序必须处理WM_PRINT或WM_PRINTCLIENT消息,使它们与AnimateWindow API函数一起使用。这些消息当Windows需要在屏幕以外的显示环境(如打印机,在这里使屏幕外位图)绘图时被使用。该文档说普通控件和对话框的窗口程序已经处理了这些消息。 这就解释了一些控件绘图正常:例如TButton, TCheckBox和TRadioButton它们拥有和管理底下的按钮控件,这样它们能正确的处理消息。 绘图有错误的控件是一种中间类型,它们拥有按钮控件但是一些部分使应用Dephi的TCanvas而不是Windows GDI绘制的,如TEdit, TRichEdit和其他这样的控件。 不可见的控件是完全不拥有普通控件的那些,它们都是TGraphic的后代,如TShape和TBevel。这些控件决不会画出来,因为它们接收不到需要的消息。 但是,对从TWinControl衍生出来的Delphi对象,你可以这样从中间截取和处理WM_PRINTCLIENT消息:unit TestGroupBox; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TTestGroupBox = class(TGroupBox) private { Private declarations } protected { Protected declarations } procedure WMPrintClient(var Msg: TMessage); message WM_PRINTCLIENT; public { Public declarations } published { Published declarations } end; procedure Register; implementation procedure Register; begin RegisterComponents('Test', [TTestGroupBox]); end; { TTestGroupBox } procedure TTestGroupBox.WMPrintClient(var Msg: TMessage); begin PaintTo(HDC(Msg.WParam), 0, 0); end; end. 这是一个从TGroupBox派生出来的例子组件。由于TGroupBox拥有的不是一个普通窗口控件,WM_PRINTCLIENT没有被处理。程序添加消息处理函数并在一个不同的显示环境中使用PaintTo方法,这些都是直接了当的。 现在是麻烦的部分了:你窗体的每一个控件都必须这样修改,而且你必须修改你所有的对象才能安全使用AnimateWindow API函数。 delphi用GET方法向WEB提交数据。谢谢 〓如何在win200和winXP中,使程序不出现在任务管理器中(Alt+Ctrl+Del)? 请教高手----在dephi中调用java程序(涉及对象共享) 测试DLL 急,一个导数据的问题。 懂得用Delphi控制Excel的高手请进! showmessage() 密码问题 请问应该怎样学好DELPHI呢? 给高手的挑战 请问DELPHI有没有一个椭圆型或是别的形状的登陆提示窗体!! 一个加密实施方法的问题
但你可以用用AnimateWindow(API)
可以看到效果了。unit TranForm; {DragonPC 2001.2.21 }interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;type
TTranForm = class(TComponent)
private
FAlphaValue : integer ;
FHandle : HWND ;
procedure SetFAlphaValue(Alpha:integer) ;
protected
procedure UpdateDisplay ;
public
constructor Create(AOwner: TComponent); override;
published
property AlphaValue : integer read FAlphaValue write SetFAlphaValue ;
end;procedure Register;function SetLayeredWindowAttributes
(Handle : HWND; COLORKEY : COLORREF; Alpha : BYTE; Flags : DWORD) :
Boolean;
stdcall; external 'USER32.DLL';implementationprocedure Register;
begin
RegisterComponents('Standard', [TTranForm]);
end;{ TTranForm }
procedure TTranForm.SetFAlphaValue(Alpha: integer);
begin
if (Alpha >= 0) and (Alpha < 256) then begin
FAlphaValue := Alpha ;
UpdateDisplay() ;
end else
ShowMessage('请输入0~255之间的值!') ;
end;procedure TTranForm.UpdateDisplay;
begin
if not (csDesigning in ComponentState) then
SetLayeredWindowAttributes(FHandle, 0, FAlphaValue, 2);
{我屏蔽了设计期的显示效果,如果你愿意可以改改,建议设计时最好不要看到效果}
end;constructor TTranForm.Create(AOwner: TComponent);
begin
inherited;
FAlphaValue := 255 ;
FHandle := TForm(Owner).Handle ;
if not (csDesigning in ComponentState) then
SetWindowLong(FHandle,GWL_EXSTYLE, GetWindowLong(FHandle, GWL_EXSTYLE )
or $80000 );
{我屏蔽了设计期的显示效果,如果你愿意可以改改,建议设计时最好不要看到效果}
end;end.**************
const
WS_EX_LAYERED = $80000;
AC_SRC_OVER = $0;
AC_SRC_ALPHA = $1;
AC_SRC_NO_PREMULT_ALPHA = $1;
AC_SRC_NO_ALPHA = $2;
AC_DST_NO_PREMULT_ALPHA = $10;
AC_DST_NO_ALPHA = $20;
LWA_COLORKEY = $1;
LWA_ALPHA = $2;
ULW_COLORKEY = $1
ULW_ALPHA = $2
ULW_OPAQUE = $4
//新增加的常量定义
function SetLayeredWindowAttributes(hwnd:HWND; crKey:Longint; bAlpha:byte; dwFlags:longint ):longint; stdcall; external user32;//函数声明
procedure TForm1.FormCreate(Sender: TObject);
var l:longint;
begin
l:=getWindowLong(Handle, GWL_EXSTYLE);
l := l Or WS_EX_LAYERED;
SetWindowLong (handle, GWL_EXSTYLE, l);
SetLayeredWindowAttributes (handle, 0, 180, LWA_ALPHA);
//第二个参数是指定透明颜色
//第二个参数为0则使用第四个参数设置alpha值,从0到255,其他的我不太清楚,因为没有api帮助
end;
Windows图形界面实现了卷帘、淡入淡出和弹出效果,使界面更吸引人。如果你要在你的窗体中使用这些效果,你只需要一个API函数:AnimateWindow! 这个API函数使用简单,你只需要提供你的窗体的句柄、动画进行的毫秒数和一些指定效果和方向的标志。 试着在你的窗体的OnShow事件处理函数中加入下面的代码: ...
AnimateWindow(Self.Handle, 250, AW_BLEND or AW_ACTIVATE);
... 执行工程并看一下结果。很酷,是不是? 这个函数默认使用卷帘效果,但是你可以用AW_SLIDE获得幻灯效果,用AW_CENTER获得垮塌或扩展效果,用AW_BLEND获得平滑的淡入淡出效果。 还有,你可以加上AW_ACTIVATE标志如果你的窗体正在出现,或是AW_HIDE如果你的窗体将要被隐藏,这一标志颠倒动画的方向。 当你使用卷帘和淡入淡出效果时,你可以指定效果在水平和垂直轴发生的方向,添加AW_HOR_POSITIVE和AW_HOR_NEGATIVE设置x轴,添加W_VER_POSITIVE或是AW_VER_NEGATIVE设置y轴。 当你用AW_CENTER标志时,所有这些标志都可以省略。 试验不同的标志组合并看一下结果!-------------------------------------------------------------------------------- 当你玩了一段时间后,你会发现一个奇怪的地方:一些控件显示正常,其他的控件绘图有错误,还有一些根本不画!! 原因很简单,但是解决方法很麻烦。 MSDN文档说窗体中的控件的windows程序必须处理WM_PRINT或WM_PRINTCLIENT消息,使它们与AnimateWindow API函数一起使用。这些消息当Windows需要在屏幕以外的显示环境(如打印机,在这里使屏幕外位图)绘图时被使用。该文档说普通控件和对话框的窗口程序已经处理了这些消息。 这就解释了一些控件绘图正常:例如TButton, TCheckBox和TRadioButton它们拥有和管理底下的按钮控件,这样它们能正确的处理消息。 绘图有错误的控件是一种中间类型,它们拥有按钮控件但是一些部分使应用Dephi的TCanvas而不是Windows GDI绘制的,如TEdit, TRichEdit和其他这样的控件。 不可见的控件是完全不拥有普通控件的那些,它们都是TGraphic的后代,如TShape和TBevel。这些控件决不会画出来,因为它们接收不到需要的消息。 但是,对从TWinControl衍生出来的Delphi对象,你可以这样从中间截取和处理WM_PRINTCLIENT消息:unit TestGroupBox; interface uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls; type
TTestGroupBox = class(TGroupBox)
private
{ Private declarations }
protected
{ Protected declarations }
procedure WMPrintClient(var Msg: TMessage); message WM_PRINTCLIENT; public
{ Public declarations }
published
{ Published declarations }
end; procedure Register; implementation procedure Register;
begin
RegisterComponents('Test', [TTestGroupBox]);
end; { TTestGroupBox } procedure TTestGroupBox.WMPrintClient(var Msg: TMessage);
begin
PaintTo(HDC(Msg.WParam), 0, 0);
end; end. 这是一个从TGroupBox派生出来的例子组件。由于TGroupBox拥有的不是一个普通窗口控件,WM_PRINTCLIENT没有被处理。程序添加消息处理函数并在一个不同的显示环境中使用PaintTo方法,这些都是直接了当的。 现在是麻烦的部分了:你窗体的每一个控件都必须这样修改,而且你必须修改你所有的对象才能安全使用AnimateWindow API函数。