from里面有一些文字
开始是被一张图片盖着的,看不见
当鼠标移到指定的button上面时候
图片就连续移开直到文字露出来我是这样做的:
当button onmouseEnter的时候启动一个线程来减小图片的宽度,直到为 0 ,
线程函数是
while image.width>0 do
begin
image.width := image.width - 8; //每次减小的像素
form.Invalidate;
end;
但是这样做移得很慢,并且感觉不连续,还耗cpu,
如果几个button的OnmouseEnter事件都调用此线程,感觉还会不灵;
请问还有什么好的办法流畅地移动或者减小图片的宽度。
或者还有什么更好的办法来实现遮罩的这种效果
开始是被一张图片盖着的,看不见
当鼠标移到指定的button上面时候
图片就连续移开直到文字露出来我是这样做的:
当button onmouseEnter的时候启动一个线程来减小图片的宽度,直到为 0 ,
线程函数是
while image.width>0 do
begin
image.width := image.width - 8; //每次减小的像素
form.Invalidate;
end;
但是这样做移得很慢,并且感觉不连续,还耗cpu,
如果几个button的OnmouseEnter事件都调用此线程,感觉还会不灵;
请问还有什么好的办法流畅地移动或者减小图片的宽度。
或者还有什么更好的办法来实现遮罩的这种效果
解决方案 »
- 如何给分配的内存赋值?
- 一个最基础的拖放问题,请教各位大虾^_^
- 远程监控的问题
- 关于进削存的问题(有这方面经验的请进)
- 大家探讨一下吧,把所有的源程式都收集起来,大家互相学习!!
- 关于MaskEdit的清空问题
- to sweethzp(黄纸片),to BlueTrees(蜗牛), hahafan(注意!此人前途迷茫)请进,还有一问
- 当使用ADOCONNECTION连接ORACLE时报无法连接时,怎样缩短错误处理使其连接ACCESS的时间。
- Delphi DLL中报错floating point invalid operation 算术运算中发生溢出或下溢
- 这里有哪一家公司要卖ERP源码吗?
- win2003中文注释字体!
- 关于MDI编程,请指教!!!
也不同意楼上的同步,线程同步相当于让当前线程等待,等主线程做完才回到当前线程,
那样的话还不如不用线程。楼主的代码有问题,不要用 form.Invalidate;这样会慢死你,
再一个不要用 Image ,给楼主一个提示,做两幅图片,
第一步:清空背景图片,并在背景图片上面画文字,
第二步:把盖住文字的图片画在要画的位置。
第三步:把背景图片画到 Form 上。
给你个例子代码做参考:
procedure TForm1.Button5Click(Sender: TObject);
var
Text:string; //要画的文字
FrontImage:TBitmap; //盖住文字的图片
BackImage:TBitmap; //背景图片
i:Integer; //测试用的变量
begin
Text:='测试';
FrontImage:=TBitmap.Create;
BackImage:=TBitmap.Create;
try
FrontImage.LoadFromFile('c:\aa.Image');
BackImage.Assign(FrontImage);
BackImage.Canvas.Brush.Color:=clWhite; //假设背景色为白色
for i:=0 to 10 do
begin
BackImage.Canvas.FillRect(Rect(0,0,BackImage.Width,BackImage.Height));
BackImage.Canvas.Draw(i * 8,0,FrontImage);
BackImage.Canvas.TextOut(0,0,Text);
Self.Canvas.Draw(0,0,BackImage); //画到 Form 上。
end;
finally
FrontImage.Free;
BackImage.Free;
end;
end;
把 Timer 控件的 Interval 的值设成 1,
当button onmouseEnter的时候执行 Timer.Enabled:=True;
直到前景图片移出背景图片的时候再 Timer.Enabled:=False;
你说的被 frontimage 留下的痕迹应该是你没有用到如下:{
BackImage.Canvas.Brush.Color:=clWhite; //假设背景色为白色
for i:=0 to 10 do //<<---并且你看我用的循环,只是 0->10 当然会留下一半。
//只是个例子而以楼主要体会思想,用内存缓冲来做界面上面要做的事儿。
begin
BackImage.Canvas.FillRect(Rect(0,0,BackImage.Width,BackImage.Height));
}这段话吧,这段话就是用来清除前景图片留下的痕迹的。//下面这是我测试过的,你把 aa.bmp 按成你的 前景图片就行了。
procedure TForm1.Button5Click(Sender: TObject);
var
Text:string; //要画的文字
FrontImage:TBitmap; //盖住文字的图片
BackImage:TBitmap; //背景图片
i:Integer; //测试用的变量
begin
Text:='测试';
FrontImage:=TBitmap.Create;
BackImage:=TBitmap.Create;
try
FrontImage.LoadFromFile('c:\aa.bmp');
BackImage.Assign(FrontImage);
BackImage.Canvas.Brush.Color:=clWhite; //假设背景色为白色
for i:=0 to BackImage.Width do
begin
BackImage.Canvas.FillRect(Rect(0,0,BackImage.Width,BackImage.Height));
BackImage.Canvas.Draw(i,0,FrontImage);
BackImage.Canvas.TextOut(0,0,Text);
Self.Canvas.Draw(0,0,BackImage); //画到 Form 上。
end;
finally
FrontImage.Free;
BackImage.Free;
end;
end;
不要都是白色,怎么搞阿
你讲不要紧,我扛得住
procedure TForm1.Button5Click(Sender: TObject);
var
Text:string; //要画的文字
FrontImage:TBitmap; //前景图片
BackImage:TBitmap; //背景图片
DisplayImage:TBitmap; //要画的图
i:Integer; //测试用的变量
begin
Text:='测试';
FrontImage:=TBitmap.Create;
BackImage:=TBitmap.Create;
DisplayImage:=TBitmap.Create;
try
FrontImage.LoadFromFile('c:\aa.bmp');
BackImage.LoadFromFile('c:\bb.bmp');
for i:=0 to BackImage.Width do
begin
DisplayImage.Assign(BackImage);
DisplayImage.Canvas.Brush.Style:=bsClear;
DisplayImage.Canvas.TextOut(0,0,Text);
DisplayImage.Canvas.Draw(i,0,FrontImage);
Canvas.Draw(0,0,DisplayImage); //画到 Form 上。
end;
finally
FrontImage.Free;
BackImage.Free;
DisplayImage.Free;
end;
end;
还是要谢谢你!多聊几句我们揭帖