请问怎样才能在视频播放窗体上实现真正流动的文字(200分)

  • 主题发起人 主题发起人 wangxp
  • 开始时间 开始时间
W

wangxp

Unregistered / Unconfirmed
GUEST, unregistred user!
在自做的播放器的播放窗口上想实现自做的流动文字。以前用textout( )做的总是有底色,并有闪烁。请问有什么好办法,做出真正的流动的文字
 
最好用线程,用api函数
 
不断改变LABEL的LEFT不就可以了。
 
不行,改变Label的位置闪烁更厉害的
 
我认为这很难办。主要是由于播放窗口上的图象和自做的流动文字不是同一个作
图界面,他们有不同的过程来刷新的,会有闪烁。
我设想,好的方法是将被播放的图象帧截获,然后做流动的文字,最后再播放出
来。这很难,相当于在做视频编辑中字幕。
 
创建一个位图,把字画上去,根据需要,截取响应部分显示在窗体画布上。
 
我很感兴趣
 
用textout是可以的。
不要有底色的话你必须把cancas置成透明的。

Setbkmode(canvas.handle,transparent);
canvas.textout(1,1,'asfasdfasdf');

这样就透明没有底色了。
 
用 Canvas.CopyRect.你可以试试我写的动态雪花,我发给你。别忘给我加分。
 
R_Baggio
给我发
cxz888@263.net
 
我写了一个程序,文字流动的时候是不会闪烁的,希望你满意。

private
...
Bmp:TBitmap;
x:Integer;
procedure WMEraseBkGnd(var Msg:TWMEraseBkGnd);
message WM_ERASEBKGND;
...

procedure TForm1.FormCreate(Sender: TObject);
begin

Bmp:=TBitmap.Create;
x:=ClientWidth;
end;


procedure TForm1.FormDestroy(Sender: TObject);
begin

Bmp.Free;
end;


procedure TForm1.FormResize(Sender: TObject);
begin

Bmp.Width:=ClientWidth;
Bmp.Height:=ClientHeight;
Timer1Timer(Sender);
end;


procedure TForm1.FormPaint(Sender: TObject);
begin

Canvas.Draw(0,0,Bmp);
end;


procedure TForm1.Timer1Timer(Sender: TObject);
begin

Dec(x,20);
if x<=0 then
x:=ClientWidth;
with Bmp.Canvasdo
begin

Brush.Color:=clWhite;
FillRect(Rect(0,0,Bmp.Width,Bmp.Height));
Font.Color:=clBlue;
TextOut(x,10,'abcdefgh');
end;

Refresh;
end;


procedure TForm1.WMEraseBkGnd(var Msg:TWMEraseBkGnd);
begin

Msg.Result:=-1;
end;


 
请你参考:
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;
 
我是不是来晚了。。。
 
对procedure TForm1.WMEraseBkGnd(var Msg:TWMEraseBkGnd);的重载是消除闪烁的关键。
 
多人接受答案了。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部