在winforms应用程序中绘制以椭圆/圆圈为中心的文本

时间:2017-02-20 18:35:19

标签: c# graphics

也许是一个简单的问题,但我怎样才能画出以椭圆为中心的文字。 我知道我可以使用束带,但我不知道如何将它与Ellipse结合使用

我能找到的唯一方法是在一个回转中,但我需要将它放在一个圆/椭圆中。

我很快就会拥有这个,但它不会像我一样。

public void Draw(Graphics g)
{
    g.DrawString(naam, font, brush, xypos);
    g.DrawEllipse(blackPen, xpos, ypos, 100, 100);
}

这是我已经尝试过但不起作用的东西

1 个答案:

答案 0 :(得分:0)

最近我一直在一个电子邮件客户端中工作,我想在其中显示一个“发件人”的名字,这就是我得到的:

enter image description here

为此,我遇到了一些问题:

  • 在PictureBox中绘制圆。
  • 获得带有抗锯齿边缘的绘制圆。
  • 在内部绘制文本
  • 将整个图像作为图像返回,以避免闪烁。

这是我的解决方案:(评论用西班牙语,对此感到抱歉)

    /// <summary>Dibuja un Circulo de Color con Texto Centrado que puede usarse como 'Logo' del Usuario.</summary>
    /// <param name="PicSize">Tamaño (pixeles) de la Imagen a Retornar</param>
    /// <param name="Brush">Color y Estilo del Circulo</param>
    /// <param name="Texto">Texto a escribir dentro del Circulo</param>
    /// <param name="Fuente">Fuente del Texto</param>
    /// <param name="BackColor">Color del Fondo y del Texto</param>
    /// <returns>Devuelve una Imagen con todos los elementos dibujados dentro.</returns>
    public static System.Drawing.Image DrawUserCircle(System.Drawing.Size PicSize, System.Drawing.Brush Brush, string Texto, System.Drawing.Font Fuente, System.Drawing.Color BackColor)
    {
        //Imagen Virtual sobre la que se dibuja y se retorna al final:
        System.Drawing.Image Canvas = new System.Drawing.Bitmap(PicSize.Width, PicSize.Height);
        System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(Canvas);

        //Tamaño del Circulo (rect):
        System.Drawing.Rectangle outerRect = new System.Drawing.Rectangle(-1, -1, Canvas.Width + 1, Canvas.Height + 1);
        System.Drawing.Rectangle rect = System.Drawing.Rectangle.Inflate(outerRect, -2, -2);

        //Todas las opciones en Alta Calidad:
        g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear;
        g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
        g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
        g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

        using (System.Drawing.Drawing2D.GraphicsPath path = new System.Drawing.Drawing2D.GraphicsPath())
        {
            //Fondo del Picture:
            g.FillRectangle(new System.Drawing.SolidBrush(BackColor),
                new System.Drawing.RectangleF(0, 0, PicSize.Width, PicSize.Height));

            //Dibuja el Circulo:
            path.AddEllipse(rect);
            g.FillPath(Brush, path);

            System.Drawing.SizeF stringSize = g.MeasureString(Texto, Fuente); //<- Obtiene el tamaño del Texto en pixeles                                                                                 
            int posX = Convert.ToInt32((PicSize.Width - stringSize.Width) / 2); //<- Calcula la posicion para centrar el Texto
            int posY = Convert.ToInt32((PicSize.Height - stringSize.Height) / 2);

            // Dibuja el Texto:
            g.DrawString(Texto, Fuente, new System.Drawing.SolidBrush(BackColor), new System.Drawing.Point(posX, posY));
        }
        return Canvas;
    }

用法:

 System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(
                this.picUser.ClientRectangle, System.Drawing.Color.LightSkyBlue, System.Drawing.Color.DeepSkyBlue, 70);

using (System.Drawing.Font myFont = new System.Drawing.Font("Arial", 28, System.Drawing.FontStyle.Bold))
                this.picUser.Image = DrawUserCircle(new System.Drawing.Size(64, 64), brush, "JC", myFont, System.Drawing.Color.White);

现在关于您如何绘制以圆圈为中心的文字的问题:

  1. 使用Graphics对象中的“ MeasureString”方法测量文本大小。
  2. 从“圆圈大小”中减去“文字大小”,然后将其除以2,这样您就可以在其上绘制以文字为中心的位置。

以上方法中完成的所有操作,希望对您有所帮助。 问候。