winForm的。
是这样的,有一字符串,长度、行数都不一定(如:字符串中包含有换行符),要在一控件中显示,但显示的宽度不能超过400像素,如超过则换行。并且,还要调整控件的大小,使字符串在这一控件中正好显示完,周围没有剩余空间,也没不足。
最好有代码。
谢谢啦!!!!!!!!!

解决方案 »

  1.   

    你需要的可能是使用TextRenderer.MeasureText 这个方法来测量出所给的字符串在给定的矩形范围内的实际显示区域。
      

  2.   

    只能用TextRenderer.MeasureText先判断,再进行处理了
      

  3.   

    我写了如下的代码,楼主可以试试看:运行下面的代码,在窗体上应有一个Button、Panel、RichTextBox三个控件并添加Button的Click事件处理代码如下:private void button1_Click(object sender, EventArgs e)
    {
    string str = this.richTextBox1.Text;
    Size size = TextRenderer.MeasureText(str, this.Font, Size.Empty, TextFormatFlags.Left | TextFormatFlags.WordBreak); if (size.Width > 400)
    {
    size = new Size(400, size.Width * size.Height / 400);
    }
    Rectangle rect = new Rectangle(0, 0, size.Width, size.Height); this.panel1.Size = new Size(size.Width + 1, size.Height + 1); using (Graphics g = this.panel1.CreateGraphics())
    {
    TextRenderer.DrawText(g, str, this.Font, rect, SystemColors.WindowText, TextFormatFlags.Left| TextFormatFlags.WordBreak);
    g.DrawRectangle(SystemPens.WindowText, rect);
    }
    }
      

  4.   

    不过使用TextRenderer并不能很好的处理自动换行的问题,楼主可以使用Graphics的DrawString来近似的达到这个效果。
      

  5.   

    可以Graphics.MeasureString和Graphics.DrawString配合使用MeasureString是测量字符串在特定字体下的Size
    DrawString是画字符串
      

  6.   

    private void SetSuitableFont(TextBox control)
            {
                if (g == null)
                {
                    return;
                }
                SizeF size = g.MeasureString(control.Text, control.Font);
                while (size.Width > control.Width)
                {
                    float fontSize = control.Font.Size - 0.25f;
                    if (fontSize <= 0)
                    {
                        break;
                    }
                    control.Font = new Font(control.Font.Name, fontSize);
                    size = g.MeasureString(control.Text, control.Font);
                }
            }
    这个是缩小字体直到TextBox能容下所有的文本的例子你可以先测量出一个字符(全角或者半角)的宽度,然后按照你所要的长度去截取相应的字符串,然后DrawString,然后换行,然后继续画
      

  7.   

    由于你的字符串中可能包含换行,所以你可以先Split,然后循环这个数组去画
    在画每个元素的时候,判断当前是否超过规定的宽度(具体办法就是先测量出一个字符的宽度,然后算长度),如果超过,则先DrawString一部分,剩下的换行在画,否则直接DrawString就可以了
      

  8.   

    限制显示区域的宽度方面
    --》
    就是先算出一个字符,可以是全角也可以是半角,比如你最多400像素,就用400除以得到的值,就是能画出的最多字符数,截取字符串的时候要考虑全角半角混合
    不能直接的SubString,而是应该根据Byte截取,并且要判断最后一位是全角还是半角,如果是半角没有问题,如果是全角就要舍去最后一个Byte,或者多取一个Byte
      

  9.   

    那你看一下这个代码,我没有更多的测试,楼主自己来检验结果吧,我简单的测试一下没有问题,代码如下,和上面的那个是不一样的,这个换行好使的:private void button1_Click(object sender, EventArgs e)
    {
    string str = this.richTextBox1.Text;
    using (Graphics g = this.panel1.CreateGraphics())
    {
    StringFormat format = new StringFormat( StringFormatFlags.DisplayFormatControl| StringFormatFlags.FitBlackBox| StringFormatFlags.LineLimit| StringFormatFlags.MeasureTrailingSpaces);
    Size size = g.MeasureString(str, this.Font,400, format).ToSize(); if (size.Width > 400)
    {
    size = new Size(400, size.Width * size.Height / 400);
    }
    Rectangle rect = new Rectangle(0, 0, size.Width, size.Height); this.panel1.Size = new Size(size.Width + 1, size.Height + 1);
    g.Clear(this.panel1.BackColor);
    g.DrawString(str, this.Font, SystemBrushes.WindowText, rect, format);
    g.DrawRectangle(SystemPens.WindowText, rect);
    }
    }
      

  10.   

    方法是好方法,可是太复杂了记得以前也遇到过类似的问题,后来用TextBox来实现了,把TextBox的背景颜色调整和周围颜色一样,是完全看不出,而且TextBox支持换行
    方便的说
      

  11.   

    hbxtlhx(平民百姓-自已动手,丰衣足食) ( 四星(高级)) 这位兄弟的方法不错,不过里面还是老是有问题,当你输入一行,第二行只输入几个字时,老是显示不了内容。
      

  12.   

    string str = textBox1.Text;
                Regex r = new Regex("(\r\n)"); // Split on hyphens.
                Size rowSize = new Size();
                int row = 0;
                string[] s = r.Split(str); 
                foreach (string lineString in s)
                {
                    if (lineString!="\r\n")
                    {
                        rowSize = TextRenderer.MeasureText(lineString, this.Font);
                        if (rowSize.Width > 400)
                        {
                            row += rowSize.Width / 400 + 1;
                        }
                        else
                        {
                            row++;
                        }
                    }
                }
                textBox2.Size = new Size(400, (row+1) * rowSize.Height);
                textBox2.Text = str;