2009-08-21 108 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