Calcular el ancho / alto necesitado por un texto
Publicado por miguell (153 intervenciones) el 30/10/2009 12:01:36
Nunca os ha pasado que teneís que redimensianar o saber el ancho de una columna y no se puede saber al usar fuentes TrueType ??
El problema con fuentes TrueType es que 10 'i' no ocupa lo mismo que 10 'W', 50 espacios en blanco no ocupan el doble que 25 espacios en blanco, etc.
Pues sí es posible calcular el ancho de un texto determinado: existe la API gettextextentpoint32a.
- Si tu solución del problemea es tan sencillo como NO usar truetype, sino una fuente proporcional como courier (new) y contar simplemente cuantos carácteres caben en un texto entonces está se suerte. Si no puedes porque no te dejan, entonces sigue leyendo.
No me lo he inventado yo: llevo diciendo 15 años a los clientes que es una movida que les va a costar mucho tiempo (sólo sabía que en Linux existe algo como el "Latex" para hacer algo parecido y con esto me permitían usar fuentes proporcionales). Está hecho por lo grandes currantes que hay por allí.
descargar la siguiente mini-aplicacion :
http://downloads.sybase.com/codexchange/powerbuilder/249/columnwidthchecker.zip
Es la solución más bonita y más laboriosa: usar la función API "GetTextExtentPoint32A" con la que puedes calcular el ancho (alto?) 'deseado' de un texto, pasando la fuente, tamaño fuente, etc.
El columnWidthChecker lo bajé de Sybase. No tengo muy claro si la función externa gettextextentpoint32a realmente necesita el alias for "GetTextExtentPoint32A;Ansi" ya que al migrar a la versión 10, powerbuilder decidió de añadirla. Por lo que veo en ejemplos no están llamando al alias sino a la función sin 'A' al final.
Sería cuestión de probarlo supongo.
(otro ejemplo del uso):
http://pbdj.sys-con.com/node/42449 la definen tal cual sin el alias+A. pero no sé con qué versión de powerbuilder están.
"Ellos" (en la función of_getcolumnWidth( ) ), pasan una cadena relleno de 'W' a la API, pero porque sólo están verificando la máxmima longitud de una columna y contrastandola contra el ancho actual de una columna (basándose en el datawindow, sin estar relleno ningún dato). Tú si sabes cuantos y cuales carácteres tienes (no sólo 'w') y entonces puedes calcular el ancho exacto. Mientras que el ancho sigue por debajo del ancho máximo del que dispones, vas pasando más carácteres.
Parece ser importante que uses PBUnits en tus datawindows para que el calculo sea correcto.
he encontrado otro sitio donde calculan el ancho para mostrar unos tooltips mediante esa función.
Además me ha parecido ver que puede ser necesario hacer algún ajusto por lenguas distintas (al inglés claro).
http://pbdj.sys-con.com/node/42126
y
http://pbsite.milente.nl/pbtip009.html (con zip para bajarte).
y
http://rikbrooks.sys-con.com/node/42151/mobile
Miguel
El problema con fuentes TrueType es que 10 'i' no ocupa lo mismo que 10 'W', 50 espacios en blanco no ocupan el doble que 25 espacios en blanco, etc.
Pues sí es posible calcular el ancho de un texto determinado: existe la API gettextextentpoint32a.
- Si tu solución del problemea es tan sencillo como NO usar truetype, sino una fuente proporcional como courier (new) y contar simplemente cuantos carácteres caben en un texto entonces está se suerte. Si no puedes porque no te dejan, entonces sigue leyendo.
No me lo he inventado yo: llevo diciendo 15 años a los clientes que es una movida que les va a costar mucho tiempo (sólo sabía que en Linux existe algo como el "Latex" para hacer algo parecido y con esto me permitían usar fuentes proporcionales). Está hecho por lo grandes currantes que hay por allí.
descargar la siguiente mini-aplicacion :
http://downloads.sybase.com/codexchange/powerbuilder/249/columnwidthchecker.zip
Es la solución más bonita y más laboriosa: usar la función API "GetTextExtentPoint32A" con la que puedes calcular el ancho (alto?) 'deseado' de un texto, pasando la fuente, tamaño fuente, etc.
El columnWidthChecker lo bajé de Sybase. No tengo muy claro si la función externa gettextextentpoint32a realmente necesita el alias for "GetTextExtentPoint32A;Ansi" ya que al migrar a la versión 10, powerbuilder decidió de añadirla. Por lo que veo en ejemplos no están llamando al alias sino a la función sin 'A' al final.
Sería cuestión de probarlo supongo.
(otro ejemplo del uso):
http://pbdj.sys-con.com/node/42449 la definen tal cual sin el alias+A. pero no sé con qué versión de powerbuilder están.
"Ellos" (en la función of_getcolumnWidth( ) ), pasan una cadena relleno de 'W' a la API, pero porque sólo están verificando la máxmima longitud de una columna y contrastandola contra el ancho actual de una columna (basándose en el datawindow, sin estar relleno ningún dato). Tú si sabes cuantos y cuales carácteres tienes (no sólo 'w') y entonces puedes calcular el ancho exacto. Mientras que el ancho sigue por debajo del ancho máximo del que dispones, vas pasando más carácteres.
Parece ser importante que uses PBUnits en tus datawindows para que el calculo sea correcto.
he encontrado otro sitio donde calculan el ancho para mostrar unos tooltips mediante esa función.
Además me ha parecido ver que puede ser necesario hacer algún ajusto por lenguas distintas (al inglés claro).
http://pbdj.sys-con.com/node/42126
y
http://pbsite.milente.nl/pbtip009.html (con zip para bajarte).
y
http://rikbrooks.sys-con.com/node/42151/mobile
Miguel
Valora esta pregunta
0