我找到了一个修复程序。德尔福似乎有一对夫妇与此错误的:
- 公布ItemHeight属性的值将被强制为16,因为TComboBoxEx类覆盖了GetItemHt功能是一个硬编码16.没有任何方面对于该项目的实际大小 - 奇怪,因为这完美的TComboBox。我不知道他们为什么决定采取这种策略。可能确保图像始终适合。
- 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);
哇 - 整齐修复!我建议你将它添加为你自己问题的“接受答案”。值得赞赏! – Roddy 2009-08-21 14:25:53
添加了答案,但我只能在一两天内接受答案。还有一个警告涉及图像的显示 - 请参阅下面的答案。 – 2009-08-21 14:34:57