Saltar al contenido

Salida de texto central de Graphics.DrawString()

Nuestro grupo redactor ha estado largas horas investigando la solución a tus búsquedas, te dejamos la respuestas y nuestro objetivo es servirte de mucha ayuda.

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 provistos:

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

Sin embargo, hay un problema con esto en CF. Si usa Center para ambos valores, entonces 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 perfectamente.

Lo único que cambiaría es mover la llamada FindBestFitFont() al evento OnResize() para que no lo llame cada vez que dibujo una letra. Solo necesita llamarse cuando cambia el tamaño del control. Acabo de incluirlo en la función para completar.

Aquí puedes ver las reseñas y valoraciones de los usuarios

Nos encantaría que puedieras recomendar este escrito si te ayudó.

¡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 *