2017-04-16 39 views
0

这个问题很简单,假设你有一个形状(可以说是一个矩形)和一个文本(例如“hello”),所以它会将文本全部写入矩形的边界,适合,例如:如何在形状中绘制文字? C#

hello hello hello hello 

hello    hello 

hello    hello 

hello hello hello hello 

为了做到这一点我假设你需要使用图形变量,我只是不知道该怎么做。

一种用于在一个位图对象绘制的字符串的代码:

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(); 

预先感谢。

对于第二点意见:

hello hello hello 
hel   llo 
hel   llo 
hello hello hello 
+1

一旦你有一个字符串,图像的大小,计算最终的矩形的总规模,并把几个字符串映像副本,那么,每一个副本在其自己的坐标。也许[这个链接](http://stackoverflow.com/questions/1478022/c-sharp-get-a-controls-position-on-a-form)可以帮助你。 –

+0

矩形的大小如何?如果连续有四个“你好”太大,而五个太小则太大。你是否调整矩形的大小?或者你调整文本之间的间距? – Anthony

+0

@Anthony像这样做:我会编辑线程,因为我不能在这里显示代码。 –

回答

1

我希望这是你所需要的。这里没有太多解释。逻辑非常简单。

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

+0

嗨,对不起,延迟延迟,仍然在你的答案,它给了我一些不错的方向,并帮助了解了很多,所以谢谢你的答案:)。 –

+1

我已经探索了你的答案,它并不是真正准确的,我想要做什么,但它告诉我如何使用图形的方式。 感谢你的回答,我得到了我想要得到的东西,因此我已经接受了你的答案。 –

+0

@matanjustme我很欣赏这一点。如果你愿意,你可以回答自己的问题并接受它。这将帮助其他人找到你的问题和答案有用。 :) – Anthony