Este es el primero, de una serie de dos escritos, en los que Cesar Chalom aborda la problemática de la creación de textos totalmente justificados con GdiPlus-X.
Dar justificación completa a textos con GdiPlus-X
Artículo original: Full- Justified Text with GdiPlus-X
http://weblogs.foxite.com/cesarchalom/archive/2007/03/30/3580.aspx
Autor: Cesar Chalom (http://weblogs.foxite.com/cesarchalom)
Traducido por: Ana María Bisbé York (amby@telefonica.net)
Para: PortalFox (http://www.portalfox.com)
De acuerdo con Wikipedia, "La justificación (puede referirse también como "justificación total") es la alineación tipográfica de la configuración de textos o imágenes dentro de una columna o "medida" para alinear a lo largo de margen izquierdo y derecho. La configuración del texto de esta forma es lo que se llama "estar justificado".
En texto justificado, los espacios entre palabras, y en menor grado, entre símbolo o letra (espaciado), se estrechan o a veces se comprimen para alinear el texto a ambos márgenes: derecho e izquierdo. Al utilizar la justificación, se intenta que la última línea del párrafo se alinee a la izquierda o derecha, en dependencia de la dirección del lenguaje. Las líneas en la que los espacios son menos que su ancho normal se llaman líneas perdidas, las líneas en las que los espacios se comprimen se llaman apretadas.
Para crear textos completamente justificados, el punto principal es conocer exactamente la medida de cada palabra y ser capaz de dibujar cada palabra exactamente en una determinada posición. Desafortunadamente, VFP no brinda esas posibilidades de forma nativa. Sí, es cierto que sabemos que tenemos TXTWIDTH y FONTMETRIC(6); pero no es muy preciso. Una buena solución, aunque no es bonita, es utilizar fuentes con monoespaciado, como Courier New o Lucinda Console, donde cada carácter tiene las mismas medidas.
Entonces, si queremos utilizar cualquier tipo de letra, una de las pocas opciones era utilizar el control ActiveX RTF, o utilizar un objeto OLE Word en un formulario VFP.
Con la biblioteca GdiPlus-X, a partir de ahora podrá también dar justificación completa a sus textos en una forma muy sencilla.
GDI+ originalmente permite dibujar textos en tres alineaciones posibles: Izquierda, Centrada y Derecha. En los últimos días he notado que un pedido muy frecuente de los desarrolladores VFP es la capacidad de crear textos completamente justificados.

Para dibujar textos completamente justificados necesitamos tener medidas exactas de cada palabra en el párrafo, y pintar cada palabra individualmente en una posición calculada. Bueno, no es necesario decir que GDI+ brinda las herramientas necesarias para la tarea. Entonces, añadimos un nuevo método a la clase Graphics de la librería Gdiplus-X, DrawStringJustified.
Puede que encuentre natural la selección que va a añadir una nueva cadena de alineación para justificar, y permita al método "DragString" ocuparse del texto y recibir los parámetros y dibujar. Pero creemos que la librería original GdiPlus.dll va a recibir las actualizaciones en el futuro, y MS puede incluir posiblemente un "StringFormat.Alignment" para nuestro caso. Entonces, encontramos que la mejor solución será crear un método nuevo, con nombre diferente. El uso es similar al "DragString" original:
Método: DrawStringJustified(tcString, toFont as xfcFont, toBrush as xfcBrush, toRectangle as xfcRectangle)
PARÁMETROS
tcString Carácter, Cadena a dibujar
toFont Objeto, Fuente que define el formato de texto de la cadena.
toBrush Objeto, Brocha que determina el color y la textura del texto dibujado.
toRectangle Objeto, Estructura de rectángulo que especifica la localización del texto dibujado.
CÓMO TRABAJA
Básicamente, DrawStringJustified recibe los 4 parámetros mencionados, muy similar a DragString. Pero, en lugar de dibujar todo el texto de una vez, esta función necesita hacer algunos cálculos para conocer exactamente cada palabra de la cadena que será dibujada. Comienza llenando una matriz de palabras y las medidas calculadas de cada palabra, usando GdipMeasureString. Luego, calcula cuántas palabras caben en cada línea. El siguiente paso es calcular el espacio resultante entre las palabras de la línea relacionada. Luego de coleccionar toda la información necesaria, dibujamos cada palabra, en la posición calculada.
Para mejor rendimiento, utilizamos llamadas directas a API para gdiplus.dll del proceso principal, midiendo y dibujando cada cadena. Hice algunas pruebas, y la diferencia es grande, unas 5 veces más rápida.
MUY IMPORTANTE - LEA ESTO
Todos los ejemplos a continuación necesita que tenga la versión PLANNED RELEASE, 0.08A. Está un tanto oculta en CodePlex, así es que dejo el enlace para descargarlo directamente:
http://www.codeplex.com/VFPX/Release/ProjectReleases.aspx?ReleaseId=1711
TIEMPO DE JUGAR
1 - Dibujar texto completamente justificado en archivos de imagen
El siguiente programa muestra cómo dibujar un texto en 4 formas: izquierdo, centrado, derecho y completamente justificado, como muestra la imagen anterior y guarda la imagen en un archivo.
** Programa: FullJustCode.prg
** Programa de ejemplo que dibuja los textos en 4 modos:
** 1 - Alineado a la Izquierda
** 2 - Centrado
** 3 - Alineado a la derecha
** 4 - Completamente justificado
* El código realiza las siguientes acciones:
* Crea una cadena (String)
* Dibuja el texto en 4 modos y muestra el resultado
* Localizar y cargar GdiPlus-X
_SCREEN.AddProperty("System", NEWOBJECT("xfcSystem", LOCFILE("system.vcx","vcx")))
LOCAL lcText as Character
TEXT TO lcText NOSHOW
GDIPlusX es un conjunto de librerías de clase de VFP 9.0 que envuelve las
funciones API 603 GDI+ Flat de GDIPlus.dll.
La librería actualmente consiste en 83 clases VFP y 1,146 métodos. El proyecto
está en desarrollo, por tanto no todas las clases han sido completadas y algunas
de las clases/métodos deben ser aun verificadas.
ENDTEXT
WITH _Screen.System.Drawing
* Crear la imagen
LOCAL loBmp as xfcBitmap
loBmp = .Bitmap.New(400,600)
* Crear un objeto Graphics que sea capaz de dibujar una imagen
LOCAL loGfx as xfcGraphics
loGfx = .Graphics.FromImage(loBmp)
* Rellenar la imagen con color de fondo Blanco (White Background)
loGfx.Clear(.Color.White)
* Crear una brocha de color azul oscuro (DarkBlue Brush)
LOCAL loTextBrush AS xfcSolidBrush
loTextBrush = .SolidBrush.New(.Color.DarkBlue)
* Crear un objeto Font
LOCAL loFont AS xfcFont
loFont = .Font.New("Tahoma", 11, .FontStyle.Regular)
* Crear un objeto StringFormat
LOCAL loStringFormat as xfcStringFormat
loStringFormat = .StringFormat.New()
LOCAL lnHeight, lnWidth
lnWidth = 400
lnHeight = 150
* Dibujar un texto alineado a la Izquierda
loStringFormat.Alignment = .StringAlignment.Near
loGfx.DrawString(lcText, loFont, loTextBrush, ;
.Rectangle.New(0, 0, lnWidth, lnHeight), ;
loStringFormat)
* Dibujar un texto Centrado
loStringFormat.Alignment = .StringAlignment.Center
loGfx.DrawString(lcText, loFont, loTextBrush, ;
.Rectangle.New(0, lnHeight + 1, lnWidth, lnHeight), ;
loStringFormat)
* Dibujar un texto alineado a la Derecha
loStringFormat.Alignment = .StringAlignment.Far
loGfx.DrawString(lcText, loFont, loTextBrush, ;
.Rectangle.New(0, lnHeight * 2 + 1, lnWidth, lnHeight), ;
loStringFormat)
* Dibujar un texto completamente justificado
loGfx.DrawStringJustified(lcText, loFont, loTextBrush, ;
.Rectangle.New(0, lnHeight * 3 + 1, lnWidth, lnHeight))
* Dibujar un borde Rojo
loGfx.DrawRectangle(.Pen.New(.Color.Red,1), 0, 0, 399, 599)
* Guardar la imagen en disco
loBmp.Save("c:\TestAlignment.png", .Imaging.ImageFormat.Png)
* Mostrar el texto generado
RUN /n explorer.exe c:\TestAlignment.png
ENDWITH
RETURN
2 - Dibujar cadenas completamente justificadas en Formularios
La forma más fácil de dibujar una cadena justificada en un formulario es utilizar el objeto ImageCanvas. A continuación está el código que necesita agregar al método "BeforeDraw" de ImgCanvas. En mi escrito anterior "Direct Draw with the Image Canvas from GdiPlus-X" http://weblogs.foxite.com/vfpimaging//archive/2007/03/20/3535.aspx tiene una guía que muestra cómo trabaja y algunos consejos.
LOCAL lcText as Character
TEXT TO lcText NOSHOW
GDIPlusX es un conjunto de librerías de clase de VFP 9.0 que envuelve las
funciones API 603 GDI+ Flat de GDIPlus.dll.
La librería actualmente consiste en 83 clases VFP y 1,146 métodos. El proyecto
está en desarrollo, por tanto no todas las clases han sido completadas y algunas
de las clases/métodos deben ser aun verificadas. El archivo Readme.htm, incluido
en la descarga, muestra el estado actual del código de cada clase. Desde el 31
de Agosto de 2006, el estado general de la biblioteca es aproximadamente de 97%
de código escrito y 60% de código probado.
ENDTEXT
WITH _Screen.System.Drawing
* Rellenar la imagen con el color de fondo (Background)
This.oGfx.Clear(.Color.White)
* Dibujar el texto completamente justificado
This.oGfx.DrawStringJustified(lcText, .Font.New("Tahoma", 12), ;
.Brushes.Black, This.Rectangle)
ENDWITH
En la carpeta Samples de la librería de clases GdiPlus-X encontrará el formulario "FULLJUSTIFIED.SCX". No deje de ejecutarlo, y juegue, cambiando los tipos de fuente, tamaño, estilos y tipo de alineación. Pero, en mi opinión, el aspecto más interesante de este ejemplo es que usted puede redimensionar el formulario, y toda la imagen se va a re-dibujar en un flash ! Haciendo esto usted verá lo rápido que trabaja esta rutina.

3 - Dibujar cadenas justificadas en informes.
Ha sido muy fácil también, luego de la creación de un report listener específico ... pero prefiero dejarlo para mi siguiente escrito.

Puede que esté interesado en el método DRAWSTRINGJUSTIFIED. Para ver el código, abra la clase xfcGraphics en el archivo Drawing.vcx. Vea el método "DrawStringJustified "
Este método aún no está muy probado, así que si encuentra algún error, o alguna sugerencia para mejorar su productividad, o cualquier otra cosa, por favor, ¡ díganoslo !
¡ Espero que lo disfrute !

|