2016-03-14 19 views
2

我有非常大數量的字符串要加載到MFC組合框。要設置我的組合框的寬度,我爲每個字符串使用GetTextExtent,並在我的組合框上設置最大範圍。這非常耗時,因爲調用GetTextExtent需要花費大量時間。在添加25000個字符串時,這變得非常昂貴。有沒有其他方法可以獲得我可以在組合框上設置的確切寬度?將大量字符串添加到MFC Combobox

+0

我試過Graphics.MesasureString,它也花費了相同的時間。有沒有其他方法? – user273121

+0

問題:我假設您在選擇完成後關注組合框**編輯**部分中字符串的寬度。如果組合框的寬度不夠,您擔心該字符串會被截斷? – rrirower

+0

在25000個元素 - 我會作弊。將GetTextExtent放在一個平均字符上 - 比如'a'並將其乘以最長字符串長度中的字符數。 –

回答

2

方法1:查找最壞的情況下要求

與開始: Which letter of the English alphabet takes up most pixels?

看起來性格W最寬字符。 (或使用循環查找最寬字符)您可以檢查最大字符串的長度,併爲所有字符填充W。現在這個字符串的寬度給出了組合框的最壞情況要求,如果它適合你的話。

方法2:保存幾個電話

找到最寬和最寬字符的比例。現在找到最大的字符串的長度。現在做第二次迭代,發現只有字符串長度的字符串的寬度大於largest_length * ratio。這將節省一些電話。

+0

我用第一種方法,我的客戶對UI不滿意。你能解釋一下方法2是如何工作的嗎? – user273121

+0

假設最寬字符是寬度爲24的「W」,最小寬字符是寬度爲12的寬度。現在假設最大字符串的長度爲50。現在,即使這個最大的字符串是由所有'i'構成的,它將比所有大小爲'25'或更大的字符串佔用更多的空間。即使它們是由所有「W」組成的。這意味着您可以跳過檢查長度爲25或更小的所有字符串的文本寬度。 ('max_len * least_wide_char/widest_char')。 –

+0

有什麼方法可以將調整大小選項設置到組合框的下拉列表中? – user273121

1

當即將顯示太長的字符串時,您可以動態更新ComboBox的寬度。如果你有25000個職位可以顯示,那麼你會有兩次。另一個提示是使用虛擬ListCtrl - 但只有將所有這些字符串添加到您的組合框太慢。

+0

有沒有什麼方法可以將調整大小選項設置爲組合框的下拉列表? – user273121

+0

@ user273121我不知道我是否理解,但看到這篇文章:https://weseetips.wordpress.com/tag/adjust-combobox-dropdown-width/,你應該使用CComboBox :: SetDroppedWidth – marcinj

+0

嗨,我是已經在使用這個選項。但是爲了設置dropdwon框的寬度,對於性能問題,我不想使用GetTextExtent()方法。所以,如果我爲我的下拉框設置大致的寬度,我想要有可調整大小的抓手,用戶可以將下拉框擴展到所需的大小,就像調整窗口大小一樣。 – user273121