Я могу заставить TComboBoxEx быть той же Высотой как TComboBox?

Используя EM масштабирование более универсально со шрифтами. Это также более доступно.

, Если Вы не работали с этим прежде, инструмент как , Калькулятор Эма может быть очень полезен для понимания, как тег/модель работает.

5
задан Cobus Kruger 21 August 2009 в 14:19
поделиться

3 ответа

Я нашел исправление. В Delphi есть несколько ошибок, связанных с этим:

  1. Значение опубликованного свойства ItemHeight принудительно равняется 16, потому что класс TComboBoxEx переопределяет функцию GetItemHt как жестко запрограммированную 16. Никакого отношения к фактическому размер элемента - странно, так как это отлично работает на TComboBox. Я не знаю, почему они решили придерживаться этой стратегии. Вероятно, чтобы изображения всегда подходили.
  2. Delphi на самом деле не вызывает сообщение CB_SETITEMHEIGHT, поэтому даже если вы переопределите эту функцию, ничего не изменится.

Обновление:

Как указано mghie, мое первоначальное представление использование жестко запрограммированного значения 15 при вызове сообщения не работает при разных настройках DPI. Итак, теперь я использую вызов GetTextMetrics для определения высоты. К высоте шрифта добавляется значение GetSystemMetrics (SM_CYBORDER).

Это основано на том, как VCL определяет размер TEdit. Я не думаю, что это правильно, но поскольку цель состоит в том, чтобы ComboBoxEx имел тот же размер, что и TEdit, он, вероятно, настолько близок, насколько мы сможем получить. И он работает с настройками DPI 96, 120, 144 и 192.

Высота ComboBoxEx определяется высотой элемента -1. Таким образом, элементы от 0 до count-1 являются фактическими элементами списка, а элемент -1 - это высота, используемая для редактора. Если вы установите эту высоту на 15, высота элемента управления будет исправлена ​​на 21 пиксель (см. Обновление выше для проблем с масштабированием) . Я думаю, что Мейсон может быть прав в том, что здесь играет роль размер шрифта (возможно, он меняет размер элемента), но вы можете заставить его работать нормально, настроив размер элемента.

Кажется, появляется новая (на мой взгляд, меньшая) проблема, заключающаяся в том, что при разрешении 96 точек на дюйм изображения высотой 16 пикселей теряют самую нижнюю строку при отображении в редакторе, но это едва ли заметно.

Итак. тогда исправление состоит в том, чтобы вызвать этот код:

GetTextMetrics(Canvas.Handle, TM);
SendMessage(Handle, CB_SETITEMHEIGHT, -1, 
  GetSystemMetrics(SM_CYBORDER) * 2 + TM.tmHeight);
6
ответ дан 14 December 2019 в 04:44
поделиться

Высота TComboBox не абсолютна; он привязан к высоте используемого вами шрифта. TComboBoxEx работает таким же образом, но, похоже, у него есть один дополнительный пиксель «накладных расходов», как вы заметили, и, похоже, нет простого способа изменить это. Если это оболочка для встроенного элемента управления Windows, возможно, нет способа изменить ее на уровне Delphi, точка.

1
ответ дан 14 December 2019 в 04:44
поделиться

Два способа изменить высоту TComboBoxEx, к сожалению, ни один из них, вероятно, не то, что вы хотите.

  • Уменьшите свойство font.size - поле уменьшится. (однако ваш текст меньше)

  • Установите StyleEx.csExNoSizeLimit: = false, затем установите высоту: = 21 по желанию. К сожалению, это просто приводит к тому, что ваша коробка обрезается, поэтому нижняя панель исчезает.

Я бы, вероятно, заменил все TComboBox на TComboBoxEx - GExperts имеет для этого великолепный мастер замены компонентов.

Это похоже на ошибку Delphi. Сообщали ли вы об этом через QC?

1
ответ дан 14 December 2019 в 04:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: