Могу ли я получить TComboBoxEx такой же высоты, как TComboBox? - PullRequest
5 голосов
/ 21 августа 2009

В Delphi все элементы управления TEdit и TComboBox имеют высоту 21 пиксель по умолчанию. В случае TComboBox этот размер является абсолютным, и попытка растянуть его до чего-то большего не работает. В случае TComboBoxEx высота по умолчанию составляет 22 пикселя, что немного выделяет его в любой форме, где вы его используете. Теперь, согласно документам Microsoft , ComboBoxEx - это, по сути, ComboBox с функциональностью, созданной владельцем, для обработки изображений и отступов.

Так можно ли сделать мои элементы управления TComboBoxEx высотой 21 пиксель? От чего это зависит?

Обновление: я добавил Quality Central отчет по этой проблеме, как предложил Родди. Также я нашел исправление. Видимо, размер зависит от размера элемента -1 в выпадающем списке. Таким образом, вы устанавливаете этот размер на 15 (или на один пиксель меньше, чем размер по умолчанию), и поле уменьшается до более привычных 21 пикселя.

Ответы [ 3 ]

6 голосов
/ 21 августа 2009

Я нашел исправление. 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 являются фактическими элементами списка, а item-1 - это высота, используемая для редактора. Если вы установите эту высоту равной 15, высота элемента управления будет исправлена ​​на 21 пиксель (проблемы с масштабированием см. В обновлении выше) . Я думаю, что Мейсон может быть прав, что размер шрифта играет здесь роль (возможно, изменяет размер элемента), но вы можете заставить его работать нормально, отрегулировав размер элемента.

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

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

GetTextMetrics(Canvas.Handle, TM);
SendMessage(Handle, CB_SETITEMHEIGHT, -1, 
  GetSystemMetrics(SM_CYBORDER) * 2 + TM.tmHeight);
1 голос
/ 21 августа 2009

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

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

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

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

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

1 голос
/ 21 августа 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...