代码之家  ›  专栏  ›  技术社区  ›  Cobus Kruger

我能让tcomboxex和tcomboxex一样高吗?

  •  5
  • Cobus Kruger  · 技术社区  · 15 年前

    在Delphi中,默认情况下,所有的Tedit和TcomboBox控件都是21像素高。在tcomboBox中,这个大小是绝对的,试图将其扩展到更大的大小是行不通的。不过,在tcomboxex的情况下,默认高度是22像素,这使得它在您使用它的任何形式上都有一点突出。现在根据 Microsoft docs ,ComboBox本质上是一个ComboBox,它的所有者绘制功能被处理为允许图像和缩进。

    那么是否可以让我的tcomboxex控件高21像素?这取决于什么?

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

    3 回复  |  直到 15 年前
        1
  •  6
  •   Cobus Kruger    15 年前

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

    1. 已发布的itemheight属性的值被强制为16,因为tcomboxex类将重写getitemht函数,使其成为硬编码的16。不考虑物品的实际尺寸-很奇怪,因为这在tcomboBox上非常有效。我不知道他们为什么决定采用这种策略。可能是为了确保图像始终适合。
    2. Delphi实际上并没有调用cb-setitemheight消息,所以即使覆盖了这个函数,也不会有任何变化。

    更新:

    正如mghie所指出的,我最初在调用消息时使用硬编码值15的想法在不同的dpi设置下效果不佳。所以我现在使用一个call来获取extmetrics来确定高度。添加到字体高度的是getSystemMetrics(sm_cyborder)的值。

    这是基于VCL确定Tedit大小的方式。我不认为这是完全正确的,但由于目标是拥有与泰迪大小相同的组合框,它可能是我们将得到的最接近。它可以在96、120、144和192的dpi设置下工作。

    组合框的高度由项目-1的高度决定。因此,从0到count-1的项是实际的列表项,但item-1是用于编辑器的高度。如果将该高度设置为15,则控件的高度将更正为21像素。 (有关缩放问题,请参阅上面的更新) .我认为梅森可能是对的,字体大小在这里起到了一定的作用(可能会调整项目的大小),但你可以通过调整项目大小使其正常工作。

    它似乎引入了一个新的问题(在我看来,较小的问题),即在96 dpi 16像素高的图像中,当显示在编辑器部分时,最下面的一行松动,但这几乎不明显。

    因此,解决方法是调用以下代码:

    GetTextMetrics(Canvas.Handle, TM);
    SendMessage(Handle, CB_SETITEMHEIGHT, -1, 
      GetSystemMetrics(SM_CYBORDER) * 2 + TM.tmHeight);
    
        2
  •  1
  •   Mason Wheeler    15 年前

    tcomboBox的高度不是绝对的;它与您使用的字体高度相关。tcomboxex的工作原理是一样的,但它似乎有一个额外的“开销”像素,正如您所指出的,而且似乎没有任何简单的方法可以改变这个情况。如果这是一个内置Windows控件的包装器,那么在delphi级别,period上可能没有任何方法可以更改它。

        3
  •  1
  •   Roddy    15 年前

    有两种方法可以改变tcomboxex的高度,不幸的是,这两种方法都不是你想要的。

    • 将FONT.SIZE属性设置为较小-框将收缩。(但是,您的文本较小)

    • 设置styleex.csexnosizelimit:=false,然后根据需要设置height:=21。不幸的是,这只会导致你的框被剪辑,所以底部的边框消失。

    我可能会用tcomboxex替换所有tcomboxes- GExperts 有一个优秀的“替换组件”向导来完成这项工作。

    这看起来像一个Delphi bug。你已经通过质量控制报告过了吗?