修正を見つけました。Delphi には、これに関連するいくつかのバグがあるようです。
- 発行された ItemHeight プロパティの値は 16 に強制されます。これは、TComboBoxEx クラスが GetItemHt 関数をオーバーライドしてハードコードされた 16 にするためです。アイテムの実際のサイズはまったく関係ありません - これは TComboBox で完全に機能するため、奇妙です。なぜ彼らがこの戦略を採用することにしたのか、私にはわかりません。おそらく、画像が常に収まるようにするためです。
- Delphi は実際には CB_SETITEMHEIGHT メッセージを呼び出さないため、この関数をオーバーライドしても何も変わりません。
アップデート:
mghie が指摘したように、メッセージの呼び出しにハードコードされた 15 の値を使用するという私の最初のアイデアは、異なる DPI 設定ではうまく機能しません。そのため、GetTextMetrics への calll を使用して高さを決定しています。フォントの高さに追加されるのは、GetSystemMetrics(SM_CYBORDER) の値です。
これは、VCL が TEdit のサイズを決定する方法に基づいています。まったく正しいとは思いませんが、目標は ComboBoxEx を TEdit と同じサイズにすることなので、おそらくこれに近いサイズになります。また、96、120、144、192 の DPI 設定で動作します。
ComboBoxEx の高さは、アイテムの高さ -1 によって決まります。したがって、アイテム 0 から count-1 は実際のリスト アイテムですが、アイテム -1 はエディターに使用される高さです。その高さを 15 に設定すると、コントロールの高さは 21 ピクセルに修正されます(スケーリングの問題については、上記の更新を参照してください)。ここでフォント サイズが重要な役割を果たす (おそらくアイテムのサイズを変更する) という Mason の意見は正しいと思いますが、アイテムのサイズを調整することで問題なく機能させることができます。
96 DPI で 16 ピクセルの高さの画像をエディター部分に表示すると、一番下の行が失われるという新しい (私の見解では小さい) 問題が発生しているように見えますが、それはほとんど目立ちません。
したがって、修正はこのコードを呼び出すことです:
GetTextMetrics(Canvas.Handle, TM);
SendMessage(Handle, CB_SETITEMHEIGHT, -1,
GetSystemMetrics(SM_CYBORDER) * 2 + TM.tmHeight);