我没有见过FormContainer
但你可以用用AnimateWindow

解决方案 »

  1.   

    我没有见过FormContainer
    但你可以用用AnimateWindow(API)
      

  2.   

    核心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;
      

  3.   

    楼上讲的详实,但有点过.用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函数。