Encontré una solución. Delphi parece tener un par de errores relacionados con esto:
- El valor de la propiedad publicada ItemHeight se ve obligado a ser de 16, porque la clase TComboBoxEx anula la función GetItemHt ser un hard-coded 16. Sin sentido alguno para el tamaño real del artículo - extraño, ya que esto funciona perfectamente en TComboBox. No sé por qué decidieron seguir con esta estrategia. Probablemente para garantizar que las imágenes siempre encajen.
- Delphi en realidad no llama al mensaje CB_SETITEMHEIGHT, por lo que incluso si invalida esta función, nada cambia.
Actualización:
Como ha señalado mghie, mi idea inicial de usar un valor no modificable de 15 en llamar el mensaje no funciona bien en diferentes configuraciones de DPI. Así que ahora estoy usando una llamada a GetTextMetrics para determinar la altura. Se agrega a la altura de la fuente el valor de GetSystemMetrics (SM_CYBORDER).
Esto se basa en la forma en que la VCL determina el tamaño de un TEdit.No creo que sea del todo correcto, pero dado que el objetivo es tener el ComboBoxEx del mismo tamaño que TEdit, probablemente sea lo más parecido posible. Y funciona en las configuraciones DPI de 96, 120, 144 y 192.
La altura del ComboBoxEx está determinada por la altura del elemento -1. Por lo tanto, los elementos 0 a contar-1 son los elementos de la lista real, pero el elemento -1 es la altura utilizada para el editor. Si establece esa altura en 15, la altura del control se corrige para que sea de 21 píxeles (consulte la actualización anterior para conocer los problemas de escala). Creo que Mason puede tener razón en que el tamaño de la fuente juega un papel aquí (probablemente cambie el tamaño del artículo), pero puedes hacerlo funcionar ajustando el tamaño del elemento.
Parece que presenta un nuevo problema (en mi opinión, más pequeño) ya que a 96 DPI las imágenes de 16 píxeles pierden la línea inferior cuando se muestran en la parte del editor, pero eso apenas se nota.
Así que la solución entonces, es llamar a este código:
GetTextMetrics(Canvas.Handle, TM);
SendMessage(Handle, CB_SETITEMHEIGHT, -1,
GetSystemMetrics(SM_CYBORDER) * 2 + TM.tmHeight);
Wow - solución ordenada! Sugiero que lo agregue como la "respuesta aceptada" a su propia pregunta. Bien vale la pena un voto popular! – Roddy
Agregué la respuesta, pero solo puedo aceptarla en uno o dos días. También hay una advertencia que involucra la visualización de la imagen; consulte mi respuesta a continuación. –