Saltar al contenido

Centrar la salida de texto de Graphics.DrawString ()

Solución:

Me gustaría agregar otro voto para el objeto StringFormat. Puede usar esto simplemente para especificar “centro, centro” y el texto se dibujará centralmente en el rectángulo o los puntos proporcionados:

StringFormat format = new StringFormat();
format.LineAlignment = StringAlignment.Center;
format.Alignment = StringAlignment.Center;

Sin embargo, hay un problema con esto en CF. Si usa Centro para ambos valores, desactiva TextWrapping. No tengo idea de por qué sucede esto, parece ser un error con el CF.

Para alinear un texto, utilice lo siguiente:

StringFormat sf = new StringFormat();
sf.LineAlignment = StringAlignment.Center;
sf.Alignment = StringAlignment.Center;
e.Graphics.DrawString("My String", this.Font, Brushes.Black, ClientRectangle, sf);

Tenga en cuenta que el texto aquí está alineado en los límites dados. En este ejemplo, este es ClientRectangle.

A través de una combinación de las sugerencias que recibí, se me ocurrió esto:

    private void DrawLetter()
    {
        Graphics g = this.CreateGraphics();

        float width = ((float)this.ClientRectangle.Width);
        float height = ((float)this.ClientRectangle.Width);

        float emSize = height;

        Font font = new Font(FontFamily.GenericSansSerif, emSize, FontStyle.Regular);

        font = FindBestFitFont(g, letter.ToString(), font, this.ClientRectangle.Size);

        SizeF size = g.MeasureString(letter.ToString(), font);
        g.DrawString(letter, font, new SolidBrush(Color.Black), (width-size.Width)/2, 0);

    }

    private Font FindBestFitFont(Graphics g, String text, Font font, Size proposedSize)
    {
        // Compute actual size, shrink if needed
        while (true)
        {
            SizeF size = g.MeasureString(text, font);

            // It fits, back out
            if (size.Height <= proposedSize.Height &&
                 size.Width <= proposedSize.Width) { return font; }

            // Try a smaller font (90% of old size)
            Font oldFont = font;
            font = new Font(font.Name, (float)(font.Size * .9), font.Style);
            oldFont.Dispose();
        }
    }

Hasta ahora, esto funciona a la perfección.

Lo único que cambiaría es mover la llamada FindBestFitFont () al evento OnResize () para que no lo llame cada vez que dibuje una letra. Solo es necesario llamarlo cuando cambia el tamaño del control. Simplemente lo incluí en la función para completarlo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *