2009-08-21 21 views
5

En Delphi, todos los controles TEdit y TComboBox tienen 21 píxeles de alto de forma predeterminada. En el caso de TComboBox, este tamaño es absoluto e intentar estirarlo a algo más grande no funciona. Sin embargo, en el caso de TComboBoxEx, la altura predeterminada es 22 píxeles, lo que hace que se destaque un poco en cualquier forma donde lo use. Ahora, de acuerdo con el Microsoft docs, ComboBoxEx es esencialmente un ComboBox con funciones manejadas por el propietario que se manejan para permitir imágenes e indentaciones.¿Puedo hacer que TComboBoxEx tenga la misma altura que TComboBox?

Entonces, ¿es posible hacer que mis controles TComboBoxEx tengan 21 píxeles de alto? ¿De qué depende esto?

Actualización: Agregué un Quality Central report sobre el problema, como lo sugirió Roddy. Además, encontré una solución. Aparentemente, el tamaño depende del tamaño del elemento -1 en el cuadro combinado. Así que establece ese tamaño en 15 (o un píxel menos que el tamaño predeterminado) y el cuadro se reduce a los 21 píxeles más familiares.

+0

Wow - solución ordenada! Sugiero que lo agregue como la "respuesta aceptada" a su propia pregunta. Bien vale la pena un voto popular! – Roddy

+0

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. –

Respuesta

6

Encontré una solución. Delphi parece tener un par de errores relacionados con esto:

  1. 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.
  2. 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); 
+0

Un TEdit en mi computadora portátil con una configuración de DPI de 124 ciertamente no tiene 21 píxeles de alto. Las alturas rígidas son simplemente incorrectas, ya sea que funcionen para usted o no, y regresar 15 no es mucho mejor que regresar 16. ¿Qué hay de las diferentes fuentes o configuraciones de DPI? Una solución real implicaría obtener la altura de la fuente y calcular la altura del artículo en función de eso. – mghie

+0

-1 para constantes codificadas como mghie explicó –

+0

Punto tomado sobre la configuración de DPI. Entonces ahora necesito saber cómo se calcula la altura de un cuadro de edición. Analicé el cálculo de la altura del artículo en función de la altura de la fuente, pero no veo cómo eso los llevó a 16 en primer lugar: en realidad creo que fue elegido, por lo que caben 16x16 glifos. Lo que parece funcionar tanto en 96 DPI como en 120, es llamar a GetTextMetric y usar tmHeight + 2. Pensé que usar tmHeight + tmInternalLeading sería correcto, pero eso solo funciona a 120 DPI. Podría comenzar en 15 y escalar eso de 96 a 120, pero eso tampoco parece correcto. ¿Alguna idea? –

1

La altura de un TComboBox no es absoluta; está vinculado a la altura de la fuente que usa. TComboBoxEx funciona de la misma manera, pero parece tener un píxel extra de "sobrecarga", como habrás notado, y no parece haber una forma sencilla de cambiar eso. Si se trata de un contenedor para un control integrado de Windows, es posible que no haya forma de cambiarlo en el nivel Delphi, punto.

+0

A menos que quiera crear su propia versión, pero no creo que sea una opción válida ;-). –

1

Dos maneras de cambiar la altura de TComboBoxEx, por desgracia, probablemente tampoco sea lo que usted quiere.

  • Establezca la propiedad font.size más pequeña - la caja se reducirá. (sin embargo, su texto es más pequeño)

  • Establezca StyleEx.csExNoSizeLimit: = false, luego configure Height: = 21 según lo desee. Desafortunadamente, esto solo hace que su caja sea recortada, por lo que el bisel inferior desaparece.

probablemente me sustituir todos TComboBoxes con TComboBoxEx - GExperts tiene un brillante '' sustituir los componentes asistente para hacer esto.

Esto parece un error Delphi. ¿Lo ha informado a través de QC?

+0

Se agregó el informe de control de calidad. Enlace agregado a la pregunta. –

Cuestiones relacionadas