歌词(字幕)显示的一个例子,仍有闪烁,如何改进(200)

  • 主题发起人 主题发起人 luckywangxw
  • 开始时间 开始时间
L

luckywangxw

Unregistered / Unconfirmed
GUEST, unregistred user!
我要做个歌词显示的东东,目前滚动时 仍有闪烁,设置窗体的 DoubleBuffered:=true 也没用,请教高手完善此程序,能够实现平滑滚动,我想到了aafont 目前正在研究,但我更想知道如果不用aafont 在此程序基础上如何改进,将改进代码发上来 或mail to me:luckywangxw%%%tom.com (%%%换成@),,例子主要代码如下(下载地址http://bbs.2ccc.com/attachments/2009/luckywangxw2_2009919174035.rar):procedure TForm1.aDrawText;var aRect:TRect; i:integer;begin tbmp.Canvas.Brush.Color :=clblack; tbmp.Canvas.Font.Color :=clwindow; tbmp.Canvas.FillRect(tbmp.Canvas.ClipRect ) ; for i:=0 to memo1.Lines.Count -1 do begin aRect.Left :=0; aRect.Top := lineheight*i + aPos; aRect.Right :=tbmp.Width ; aRect.Bottom :=aRect.Top+ lineheight; DrawText(tbmp.Canvas.Handle, PChar(memo1.Lines.Strings ), Length(memo1.Lines.Strings),arect , DT_CENTER or DT_SINGLELINE or DT_VCENTER) end; BitBlt(GetDc(Panel1.handle),0,0,Panel1.Width,Panel1.Height, tBmp.Canvas.Handle,0,0,srcCopy);end;procedure TForm1.FormCreate(Sender: TObject);begin tbmp:=TBitmap.create; tbmp.Width :=panel1.Width ; tbmp.Height :=panel1.Height ; aPos:=0; //滚动位置 scrolltimer.Enabled :=true; refreshtimer.Enabled :=true;end;procedure TForm1.ScrollTimerTimer(Sender: TObject);begin aPos:=aPos-1; if aPos<-memo1.Lines.Count*lineheight then aPos:= panel1.Height ; end;procedure TForm1.ScrollTimerTimer(Sender: TObject);begin aPos:=aPos-1; if aPos<-memo1.Lines.Count*lineheight then aPos:= panel1.Height ; end;
 
一个很简单的解决方案:设置form.AlphaBlend:=True; 设置AlphaBlendValue:=254; 让Windows帮你double buffer
 
又见大侠,顶一下。呵呵。
 
双缓冲试试效果如何
 
把Panel1 换成Image1,代码也换一下试试: Self.Image1.Picture.Assign(tbmp); Image1.Refresh; //BitBlt(GetDc(Panel1.handle),0,0,Panel1.Width,Panel1.Height, //tBmp.Canvas.Handle,0,0,srcCopy);
 
该程序在 普通显示器上不闪烁,在液晶显示器上 闪烁
 
你的程序离播放LRC歌词的效果还差远了,解析歌词你没有,歌词播放可不是匀速的。并且播放要拖动歌词控制播放进度。我倒是写了一个控件,和千千静听的效果一样。不过,是为公司做的,不能给你。你最好自己封装一个控件。闪烁都会有点的,闪烁的效果和背景颜色有关。设置成DoubleBuffer也会感觉闪烁的。
 
前些天我倒是做了个小程序搜歌 放歌的,其中就有歌词显示,需要的话可以发你一份。。
 
zhousan大侠:能否发弟一份? machcat@126.com
 
我的 播放器已经实现 像千千那样的歌词显示的各种效果ftp://uploads@uploads.2ccc.com/MP3Player.rar我问的是 在我的液晶显示器上 存在的闪烁问题
 
看了下你的源代码,修改如下:var Form1: TForm1;constlineheight=18; panelheight=289;implementation{$R *.dfm}procedure TForm1.aDrawText;var aRect:TRect; i:integer;begin tbmp.Canvas.Brush.Color :=clblack; tbmp.Canvas.Font.Color :=clwindow; tbmp.Canvas.FillRect(tbmp.Canvas.ClipRect ) ; for i:=0 to memo1.Lines.Count -1 do begin aRect.Left :=0; aRect.Top := lineheight*i + aPos; aRect.Right :=tbmp.Width ; aRect.Bottom :=aRect.Top+ lineheight; DrawText(tbmp.Canvas.Handle, PChar(memo1.Lines.Strings ), Length(memo1.Lines.Strings),arect , DT_CENTER or DT_SINGLELINE or DT_VCENTER) end; BitBlt(GetDc(panel1.Handle),0,0,Panel1.Width,Panel1.Height, tBmp.Canvas.Handle,0,0,srcCopy);end;procedure TForm1.FormCreate(Sender: TObject);begin tbmp:=TBitmap.create; tbmp.Width :=panel1.Width ; tbmp.Height := panel1.Height ; aPos:=0; //&sup1;&ouml;&para;&macr;&Icirc;&raquo;&Ouml;&Atilde; //scrolltimer.Enabled :=true; refreshtimer.Enabled :=true;end;procedure TForm1.FormDestroy(Sender: TObject);begin tbmp.Free;end;procedure TForm1.ScrollTimerTimer(Sender: TObject);begin { aPos:=aPos-1; if aPos<-memo1.Lines.Count*lineheight then aPos:= panel1.Height ; }end;procedure TForm1.TrackBar1Change(Sender: TObject);begin scrolltimer.Interval :=TrackBar1.Position *10; label1.caption := '&sup1;&ouml;&para;&macr;&Euml;&Ugrave;&para;&Egrave; timer.interval :'+inttostr(scrolltimer.Interval) ;end;procedure TForm1.RefreshTimerTimer(Sender: TObject);begin aPos:=aPos-1; if aPos<-memo1.Lines.Count*lineheight then aPos:=panelheight ; aDrawText;end;procedure TForm1.TrackBar2Change(Sender: TObject);beginrefreshtimer.Interval := TrackBar2.Position *10; label2.caption := '&Euml;&cent;&ETH;&Acirc;&Euml;&Ugrave;&para;&Egrave; timer.interval :'+inttostr(refreshtimer.Interval) ;end;procedure TForm1.Button1Click(Sender: TObject);begin trackbar1.Position :=1; trackbar2.Position :=1;end;procedure TForm1.Button2Click(Sender: TObject);begin trackbar1.Position :=3; trackbar2.Position :=2;end;procedure TForm1.Button3Click(Sender: TObject);begin trackbar1.Position :=8; trackbar2.Position :=3;end;end.个人估计原因:1)Timer实际上开了个线程,2个Timer,也即是说2个线程,而且, A线程刷新页面的时候要调用B线程的计算结果。2)线程切换很浪费时间(要保存现场)3)用panelHeight代替Panel.width,线程中尽量不要访问主进程的控件数据。简单测试下,效果好了很多。还可以改进1)背景色用和字体色差较小的颜色。2)拦截Panel的刷新消息,不要接收windows的刷新消息。或者用 CreateWindows 创建一个自定义的‘Form’,可以参考2D游戏 编程。3)如果做到了条件2,估计可以改进算法,不用Tbmp了,直接 输出到目的DC上就可以了。。。楼主看看有用没。
 
后退
顶部