首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何确定将在矩形中绘制的文本的高度?

如何确定将在矩形中绘制的文本的高度?
EN

Stack Overflow用户
提问于 2017-01-24 01:18:56
回答 1查看 2.8K关注 0票数 4

我试图在一个矩形w/ GDI+中绘制一些文本,就像微软文章:https://msdn.microsoft.com/en-us/library/baw6k39s(v=vs.110).aspx中描述的那样。

在推测出我想要的宽度后,文本会自动像预期的那样包装到下一行。问题是,我需要设置矩形的高度,以便文本完全符合框内,没有切断,但没有额外的空格。在这种情况下,使用值进行试测试和错误测试将根本不起作用,因为文本将发生变化。

我实现了一个解决方案,通过向其添加换行符,然后测量高度,来模拟呈现时发生的文本断裂。但这似乎不起作用,而且盒子的高度通常有大量的拖尾空白(这似乎与文本数量成正线性关系)。

问题:

我的代码如下所示:

代码语言:javascript
运行
复制
public void setBreakLen() { //determines how many chars fit on each line (note: using a FIXED WIDTH FONT) 
  double cwidth = TextRenderer.MeasureText("h", font).Width;
  breakLen = (int)((double)box.Width / (double)cwidth);
}



public void updateHeight() { //should tell me what the height of the box should be to fit perfectly
  StringBuilder sb = new StringBuilder(text);
  int numAppended = 0;
  for (int i = 0; i < text.Length; i++) {
      if ((i + 1) % breakLen == 0) {
          sb.Insert((i + 1 + numAppended), "\n");
          numAppended += 1;
       }
   }

   Size s = TextRenderer.MeasureText(sb.ToString(), font);
   height = s.Height;
   box = new Rectangle(x, y, width, height);
}

不过,这似乎是过火了,一定有更好的办法。因此,我想这其实是两个部分的问题。

  1. 如何才能使我目前的解决方案发挥作用?
  2. 有更好的方法吗?

注意:使用调试器,我已经确定breaklen变量是正确的。它读取11个字符,每一行有11个字符。

我还检查了其他字符与固定宽度字体(康索拉斯家族),他们都产生相同的中断长度。这是StringBuilder如何处理换行符的问题吗?我通常使用Java而不是C#,所以我不熟悉流之类的东西。

编辑:绘图代码如下:

代码语言:javascript
运行
复制
g2d.DrawString(m.text, m.font, Brushes.Blue, m.box);
g2d.DrawRectangle(Pens.Black, Rectangle.Round(m.box));

编辑2:我尝试使用MeasureText函数的重载Size参数实现这个次要解决方案。这仅仅是每次返回19,尽管字符串的长度,它似乎是返回正确的高度为单行。

代码语言:javascript
运行
复制
    Size s = TextRenderer.MeasureText(text, font, new Size(width, 0));//i also tried MaxInt
    height = s.Height;
    Console.WriteLine(height);
    box = new Rectangle(x, y, width, height);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-24 06:19:49

试试下面的代码。我只是在一个函数中输入代码以使其运行。你可以看到变化。您必须使用MeasureString而不是MeasureText。看到我得到的输出

代码语言:javascript
运行
复制
Font font = new Font(FontFamily.GenericSansSerif, 12.0F, FontStyle.Bold);

int x = 10, y = 10, width = 120, height = 30, breakLen = 0;
Rectangle box;
string text = "THIS BOX IS TOO TALL!!!";

private void DrawRectangle()
{
    box = new Rectangle(x, y, width, height);

    using (Graphics g = this.CreateGraphics())
    {
        double cwidth = g.MeasureString("h", SystemFonts.DefaultFont).Width;
        breakLen = (int)((double)box.Width / (double)cwidth);

        StringBuilder sb = new StringBuilder(text);
        int numAppended = 0;

        for (int i = 0; i < text.Length; i++)
        {
            if ((i + 1) % breakLen == 0)
            {
                sb.Insert((i + 1 + numAppended), "\n");
                numAppended += 1;
            }
        }

        Size s = TextRenderer.MeasureText(sb.ToString(), font);
        height = s.Height;
        box = new Rectangle(x, y, width, height);

        Pen pen = new Pen(Color.Black, 2);
        g.DrawString(sb.ToString(), font, Brushes.Blue, box);
        g.DrawRectangle(pen, box);
        pen.Dispose();
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41818496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档