zoukankan      html  css  js  c++  java
  • 实现半透明效果

    用过Win2000 的朋友肯定知道Win2000 的“半透明效果”,它可以透视背景或底层的其他位图,而不是一般文章所介绍的不规则窗口技术。然而,本文将讨论在Win98环境中实现“半透明效果”的方 法。由于Delphi 在RAD 方面的优势,所以本文使用Del p h i 作为开发工具,看过本文以后,你会发现原来用Delphi 来实现是这么简单。
    我们知道,在Delphi 中生成一个新的窗口时,会生成一个长方形的窗口并盖住背景。为了实现半透明效果,首先就得实现“透明”的效果,为此,我们需要截获
    WM_ERASEBKGND 消息,传递给Windows一个处理过的标志就可以了。这样,我们程序的背景使用的就是原来处于窗体之后的背景,我们所要做的就是在这个背景上再加上我们 的图片。为此,需要调用Win98 系统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、Interval 为20)、一个Image 控件(命名为imgSrc、AutoSize 为True),设置imgSrc 的Picture 属性,调入相应的图片文件(如图
    1)。使用Image 控件的好处是不用调用CreateCompatibleDC来建立源设备场景。
    以下是用Delphi5.0 实现的具体例程,在Win98环境中测试通过,你可以根据注释很快在你的计算机上进一步完善。程序效果如图2 所示。
    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;
    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.

  • 相关阅读:
    比较Maven和Ant
    解决浏览器缓存
    Servlet--HttpServletResponse的2个操作流的方法
    Servlet--j2e中文乱码解决
    java乱码详解(java中byte与char的转换)
    linux中操作java进程
    Servlet--超链接,表单提交,重定向,转发4种情况的路径
    物理路径,相对路径,绝对路径以及根目录
    Servlet--转发和重定向
    Servlet--传参和接参
  • 原文地址:https://www.cnblogs.com/FuYan/p/3277402.html
Copyright © 2011-2022 走看看