小技巧:快速新增專案到列表控制元件
值得擁有的小技巧一枚
如果你準備新增大量的專案到一個列表框(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》
相關文章
- 2021-09-217-24個月的寶寶如何餵養?每天吃幾次奶幾次飯?安排指南可收
- 2021-09-09寶寶多大可以吃鹽? 時間並不是越晚越好, 補充鹽分有講究
- 2021-06-10這汗血寶馬,以一己之力拖動了整個戰場
- 2021-05-16銀行為何總讓你排隊等待,也不願多開幾個視窗?業內人士說出答案
- 2021-05-06為什麼前女友不提複合,但是又願意聊天曖昧?揭秘女生真實內心