5

Delphi では、すべての TEdit コントロールと TComboBox コントロールの高さがデフォルトで 21 ピクセルです。TComboBox の場合、このサイズは絶対的なものであり、より大きなサイズに拡張しようとしても機能しません。ただし、TComboBoxEx の場合、デフォルトの高さは 22 ピクセルであるため、使用するどのフォームでも少し目立ちます。Microsoft docsによると、ComboBoxEx は基本的に、画像とインデントを許可するために処理される所有者描画機能を備えた ComboBox です。

TComboBoxEx コントロールの高さを 21 ピクセルにすることは可能ですか? これは何に依存していますか?

更新: Roddy の提案に従って、この問題に関するQuality Central レポートを追加しました。また、私は修正を見つけました。どうやら、サイズはコンボボックスの項目 -1 のサイズに依存します。そのサイズを 15 (または既定のサイズよりも 1 ピクセル小さい) に設定すると、ボックスはより見慣れた 21 ピクセルに縮小されます。

4

3 に答える 3

6

修正を見つけました。Delphi には、これに関連するいくつかのバグがあるようです。

  1. 発行された ItemHeight プロパティの値は 16 に強制されます。これは、TComboBoxEx クラスが GetItemHt 関数をオーバーライドしてハードコードされた 16 にするためです。アイテムの実際のサイズはまったく関係ありません - これは TComboBox で完全に機能するため、奇妙です。なぜ彼らがこの戦略を採用することにしたのか、私にはわかりません。おそらく、画像が常に収まるようにするためです。
  2. 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);
于 2009-08-21T14:33:07.630 に答える
1

TComboBox の高さは絶対ではありません。使用するフォントの高さに関連付けられています。TComboBoxEx も同じように機能しますが、ご指摘のとおり、「オーバーヘッド」のピクセルが 1 つ余分にあるようで、それを変更する簡単な方法はないようです。これが組み込みの Windows コントロールのラッパーである場合、Delphi レベルで変更する方法がない可能性があります。

于 2009-08-21T13:42:08.680 に答える
1

TComboBoxEx の高さを変更する 2 つの方法がありますが、残念ながら、どちらもおそらくあなたが望むものではありません。

  • font.size プロパティを小さく設定すると、ボックスが縮小します。(ただし、テキストは小さくなります)

  • StyleEx.csExNoSizeLimit := false を設定してから、必要に応じて Height := 21 を設定します。残念ながら、これはボックスが切り取られるだけなので、下部のベゼルが消えてしまいます。

おそらく、すべての TComboBoxes を TComboBoxEx に置き換えます。GExperts に、これを行うための優れた「コンポーネントの置き換え」ウィザードがあります。

これは Delphi のバグのようです。QC経由で報告しましたか?

于 2009-08-21T13:45:44.980 に答える