Используя EM масштабирование более универсально со шрифтами. Это также более доступно.
, Если Вы не работали с этим прежде, инструмент как , Калькулятор Эма может быть очень полезен для понимания, как тег/модель работает.
Я нашел исправление. В Delphi есть несколько ошибок, связанных с этим:
Обновление:
Как указано 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);
Высота TComboBox не абсолютна; он привязан к высоте используемого вами шрифта. TComboBoxEx работает таким же образом, но, похоже, у него есть один дополнительный пиксель «накладных расходов», как вы заметили, и, похоже, нет простого способа изменить это. Если это оболочка для встроенного элемента управления Windows, возможно, нет способа изменить ее на уровне Delphi, точка.
Два способа изменить высоту TComboBoxEx, к сожалению, ни один из них, вероятно, не то, что вы хотите.
Уменьшите свойство font.size - поле уменьшится. (однако ваш текст меньше)
Установите StyleEx.csExNoSizeLimit: = false, затем установите высоту: = 21 по желанию. К сожалению, это просто приводит к тому, что ваша коробка обрезается, поэтому нижняя панель исчезает.
Я бы, вероятно, заменил все TComboBox на TComboBoxEx - GExperts имеет для этого великолепный мастер замены компонентов.
Это похоже на ошибку Delphi. Сообщали ли вы об этом через QC?