用几张连续的bmp做一个动画效果,上面写字。(急,马上给分)(100分)

  • 主题发起人 主题发起人 flash101
  • 开始时间 开始时间
F

flash101

Unregistered / Unconfirmed
GUEST, unregistred user!
我想用几张连续的bmp做一个动画效果,然后在动画的上面还要显示字,当然字要透明能看见下面的动画的。不

知道有什么好方法。我现在的方法老闪(是不是跟显示器的刷新频率有关)。怎么解决?另外我试过

flash.ocx,gifimage等lebel都被遮挡住了,看不见。

我用Timage加label(设置为透明) ,代码如下:
num:=num+1;
if num>55 then num:=8;
w:='rs1-'+inttostr(num)+'.bmp';
image1.Picture.LoadFromFile(w);

image1.refresh;
 
真不明白你为什么这么做,不闪才怪呢。(尽量减小bmp文件的尺寸大小估计会好些)
装个gif的插件,直接显示动画不是更好么
 
设置窗口的双缓冲
 
//在窗体 加入下面message函数

procedure WMEraseBkgnd(var Message: TMessage); message WM_ERASEBKGND;

//---------------
procedure TFm_bsky_Splash.showImage;
var
i:integer;
Image_tmps:array[8..55] of TImage;
begin
for i:=8 to 55 do
begin
Image_tmps:=TImage.create;
Image_tmps.Picture.LoadFromFile('rs1-'+inttostr(i)+'bmp');
end;
try
for i:=8 to 55 do
begin
Image_main.Picture.Bitmap.Assign(Image_tmps.Picture.Graphic);
if i=55 then i:=8;
delay(100);//如果时间够可以把恋歌循环合并,这样就不需要创建那么多TImage
refresh;
end;
finally
for i:=5 to 55 do Image_tmps.free;
end;
end;
//------关键---
procedure TFm_bsky_Splash.WMEraseBkgnd(var Message: TMessage);
begin
Message.Result := 1
end;

//第一次回答问题 女足0:5 又看了巴西和阿根廷的友谊赛
 
to dfw1001:
因为我要在动画上面再加透明按钮(我用label代替)的,如果我用gif的插件,透明的label就会被压在插件的下面显示不出来的
 
自己顶帖我很急的
 
设置窗口的双缓冲
DoubleBuffered:=true;
 
帮你顶一下吧!
 
难道我的方法不行?????
我自己都是这么用的几年了绝对没问题,至于代码我是直接打上去的,没在IDE里调试!
语法可能有小错! 解决了快给分,我第一次回答别人的问题哦!
 
to bmsr兄台,不知我是不是笨,反正我实验了还是闪,而且没找到delay(100)函数。另外我不是要窗体透明而是要在窗体动画的上面显示文字和按钮,这两样要透明的。如果能帮忙,我但给你分。
 
闪是因为windows在从画时 先整个擦出,而从画不是os重画,而是os通过消息通知窗口句柄重画,默认的repaint 是先clear成空白再重新画上,因此一定会闪。
现在你 procedure WMEraseBkgnd(var Message: TMessage); message WM_ERASEBKGND
覆盖 WM_ERASEBKGND 擦除背景消息, 则不会再擦除背景。
另外没明白你的动画究竟在窗体上还是在 文字按钮上,在窗体上 则procedure WMEraseBkgnd(var Message: TMessage); message WM_ERASEBKGND 加入窗体的protect部分。在按钮则重构按钮 TNewButton=class(Tspeedbutton) ... 在新按钮的protect加入.
delay(100) 表示延迟 1/10秒 有这个函数或类似的。至于 画面的文字可以直接在bmp上用 canves.textoutof()
今天家里一堆人,太吵 ,惹不起 我躲德起,在网吧,都是自己打上去的,细节可能有错,但道理应该讲的很清楚了。
 
这样写才会不闪,IMG上面不能放LABEl,放了就会闪
var
OldBkMode : integer;
TempBMP:TBitmap;
……
TempBMP:=TBitmap.Create;

num:=num+1;
if num>55 then num:=8;
w:='rs1-'+inttostr(num)+'.bmp';
TempBMP.LoadFromFile(w);
with TempBMP.Canvas do begin
Pen.Color:=clred;
Font.Size:=9;
Font.Name:='宋体';
Font.Color:=clred;
OldBkMode:= SetBkMode({Image1.Canvas.}Handle, TRANSPARENT);
TextOut(10, 50,'我要在这里写字'); //位置自己调整
SetBkMode({Image1.Canvas.}Handle, OldBkMode);
end;
image1.picture.bitmap.Assign(TempBMP);
image1.refresh;

注意image1上面放任何控件,它都会闪
 
一看就知道是没有美工功底的。
为什么一定要放一个Label,完全可以做成一个独立的动画文件,Label内容也可以做在动画中的呀!
 
用image1.parent.doublebuffered:=true;就不闪了
那是刷屏率,
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
783
import
I
后退
顶部