我正在创建一个有图标的表单-就像在桌面上一样,它们可以自由移动。我想有时甚至显示500个或更多的图标,所以他们需要快速工作。我的图标是:
TMyIcon = class(TGraphicControl)
所以它没有Windows句柄。绘图是:
- 1 x画布。矩形(约64 x32)
- 1 x Canvas.TextOut(比矩形小一点)
- 1 x Canvas.Draw(图像为32 x32)
移动东西的代码是这样的:MyIconMouseMove:
Ico.Left := Ico.Left + X-ClickedPos.X;
Ico.Top := Ico.Top + Y-ClickedPos.Y;
字符串
在窗体上通常有大约50个图标-其余的都在可见区域之外。当我有100个图标时-我可以自由移动它们,并且工作得很快。但是当我创建500个图标时,它就会变得滞后-但可见图标的数量仍然是一样的。我如何告诉Windows完全忽略不可见图标,以便一切顺利?
或者可能有一个组件可以显示类似桌面的图标,并能够移动它们?比如TShellListView with AutoArrange = False?
3条答案
按热度按时间bcs8qyzn1#
TGraphicControl是一个没有自己的句柄的控件。它使用其父控件来显示其内容。这意味着,更改控件的外观将迫使父控件也被重绘。这也可能触发重绘所有其他控件。
理论上,只有父控件X所在的部分需要被无效化,因此只有与该部分重叠的控件才需要被重新绘制。但是,这仍然可能导致连锁React,导致每次更改其中一个控件中的单个像素时,都会调用大量的绘制方法。
显然,可见区域之外的图标也会被重新绘制。我认为你可以通过将可见区域之外的图标的Visible属性设置为False来优化这一点。
如果这不起作用,你可能需要一个完全不同的方法:有一个选项可以在一个控件上绘制所有图标,允许你缓冲图像。如果你正在拖动一个图标,你可以在一个位图上绘制所有其他图标一次。在每次鼠标移动时,你只需要绘制那个缓冲的位图和被拖动的单个图标,而不是100(或500)个独立的图标。这应该会加快事情相当多,虽然它需要多一点的努力来开发。
你可以这样实现它:
字符串
然后,graphiccontrol本身:
型
创建其中一个控件,让它填充表单,并使用10000个图标初始化它。
型
这是一个有点快和肮脏,但它表明这个解决方案可能会工作得很好。如果你开始拖动(鼠标向下),你会注意到一个小的延迟,因为10000个图标被绘制在位图上,通过一个缓冲区。之后,没有可消除的延迟,而拖动,因为只有两个图像被绘制在每次重绘(而不是500在您的情况下)。
nlejzf6q2#
你可能想看看这个控件,这正是你所要求的。
rkView from RMKlever
它基本上是一个图标或照片缩略图浏览器与滚动等。
qvk1mo1f3#
如果您使用
application.onMessage
,请验证您的实现函数。我在使用这个的时候遇到了一个问题。我的函数使用
application.onmessage
交换了被聚焦的组件的颜色;这样,表单中的组件加载得非常慢。