首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

值得拥有的小技巧一枚

如果你准备添加大量的项目到一个列表框(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》

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20210405A00Y8600?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券