在我的程序中,我有一个从上方滑出的自定义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;
答案 0 :(得分:3)
移动面板不应该花很长时间。此外,要更新面板的父级,对Form.Update
的调用应该没问题。要强制重绘表单的一部分,请调用InvalidateRect
,就像您已经完成的那样(尝试清除背景)。
延迟和/或弄脏的可能原因是:
Form.OnPaint
,Anchors
,Align
和/或Constraints
相互矛盾或导致连锁反应(在这种情况下,请尝试DisableAlign
和EnableAlign
),updaterect
变量是新矩形,而不是前一个,答案 1 :(得分:1)
使用Windows更新区域的另一种方法。 您的Tpanel是一个“句柄”属性,可以与invalidateRect一起使用。
通常vcl会重绘:
- 面板的背景
- 只有无效矩形中的控件
答案 2 :(得分:0)
尝试将父TForm的DoubleBuffered属性设置为True。这将有助于降低重绘的执行成本,并可能减少特写动画的抖动。