gpt4 book ai didi

delphi - 我可以让 TComboBoxEx 与 TComboBox 具有相同的高度吗?

转载 作者:行者123 更新时间:2023-12-03 15:08:45 26 4
gpt4 key购买 nike

在 Delphi 中,所有 TEdit 和 TComboBox 控件默认高度都是 21 像素。对于 TComboBox,这个大小是绝对的,尝试将其拉伸(stretch)到更大是行不通的。但就 TComboBoxEx 而言,默认高度为 22 像素,这使得它在您使用它的任何表单上都显得有点突出。现在根据Microsoft docs , ComboBoxEx 本质上是一个具有所有者绘制功能的 ComboBox,可处理以允许图像和缩进。

那么我的 TComboBoxEx 控件是否可以设置为 21 像素高?这取决于什么?

更新:我添加了 Quality Central report正如罗迪所建议的那样,关于这个问题。另外,我找到了修复方法。显然,大小取决于组合框中项目 -1 的大小。因此,您将该大小设置为 15(或比默认大小小 1 个像素),并且该框缩小为更熟悉的 21 像素。

最佳答案

我找到了修复方法。 Delphi 似乎有一些与此相关的错误:

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

更新:

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

这是基于 VCL 确定 TEdit 大小的方式。我认为这不太正确,但由于目标是使 ComboBoxEx 与 TEdit 具有相同的大小,因此它可能是我们所能得到的最接近的。它适用于 96、120、144 和 192 的 DPI 设置。

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

关于delphi - 我可以让 TComboBoxEx 与 TComboBox 具有相同的高度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1311959/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com