我找到了一個修復程序。德爾福似乎有一對夫婦與此錯誤的:
- 公佈ItemHeight屬性的值將被強制爲16,因爲TComboBoxEx類覆蓋了GetItemHt功能是一個硬編碼16.沒有任何方面對於該項目的實際大小 - 奇怪,因爲這完美的TComboBox。我不知道他們爲什麼決定採取這種策略。可能確保圖像始終適合。
- Delphi實際上並沒有調用CB_SETITEMHEIGHT消息,所以即使你重寫了這個函數,也沒有任何變化。
更新:
正如mghie指出的那樣,我在調用該消息沒有在不同的DPI設置以及工作中使用的15硬編碼值的初步設想。所以我現在使用GetTextMetrics來確定高度。添加到字體高度的是GetSystemMetrics(SM_CYBORDER)的值。
這是基於VCL確定TEdit大小的方式。我不認爲這是正確的,但是因爲我們的目標是讓ComboBoxEx和TEdit一樣大小,所以它可能就像我們會得到的一樣。並且它在DPI設置96,120,144和192下工作。
ComboBoxEx的高度由項目-1的高度決定。因此,項目0到count-1是實際列表項目,但項目-1是編輯器使用的高度。如果將此高度設置爲15,則控件的高度將更正爲21像素(請參閱上面的縮放問題更新)。我認爲梅森可能是正確的,字體大小在這裏扮演一個角色(可能調整項目大小),但你可以通過調整項目大小來使其工作得很好。
它看起來引入了一個新的(在我看來,更小)的問題,即在96 DPI時,16像素高圖像在編輯器部分中顯示最底部的線條,但這幾乎不明顯。
所以修復的話,就是調用這個代碼:
GetTextMetrics(Canvas.Handle, TM);
SendMessage(Handle, CB_SETITEMHEIGHT, -1,
GetSystemMetrics(SM_CYBORDER) * 2 + TM.tmHeight);
哇 - 整齊修復!我建議你將它添加爲你自己問題的「接受答案」。值得讚賞! – Roddy 2009-08-21 14:25:53
添加了答案,但我只能在一兩天內接受答案。還有一個警告涉及圖像的顯示 - 請參閱下面的答案。 – 2009-08-21 14:34:57