即:Flash里透明度从100变为0的过程

解决方案 »

  1.   

    用Delphi实现半透明效果   (本文已发表于《电脑爱好者》2001.10)
    相关链接:半透明源代码           用过Win2000的朋友肯定知道Win2000的“半透明效果”,可以透视背景,或底层的其他位图,而不是通常文章所介绍的透明效果(即没有背景或不显示位图中的白色背景)。“半透明效果”在一些程序中也已经有所探讨,但均局限于Windows2000环境,本文讨论在Windows98环境中“半透明效果”的一种实现方法。由于Delphi在RAD方面的优势,所以本文使用Delphi作为开发工具,看过本文以后,你会发现原来用Delphi实现是这么简单(用VC的朋友可以在我的主页Http://xpmao.8u8.com下载用VC实现的例子)。     我们知道,在Delphi中生成一个新的窗口时,会生成一个长方形的窗口并盖住背景,为了实现半透明效果,首先就得实现“透明”的效果,为此,我们需要截获WM_ERASEBKGND消息,传递给Windows一个处理过的标志就可以了。这样,我们程序的背景使用的就是原来处于窗体之后的背景,我们所要做的就是在这个背景上再加上我们的图片就可以了。为此,需要调用Windows98系统msimg32.dll中提供的AlphaBlend函数,其原型为:AlphaBlend( HDC hdcDest,//目标设备场景句柄 int nXOriginDest, //指定目标矩形左上角的x坐标 int nYOriginDest,//指定目标矩形左上角的y坐标 int nWidthDest,//指定目标矩形宽度 int hHeightDest,//指定目标矩形高度 HDC hdcSrc, //源设备场景句柄 int nXOriginSrc,//指定源矩形左上角的x坐标 int nYOriginSrc,//指定源矩形左上角的y坐标 int nWidthSrc,//指定源矩形宽度 int nHeightSrc,//指定源矩形高度 BLENDFUNCTION blendFunction //设定AlphaBlend处理的参数);? 具体编程过程如下:以SemiTran为名建立新的工程,文件另存为uSemiTransparent.pas,将窗体重命名为frmSemiTransparent,接下来,给窗体添加一个计时器(命名为tmrShowBitmap)、一个Image控件(命名为imgSrc),设置imgSrc的Picture属性,调入图片文件备用。使用Image控件的好处是不用调用CreateCompatibleDC来建立源设备场景。以下是用DELPHI5.0实现的具体例程,在Win98环境中测试通过,你可以根据注释很快在你的计算机上进一步完善,如有纰漏,欢迎来信探讨,[email protected]
    //窗体实现文件unit uSemiTransparent;interface
    uses ......//为节省编幅,常用模块在本文中省略
    //窗体类
    type TfrmSemiTransparent = class(TForm) 
    //用于保存图片的控件 
    imgSrc: TImage; 
    //控制透明程度的时钟 
    tmrShowBitmap: TTimer; 
    procedure tmrShowBitmapTimer(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
    private { Private declarations } 
    public { Public declarations } 
    //使用Message关键字进行消息截获 
    procedure OnEraseBkgnd(var Message:TWMEraseBkgnd); Message WM_EraseBkgnd; 
    end;
    var frmSemiTransparent: TfrmSemiTransparent; 
    bf:_BLENDFUNCTION; //AlphaBlend透明函数结构 
    nWidth :Integer; //图片宽度 
    nHeight :Integer; //图片高度 
    nCount: Integer; //透明度
    implementation
    {$R *.DFM}//截获WM_EraseBkgnd消息,实现透明背景
    procedure TfrmSemiTransparent.OnEraseBkgnd(var Message: TWMEraseBkgnd);begin
        Message.Result := 1; //设置消息已处理标志
    end;//时钟事件处理函数
    procedure TfrmSemiTransparent.tmrShowBitmapTimer(Sender: TObject);
    begin
        nCount := nCount +1;
        if nCount>250 then 
            begin 
                tmrShowBitmap.Enabled := False; 
                frmSemiTransparent.Hide; 
                frmSemiTransparent.Close; 
            end; 
        bf.SourceConstantAlpha := nCount;     //设置透明程度 
        AlphaBlend( frmSemiTransparent.Canvas.Handle,//窗口设备句柄 
        0,
            0, 
            nWidth,
            nHeight,
            imgSrc.
            Canvas.Handle, //保存图片的设备句柄 
            0, 
            0, 
            nWidth, 
            nHeight, 
            bf);
    end;//初始化变量和窗口类型
    procedure TfrmSemiTransparent.FormCreate(Sender: TObject);
    begin
        //设置窗口为无边框类型 
        frmSemiTransparent.BorderStyle := bsNone; 
        //设置窗口为屏幕居中 
        frmSemiTransparent.Position := poDesktopCenter; 
        nWidth := imgSrc.Width; 
        nHeight := imgSrc.Height; 
        nCount := 0; 
        //传递给AlphaBlend的结构 
        bf.BlendOp := AC_SRC_OVER; 
        bf.BlendFlags := 0; 
        bf.SourceConstantAlpha := nCount; 
        bf.AlphaFormat := 0; 
        //用图片大小设置窗口大小 
        SetWindowPos(Handle,HWND_TOP, 0,0,nWidth-1, nHeight-1,0); 
        tmrShowBitmap.Enabled :=True;
    end;end.
      

  2.   

    unit USemiTransparent;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls;type
      TfrmSemiTransparent = class(TForm)
        tmrshowbitmap: TTimer;
        Imgsrc: TImage;
        procedure tmrshowbitmapTimer(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        procedure OnEraseBkgnd(Var Message:TWMEraseBkgnd);Message WM_EraseBkgnd;
      end;var
      frmSemiTransparent: TfrmSemiTransparent;
      bf:_BLENDFUNCTION;
      nWidth: integer;
      nHeight: Integer;
      nCount: integer;//透明度
    implementation{$R *.dfm}procedure  TfrmSemiTransparent.OnEraseBkgnd(Var Message:TWMEraseBkgnd);
    begin
      Message.Result := 1;
    End;procedure TfrmSemiTransparent.tmrshowbitmapTimer(Sender: TObject);
    begin
      nCount := nCount+1;
      if nCount>250 then
      begin
        tmrshowbitmap.Enabled := false;
        frmSemiTransparent.Hide;
        frmSemiTransparent.Close;
      End;
      bf.SourceConstantAlpha := nCount;
      AlphaBlend(frmSemiTransparent.Canvas.Handle,0,0,nWidth,nheight,ImgSrc.Canvas.Handle,0,0,nWidth,nHeight,bf);//该行编译不通过,报错内容在后边注释
      
    end;procedure TfrmSemiTransparent.FormCreate(Sender: TObject);
    begin
      frmSemiTransparent.BorderStyle := bsNone;
      frmSemiTransparent.Position := PoDesktopCenter;
      nWidth := ImgSrc.Width;
      nHeight := ImgSrc.Height;
      nCount := 0;
      bf.BlendOp := AC_SRC_OVER;
      bf.BlendFlags := 0;
      bf.SourceConstantAlpha := nCount;
      bf.AlphaFormat := 0;
      SetWindowPos(Handle,HWND_TOP,0,0,nWidth-1,nHeight-1,0);
      tmrshowbitmap.Enabled := true;
    end;end.
    //报错信息,我在Delphi7.0下边
    [Error] USemiTransparent.pas(49): Missing operator or semicolon
    [Error] USemiTransparent.pas(49): Statement expected, but expression of type 'Boolean' found
    [Fatal Error] SemiTran.dpr(5): Could not compile used unit 'USemiTransparent.pas'
      

  3.   

    VB的,可以通过:http://www.applevb.com/art/alphablend.txt