在Delphi里面能否控制Image里面的图片实现渐变的效果?

hyrongg 2003-11-05 06:39:11
即:Flash里透明度从100变为0的过程
...全文
246 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
TechnoFantasy 2003-11-06
  • 打赏
  • 举报
回复
VB的,可以通过:

http://www.applevb.com/art/alphablend.txt
angelface 2003-11-05
  • 打赏
  • 举报
回复
学习
mynetlife 2003-11-05
  • 打赏
  • 举报
回复
学习
hyrongg 2003-11-05
  • 打赏
  • 举报
回复
我在2000环境下,请教大虾
hyrongg 2003-11-05
  • 打赏
  • 举报
回复
unit USemiTransparent;

interface

uses
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'
TechnoFantasy 2003-11-05
  • 打赏
  • 举报
回复
用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环境中测试通过,你可以根据注释很快在你的计算机上进一步完善,如有纰漏,欢迎来信探讨,xpmao@163.net。


//窗体实现文件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.


TechnoFantasy 2003-11-05
  • 打赏
  • 举报
回复
用AlphaBlend函数

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧