仅使用Delphi重绘小部分表单?

时间:2012-09-28 01:20:51

标签: delphi redraw

在我的程序中,我有一个从上方滑出的自定义TPanel,上面有按钮和图像。它滑出来很好但是当我去隐藏它时,它非常慢。我尝试了几种方法,结果都是一样的。如果您在下面注意到我尝试了Redraw,我可以重新绘制尾随矩形但是这个调用重绘了整个表单,就像我尝试过的所有其他方法一样。我甚至尝试使用滚动。我是说错了还是有更好的方法来更新需要更新的表单部分,因为面板向上移动了?

while z>mypanels[panel].Fstarttop do
begin
   if z-x<mypanels[panel].Fstarttop then z:=mypanels[panel].Fstarttop else z:=z-x;
   updaterect:=Rect(mypanels[panel].left,z+mypanels[panel].height,mypanels[panel].left+mypanels[panel].width,mypanels[panel].top+mypanels[panel].height);
   mypanels[panel].top:=z;
   //mypanels[panel].Repaint;
   //Application.ProcessMessages;  
   //mypanels[panel].ScrollBy(0,-x);
   //InvalidateRect(form1.Handle,@updaterect,FALSE);
   //Application.ProcessMessages;
   //RedrawWindow(form1.Handle,@updaterect, 0, RDW_UPDATENOW);
   //form1.refresh;
end;

3 个答案:

答案 0 :(得分:3)

移动面板不应该花很长时间。此外,要更新面板的父级,对Form.Update的调用应该没问题。要强制重绘表单的一部分,请调用InvalidateRect,就像您已经完成的那样(尝试清除背景)。

延迟和/或弄脏的可能原因是:

  • 你在Form.OnPaint
  • 中做了一些广泛的绘图 小组和/或表格的
  • AnchorsAlign和/或Constraints相互矛盾或导致连锁反应(在这种情况下,请尝试DisableAlignEnableAlign),
  • 表单不是面板的直接父级,
  • 该小组已超过其他控件,
  • 您的updaterect变量是新矩形,而不是前一个,
  • 代码中的其他内容和/或调用例程,
  • 上述任意组合。

答案 1 :(得分:1)

使用Windows更新区域的另一种方法。 您的Tpanel是一个“句柄”属性,可以与invalidateRect一起使用。

通常vcl会重绘:
- 面板的背景
- 只有无效矩形中的控件

答案 2 :(得分:0)

尝试将父TForm的DoubleBuffered属性设置为True。这将有助于降低重绘的执行成本,并可能减少特写动画的抖动。