如何使图象不闪烁?(100分)

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

lisong

Unregistered / Unconfirmed
GUEST, unregistred user!
我用copyrect来进行图象的拖动,用了两幅图,一幅放在timage内以供显示;一幅保存在tbitmap内,不显示。
timage控件放在panel上,当该图的长、宽都很大时,拖动时并没有闪烁,但当该图的长或宽中的某一个能在panel内全部显示时,如能显示图的全长,但须拖动来显示图的宽时,图片就会闪了,如何解决?
 
升级你的DELPHI
 
不会吧,我的已经是delphi5.0了!
 
我的http://lodgue.yeah.net上有一个Capture pro 程序在选择抓取范围
时,闪烁不严重。但是机子太低,会闪烁严重。不妨参考参考。
 
神秘岛有篇文章是关于这方面的,不知对你是否有用?
 
不太明白你的意思,但类似这种问题一般要用双缓冲的方法来解决。就是说把
对背景图象的一切改动都在内存中进行,最后才把改动后的图象Copy到窗口或
其它控件的画布上。这样可以解决闪烁的问题,但占用内存多且速度慢。
 
我估计是当图足够大,把整个的panel都覆盖后,显示时因为看不见panel,所以不用重画panel;当图的长或宽中的某一方面比panel小,这样就会重画panel,导致闪烁,是否这样?
双缓冲的机制是否先把处理后的图copy到内存里,在往外画?
另:神秘岛在哪?我是个新手的说。
 

摘自神秘岛:

?问:
图象或文本在移动时会发生抖动和屏幕的闪烁,如何处理?


--------------------------------------------------------------------------------
!答:
图象组件如Image、文本如Label在移动时,屏幕会发生闪烁,如果图象较小或者文本中字体较小,可能不会很明显。以下代码:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Image1.Left := Image1.Left + 1;
Label1.Left := Label1.Left + 1;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Timer1.Interval := 10;
Timer1.Enabled := True;
end;



  闪烁的情况会随图形的增大而增加,会随文字的变大、增多而增加。简单地分析一下它的原因,是因为每一次一个组件的位置属性如Left,Top等更改时,会自动触发它的刷新、重画过程。当重画的次数增大到某一程度时,我们便会感觉到闪烁。对于此问题,解决的方案很奇怪也有点难以解释,就是不要更改图象或者标签的位置,而让它们放在一个面板(Panel)内,然后只修改面板的位置属性,就不会闪烁。

  为了使面板不会影响瞻观,可以使它的AutoSize属性为真。试试这个:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Panel1.Left := Panel1.Left + 1;
Label1.Left := Label1.Left + 1;
end;

这样一来,图象的闪烁的基本消除了,就算多大的图象也不会闪烁。但是有一个问题,就是面板叠放的个数不能是偶数个,否则又会出现闪烁。真奇怪。

对于标签就没有这么幸运了,尽管放在面板上它的闪烁有所减少,但仍然较明显,属于不能忍受的程度,特别在领导面前演示时就更不好了。经过版主多方发掘,终于发现在LMD这套里组件里有一个面板:TLMDSimpleLabel,我们将标签放在此面板上移动面板就不会闪烁了。您不妨一试。 
 
to wjs:
上面所说的是拖动组件的情况吧。我的问题在于图片太大时,用鼠标拖动来看整幅图片,象acdsee一样。
 
这简单的很,只要用TPaintBox来代替TImage即可,当然,你这样你需做一些额外的工作,如绘画的时机等。
 
正如wjs所说的方法是可以的。
但据我了解可以使用线程的方法。先在后台生成一张图片,然后在让它显出,
具体操作我不是很清楚。sorry.
 
多人接受答案了。
 
后退
顶部