Я нашел исправление. Delphi, кажется, есть несколько ошибок, связанных с этим:
- Значение опубликованного ItemHeight собственности вынужден быть 16, потому что класс TComboBoxEx отменяет функцию GetItemHt не быть жестко закодированы 16. не обращая внимания вообще для фактического размера элемента - странно, поскольку это отлично работает на TComboBox. Я не знаю, почему они решили пойти с этой стратегией. Вероятно, чтобы изображения всегда соответствовали друг другу.
- Delphi фактически не вызывает сообщение CB_SETITEMHEIGHT, поэтому даже если вы переопределите эту функцию, ничего не изменится.
Update:
Как отметил 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 пиксель (см. Выше приведенное выше для масштабирования проблем). Я думаю, что Мейсон может быть прав, что размер шрифта здесь играет роль (вероятно, изменяет размер элемента), но вы можете сделать его очень просто, регулируя размер элемента.
Как представляется, новая проблема (на мой взгляд, меньше) заключается в том, что на 96-пиксельных 16-пиксельных изображениях снижается самая нижняя строка, когда отображается в части редактора, но это едва заметно.
Так исправить то, чтобы назвать этот код:
GetTextMetrics(Canvas.Handle, TM);
SendMessage(Handle, CB_SETITEMHEIGHT, -1,
GetSystemMetrics(SM_CYBORDER) * 2 + TM.tmHeight);
Wow - аккуратный исправить! Я предлагаю вам добавить его как «принятый ответ» на свой вопрос. Хорошо стоит upvote! – Roddy
Добавлен ответ, но я могу принять его только через день или два. Существует также предостережение, которое включает отображение изображения - см. Мой ответ ниже. –