小技巧:快速新增專案到列表控制元件

值得擁有的小技巧一枚

如果你準備新增大量的專案到一個列表框(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》

相關文章