【发布时间】:2013-01-09 08:27:39
【问题描述】:
我们有一个获胜控制对象,它将其客户移动到其他一些坐标。问题是,当孩子太多时——例如 500 个控件——代码真的很慢。
这一定是因为每次我设置 Left 和 Top 属性时都会重新绘制每个控件。所以,我想告诉 WinControl 对象停止被重新绘制,并且在将所有对象移动到它们的新位置之后,它可能会被再次绘制(类似于BeginUpdate 用于备忘录和列表对象)。我怎样才能做到这一点?
这是移动对象的代码;这很简单:
for I := 0 to Length(Objects) - 1 do begin
with Objects[I].Client do begin
Left := Left + DX;
Top := Top + DY;
end;
end;
【问题讨论】:
-
@kobik 不,您不应该为此调用该 API。它的用途完全不同。
-
@kobik:不!来自应该知道的人:blogs.msdn.com/b/oldnewthing/archive/2007/02/22/1742084.aspx
-
@UliGerhardt 和 David,我知道他知道,而且我知道该功能基本上用于拖动操作或屏幕捕获/间谍实用程序,但简单的事实是无论如何它似乎总是有效。 Raymond 建议的
WM_SETREDRAW过去似乎对我不起作用,所以我不使用它。而DisableAlign/EnableAlign并没有消除闪烁,但确实可以让事情变得更快。 -
@UliGerhardt,试试
WM_SETREDRAW(在Panel1.Handle上)和NGLN's code,你就会明白我的意思了。按钮冻结并且不会重新定位(而 LockWindowUpdate 工作得很好)。也许ScrollWindowEx更适合这种情况。那要看真实的代码和用法了……