简体   繁体   English

如何绘制形状的文字? C#

[英]How to draw a text in a shape? C#

The question is simple, assuming you have a shape (lets say a rectangle) and a text ("hello" for example), so it'll write the text all accross the borders of the rectangle for as many times as it fits, for example: 这个问题很简单,假设您有一个形状(比如说一个矩形)和一个文本(例如“ hello”),那么它将在整个矩形边界上书写尽可能多的文本,例如例:

hello hello hello hello

hello             hello

hello             hello

hello hello hello hello

In order to do it I assume you'd need to use a graphics variable, I just dont know how to do it. 为了做到这一点,我假设您需要使用图形变量,但我只是不知道该怎么做。

A code for drawing a string in a bitmap object: 在位图对象中绘制字符串的代码:

Bitmap tempp = new Bitmap(1, 1);
Graphics g = Graphics.FromImage(tempp);
SizeF w = g.MeasureString("22", new Font("Tahoma", 200));//in order to get the size of the string as a pixel measurement
Bitmap bmp = new Bitmap((int)w.Width+1, (int)w.Height+1);//the bitmap that will contain the text as a picture
RectangleF rectf = new RectangleF(0, 0, (int)w.Width+1, (int)w.Height+1);
g = Graphics.FromImage(bmp);
g.SmoothingMode = SmoothingMode.AntiAlias;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
StringFormat format = new StringFormat()
{
    Alignment = StringAlignment.Center,
    LineAlignment = StringAlignment.Center
};
g.DrawString("22", new Font("Tahoma", 200), Brushes.Black, rectf, format);
g.Flush();

Thanks in advance. 提前致谢。

For second comment: 对于第二条评论:

hello hello hello
hel           llo
hel           llo
hello hello hello

I hope this is what you need. 我希望这是您所需要的。 There isn't much to explain here. 这里没有太多要解释的。 The logic is pretty straightforward. 逻辑非常简单。

    public string MyString = "Hello"
    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        var g = e.Graphics;
        var strFont = new Font("Tahoma", 10);
        var strSizeF = g.MeasureString(MyString, strFont);

        var canvas = new Rectangle
        {
            Height = 200,
            Width = 200,
            Location = new Point(10, 10),
        };

        g.DrawRectangle(new Pen(new SolidBrush(Color.Blue)), canvas);

        var nx = (int)(canvas.Width / strSizeF.Width);
        var ny = (int)(canvas.Height / strSizeF.Height);
        var spacingX = (canvas.Width - nx * strSizeF.Width) / (nx-1);
        var spacingY = (canvas.Height - ny * strSizeF.Height) / (ny-1);

        //draw top row and bottom row
        int i;
        for (i = 0; i < nx; i++)
        {
            g.DrawString(
                MyString,
                strFont,
                Brushes.Black,
                new PointF(canvas.X + i*(strSizeF.Width + spacingX), canvas.Y)
                );
            g.DrawString(
                MyString,
                strFont,
                Brushes.Black,
                new PointF(canvas.X + i * (strSizeF.Width + spacingX), canvas.Y + canvas.Height - strSizeF.Height)
            );
        }

        //divide the string into half
        var isLengthOdd = MyString.Length % 2 != 0;
        var substr1 = MyString.Substring(0, MyString.Length / 2 + (isLengthOdd ? 1 : 0));
        var substr2 = MyString.Substring(MyString.Length / 2, MyString.Length - MyString.Length / 2);
        var substr2SizeF = g.MeasureString(substr2, strFont);
        //draw side rows
        for (i = 1; i < ny - 1; i++)
        {
            g.DrawString(
                substr1,
                strFont,
                Brushes.Black,
                new PointF(canvas.X, canvas.Y + i * (strSizeF.Height + spacingY))
            );
            g.DrawString(
                substr2,
                strFont,
                Brushes.Black,
                new PointF(canvas.X + canvas.Width - substr2SizeF.Width, canvas.Y + i * (strSizeF.Height + spacingY))
            );
        }

    }

Result: 结果:

结果

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM