用Image.canvas.textout和timer在图片上滚动输出文字时总是闪烁,怎么办??(50分)

  • 主题发起人 主题发起人 HeartFly
  • 开始时间 开始时间
你的代码?
 
大致就是用定时器控制在画布上滚动输出文字
procedure TMainForm.ScrTimerTimer(Sender: TObject);
var
ActualScrTxt : String ;
ActualScrTxt_Pix : Integer ;
begin
ActualScrTxt_Pix := PassScrTxt_Pix ( ScrTxt_Pix ) ;
ActualScrTxt := PassScrTxt ( ScrTxt ) ;

if ScrTxt<>'' then
begin
if (ScrOutX > - ActualScrTxt_Pix) and (ScrOutX <= Image1.ClientWidth ) then
begin
Image1.Canvas.Brush.Color := clWhite ;
Image1.Canvas.FillRect( Canvas.ClipRect ) ;
Image1.canvas.TextOut( ScrOutX, 0, ActualScrTxt );
ScrOutX := ScrOutX - Decr;
end else
ScrOutX := Image1.ClientWidth ;
end
else
begin
if ( ScrTempX > - Label2.ClientWidth) and (ScrTempX <= Image1.ClientWidth) then
begin
Image1.Canvas.Brush.Color := clWhite ;
Image1.Canvas.FillRect( Canvas.ClipRect ) ;
Image1.canvas.TextOut( ScrTempX, 0, ScrTempTxt );
ScrTempX := ScrTempX -Decr ;
end
else
ScrTempX := Image1.ClientWidth ;
end;

end;
 
这句话是干什么的? 好像没什么用?
Image1.Canvas.FillRect( Canvas.ClipRect )
 
他那句的意思好像是恢复原来的图像,呵呵,你好啊,cAkk,
这样做肯定就会有一些闪烁了,我看不如这样,在Image上
放一个Label,让它Transparent,这样的话,直接控制它
就行了,我试过的,用Label不会闪烁的,因为它设计的比较
好,毕竟是标准的组件.
 
我做的是类似新浪的’点点通‘那样滚动播放新闻的,必须用我上边的方法了,现在就差闪烁的问题没解决了,大家帮我想想办法拉!!!
 
程序里构建局部位图变量,先在局部位图变量上输出文字,然后再将其画在Canvas
上Canvas.Draw(x,y,TempBitmap);
注意记住释放位图变量
 
你既然设置了文本的背景颜色(brush.color),那么textout的时候会自动
覆盖原来的文字的呀! 为什么还要fillrect呢?
 
to Cakk ,呵呵,如果让他反方向滚动时,没有fillrect就会有文字重叠了。
现在主要是闪烁问题喔,你有办法吗??
 
用两个Image, 交替输出文本!在timer事件里用一id区分image就可一了!
 
textout之前用空格把字符串填满,就不用fillrect了.
不用fillrect应该就不会有闪烁罢?
 
lzzhouhu,用LABEL会闪烁,如将MOUSE移动到一个LABEL时变色,移到到背景时恢复
原色,这时,LABEL是TRANSPARENT时,也会闪烁.
 
cakk,我不明白你的意思, 用空格填满了, 那么滚动的内容又放哪里????
 
你不是说用我说的方法会发生文字重叠吗? 你把重叠部分用空格填满,不就
不存在重叠现象了吗?
 
可以每次修改空格的数量。
 
仿 电 视 移 动 字 幕 或 图 像, 用 此 方 法 制 作 移 动 字 幕 的 基 本 方 法 是: 首 先 选 定 一 个 可 作 为 画 布 的 控 件, 比 如 FORM 或IMAGE, 然 后 用 一 种 填 充 颜 色 填 满 整 个 画 布, 在 画 布 的 固 定 位 置 显 示 一 个 特 殊 前 景 色 固 定 尺 寸 的 字 符 串, 在 TIMER 控 件 中 定 时 连 续 改 变 显 示 字 符 串 的 位 置, 由 于 原 来 位 置 的 字 符 串 不 能 自 动 消 失, 所 以 需 要 用 与 填 充 颜 色 相 同 颜 色 的 线 条 覆 盖 多 余 部 分, 这 样 即 可 实 现 平 滑 的 字 幕 移 动 效 果; 实 现 图 像 移 动 的 方 法: 可 事 先 定 义Bitmap 类 和Rect 类 变 量, 在 程 序 运 行 阶 段 建 立Bitmap 和Rect 对 象, 并 在Bitmap 中 装 入 指 定 的 图 像 文 件, 同 时 把 对 象Bitmap 装 入Rect 对 象 中 实 现 图 像 的 显 示, 然 后 在Timer 控 件 中 定 时 连 续 改 变Rect 的 坐 标 值, 并 用 与 填 充 颜 色 相 同 的 线 条 覆 盖 遗 留 图 像 部 分, 即 可 以 实 现 图 像 的 平 稳 移 动; 采 用 上 述 方 法 实 现 的 字 符 串 或 图 像 移 动 操 作, 其 效 果 平 稳, 无 任 何 闪 烁 或 抖 动 现 象, 视 觉 效 果 极 佳; 编 程 举 例: 在 窗 体 中 安 放 时 间 控 件TIMER1、 图 像 框IMAGE1, 定 义TRECT 及TBITMAP 型 变 量, 并 在FormCreate 和Timer1Timer 事 件 中 安 排 如 下 代 码, 程 序 运 行 之 后 即 会 在 图 像 框 中 出 现 至 下 而 上 的 移 动 字 幕 及 图 像 效 果, 并 从 顶 部 消 失, 之 后 重 新 从 底 部 出 现;
var { 定 义 变 量}
Form1: TForm1;
x,tt,l,h:integer;
pic:Trect;
map:Tbitmap;
{ 具 体 动 画 演 示 代 码}
procedure TForm1.Timer1Timer(Sender: TObject);
begin
x:=x-1;
tt:=tt-1;
if x<-160 then
x:=image1.height+20;
tt:=x+80;
image1.Canvas.font.size:=18;
image1.Canvas.font.color:=$1200ffff;
image1.Canvas.TextOut(10,x,'OK 字 幕 移 动 演 示');
image1.Canvas.font.size:=12;
image1.Canvas.font.color:=$120000ff;
image1.Canvas.TextOut(20,x+50,' 字 体 变 色 效 果 演 示');
l:=image1.Canvas.textwidth(' 字 体 变 色 效 果 演 示');
h:=image1.Canvas.textheight(' 字 体 变 色 效 果 演 示');
image1.Canvas.pen.color:=clGreen;
image1.Canvas.moveto(20,h+x+50-2);
image1.Canvas.lineto(20+l,h+x+50-2);
pic.topleft.x:=30;
pic.topleft.y:=tt;
pic.bottomright.x:=pic.topleft.x+100;
pic.bottomright.y:=pic.topleft.y+80;
image1.canvas.stretchdraw(pic,map);
image1.Canvas.pen.color:=clGreen;
image1.Canvas.moveto(0,pic.topleft.y+80);
image1.Canvas.lineto(pic.topleft.x+100,pic.topleft.y+80);
end;
{ 以 下 设 置 动 画 初 值}
procedure TForm1.FormCreate(Sender: TObject);
begin
timer1.enabled:=true;
timer1.Interval:=10;
x:=image1.height+20;
tt:=x+80;
form1.repaint;
image1.Canvas.brush.color:=clGreen;
pic:=Rect(0,0,image1.width,image1.height);
image1.Canvas.FillRect(pic);
pic:=Rect(-1,-1,1,1);
map:=Tbitmap.create;
map.loadfromfile('d:/windows/256color.bmp');
image1.canvas.stretchdraw(pic,map);
end;
 
我觉得还是用CopyRect比较好,我做过实验,可以没有闪烁
就是要自己分裂画面:)
 
使用两个image控件,让其中一个image<i>A</i>.visible := false;
(另一个image<i>B</i>.visible := true;)
image<i>A</i>.visible := false 的控件上处理要显示的数据,处理
好后 将:
image<i>A</i>.visible := true ;
image<i>B</i>.visible := false ;
下一个Timer事件再对image<i>B</i>.visible := false 进行类似的处理
 
use Double Image Buffer.but you don't.why don't?
 
这个问题我也遇到过了,可以Tbitmap 进行缓冲,方法是这样的:
TBitImage: bufferimage
将要写文字部分的背景copy 到bufferimage 上,在bufferimage上
输出要写的文字,再用Canvas.draw(x,y,bufferimage),
把bufferimage copy到原来的图形上,(注意:将bufferimage释放掉)
 
后退
顶部