2

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

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;
4

3 回答 3

3

移动面板不会花费很长时间。此外,要更新面板的父级,调用Form.Update应该就可以了。要强制只重绘表单的一部分,调用InvalidateRect应该做的,就像你已经做的那样(尽管尝试清除背景)。

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

  • 你做了一些广泛的自己的绘画Form.OnPaint
  • Anchors, Align, 和/或Constraints面板和/或形式相互矛盾或导致连锁反应(在这种情况下,尝试DisableAlignEnableAlign),
  • 该表单不是面板的直接父级,
  • 面板位于其他控件之上,
  • 你的updaterect变量是新的矩形而不是前一个,
  • 您的代码和/或调用例程中的其他内容,
  • 以上任意组合。
于 2012-09-28T05:28:03.033 回答
1

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

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

于 2012-09-28T03:29:18.720 回答
0

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

于 2012-09-28T01:46:14.150 回答