小技巧:快速添加项目到列表控件

小技巧:快速添加项目到列表控件

作者:BlogUpdater |  时间:2021-04-05 |  浏览:42 |  评论已关闭 条评论

值得拥有的小技巧一枚
如果你准备添加大量的项目到一个列表框(ListBox)或者组合下拉框(ComboBox),则我这里有一些你可能会需要的优化方法来显著地改进性能。(注意,这个技巧仅在你添加大量项目的时候才起作用。当然,从用户体验上来说,一个带有几百个项目的列表设计本身就值得考虑,但是我还是假设你确实有一些这样做的理由。)

首先,你可以在添加项目之前,禁用重绘。(实际上,这个方法适用于所有控件。)

SetWindowRedraw这个API定义在头文件中。
这个操作会在每次添加项目时禁用控件重绘。但是,你还可以像下面这样做:

如果是列表框控件,则请使用LB_INITSTORAGE这个消息。

cItems是你希望添加到列表中的总项目数,cbStrings则是你希望添加的所有项目需要的内存大小。

如果这些参数只是一些估计值,也没关系。如果你指定的参数比较小,则系统会在还需要的时候进行扩展。如果你指定的参数太大了,则一些内存依然会被分配,但是它们会处于未使用的状态。

有些人会建议:为什么不使用LockWindowUpdate呢?
实际上,这个方法不正确。LockWindowUpdate会禁止指定的窗口绘制,但是它并不是设计用来消除窗口闪烁的目的。

LockWindowUpdate的一个比较明显的限制是:在同一时刻,只有一个窗口可以被锁定刷新。如果在同一时刻,有两个窗口都试图调用LockWindowUpdate,则它们中只会有一个会调用成功。这显然不是一个很稳定的解决方案。

LockWindowUpdate这个API的目的是:用来帮助实现拖动窗口时的界面反馈代码。
如果你想在拖动窗口时绘制一个光标,你希望在绘制光标时不被窗口所覆盖,则你可以将窗口锁定,直到光标离开窗口才解锁。这才是LockWindowUpdate的使用场景。

这就解释了为什么同一时刻只能由一个窗口被锁定:因为在同一时刻,只能有一个窗口拖动操作正在进行,为什么?因为你只有一个鼠标啊。

总结
终于弄清SetRedraw和LockWindowUpdate的区别了,妈妈再也不用担心我写错代码了。

最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Speeding up adding items to a combobox or listbox》

评论已关闭。