加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 09:33:04 所属栏目:大数据 来源:网络整理
导读:在Delphi中,所有TEdit和TComboBox控件默认为21像素高.在TComboBox的情况下,这个大小是绝对的,并试图将它拉伸到更大的东西是行不通的.在TComboBoxEx的情况下,默认高度为22像素,这使得它在您使用它的任何形式上都很突出.现在根据 Microsoft docs,ComboBoxEx本
在Delphi中,所有TEdit和TComboBox控件默认为21像素高.在TComboBox的情况下,这个大小是绝对的,并试图将它拉伸到更大的东西是行不通的.在TComboBoxEx的情况下,默认高度为22像素,这使得它在您使用它的任何形式上都很突出.现在根据 Microsoft docs,ComboBoxEx本质上是一个ComboBox,其处理所有者绘制的功能以允许图像和缩进.

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

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

解决方法

我发现了一个问题.德尔福似乎有一些与此相关的错误:

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

更新:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读