我可以让TComboBoxEx与TComboBox一样高吗?

时间:2009-08-21 13:29:55

标签: delphi height

在Delphi中,所有TEdit和TComboBox控件默认为21像素高。在TComboBox的情况下,这个大小是绝对的,并试图将它拉伸到更大的东西是行不通的。在TComboBoxEx的情况下,默认高度为22像素,这使得它在您使用它的任何形式上都很突出。现在根据Microsoft docs,ComboBoxEx本质上是一个ComboBox,其处理所有者绘制的功能以允许图像和缩进。

那么可以让我的TComboBoxEx控件高21像素吗?这取决于什么?

更新:根据罗迪的建议,我在问题上添加了Quality Central report。另外,我发现了一个问题。显然,大小取决于组合框中项目-1的大小。因此,您将该大小设置为15(或小于默认大小的一个像素),并且框缩小为更熟悉的21像素。

3 个答案:

答案 0 :(得分:6)

我找到了解决办法。德尔福似乎有一些与此相关的错误:

  1. 已发布的ItemHeight属性的值被强制为16,因为TComboBoxEx类会将GetItemHt函数重写为硬编码16.不考虑项目的实际大小 - 奇怪,因为这完全适用于TComboBox。我不知道为什么他们决定采用这种策略。可能确保图像始终适合。
  2. Delphi实际上并没有调用CB_SETITEMHEIGHT消息,因此即使您覆盖此函数也没有任何变化。
  3. <强>更新

    正如mghie所指出的,我在调用消息时使用硬编码值15的初步想法在不同的DPI设置下效果不佳。所以我现在使用Calll来GetTextMetrics来确定高度。添加到字体的高度是GetSystemMetrics(SM_CYBORDER)的值。

    这是基于VCL确定TEdit大小的方式。我不认为这是正确的,但由于目标是让ComboBoxEx与TEdit的大小相同,它可能就像我们得到的那样接近。它的DPI设置为96,120,144和192.

    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);
    

答案 1 :(得分:1)

TComboBox的高度不是绝对的;它与您使用的字体的高度相关联。 TComboBoxEx以相同的方式工作,但它似乎有一个额外的“开销”像素,正如您所指出的那样,似乎没有任何简单的方法来改变它。如果这是内置Windows控件的包装器,则可能无法在Delphi级别更改它。

答案 2 :(得分:1)

两种改变TComboBoxEx高度的方法,遗憾的是,这两种方法都不是你想要的。

  • 将font.size属性设置得更小 - 该框将缩小。 (但是,你的文字较小)

  • 设置StyleEx.csExNoSizeLimit:= false,然后根据需要设置Height:= 21。不幸的是,这只会导致您的盒子被剪裁,因此底部边框会消失。

我可能会用TComboBoxEx替换所有TComboBox - GExperts有一个很棒的'替换组件'向导来执行此操作。

这看起来像是一个Delphi错误。你有没有通过QC报告过?