2009-08-21 88 views
5

在Delphi中,默認情況下,所有TEdit和TComboBox控件的高度都是21像素。在TComboBox的情況下,這個大小是絕對的,並試圖將其擴展到更大的東西不起作用。但在TComboBoxEx的情況下,默認高度是22像素,這使得它在使用它的任何形式上都有一點突出。現在根據Microsoft docs,ComboBoxEx基本上是一個ComboBox,其自繪功能被處理以允許圖像和縮進。我可以將TComboBoxEx的高度與TComboBox的高度相同嗎?

那麼是否有可能使我的TComboBoxEx控件21像素高?這取決於什麼?

更新:我添加了一個Quality Central report在這個問題上,正如Roddy所建議的。另外,我找到了一個修復程序。顯然,大小取決於組合框中項目-1的大小。因此,您將該大小設置爲15(或比默認大小小一個像素),並將該框縮小到更熟悉的21像素。

+0

哇 - 整齊修復!我建議你將它添加爲你自己問題的「接受答案」。值得讚賞! – Roddy 2009-08-21 14:25:53

+0

添加了答案,但我只能在一兩天內接受答案。還有一個警告涉及圖像的顯示 - 請參閱下面的答案。 – 2009-08-21 14:34:57

回答

6

我找到了一個修復程序。德爾福似乎有一對夫婦與此錯誤的:

  1. 公佈ItemHeight屬性的值將被強制爲16,因爲TComboBoxEx類覆蓋了GetItemHt功能是一個硬編碼16.沒有任何方面對於該項目的實際大小 - 奇怪,因爲這完美的TComboBox。我不知道他們爲什麼決定採取這種策略。可能確保圖像始終適合。
  2. 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); 
+0

DPI設置爲124的筆記本電腦上的TEdit當然不是21像素高。硬編碼的高度是錯誤的,無論它們是否適用於您,返回15並不比返回16好。那麼不同的字體或DPI設置如何?一個真正的解決方案將涉及獲取字體的高度,並基於此計算物品高度。 – mghie 2009-08-21 15:59:13

+0

-1硬編碼常量,如mghie解釋 – 2009-08-21 16:38:19

+0

關於DPI設置的要點。所以現在我需要知道編輯框的高度是如何計算的。 我看着計算基於字體高度的項目高度,但我不明白這是如何讓他們到16位 - 我實際上認爲它被選中,所以16x16符號將適合。在96 DPI和120上都有效,調用GetTextMetric和使用tmHeight + 2.我認爲使用tmHeight + tmInternalLeading是正確的,但是它只能在120 DPI下運行。我可以從15開始,將其從96增加到120,但這看起來也不錯。 任何想法? – 2009-08-22 05:48:16

1

TComboBox的高度不是絕對的;它與您使用的字體的高度相關。 TComboBoxEx的工作方式相同,但它似乎有一個額外的像素「開銷」,正如你所指出的,似乎沒有任何簡單的方法來改變它。如果這是一個內置的Windows控件的包裝器,那麼可能沒有任何方法可以在Delphi級別的時期對其進行更改。

+0

除非你想創建自己的版本,但我不認爲這是一個有效的選項;-)。 – 2009-08-21 13:46:31

1

有兩種方法可以改變TComboBoxEx的高度,但不幸的是這兩種方法都不是你想要的。

  • 將font.size屬性設置得更小 - 該框會縮小。 (但是,文字較小)

  • 設置StyleEx.csExNoSizeLimit:= false,然後根據需要設置Height:= 21。不幸的是,這隻會導致你的盒子被裁剪,所以底部的擋板消失了。

我可能會取代TComboBoxEx所有TComboBoxes - GExperts有着輝煌的「更換組件」嚮導這樣做。

這看起來像一個Delphi錯誤。你有沒有通過QC報告過?

+0

添加QC報告。鏈接添加到問題。 – 2009-08-21 14:15:53