部分代码如下:
String str = "Your request, asking to edit elements in your dfunentrFakeSessionCentralFakeSessionCentral FakeSessionCentralFakeSessionCentralFakeSessionCentralFakeSessionCentralFakeSessionCentralFakeSessionCentralFakeSessionCentralFakeSessionCentralFakeSessionCentralal.RVT, has been denied by huhenghuhenghuheng."SizeF strSizeF = new SizeF();
Graphics graphics = this.CreateGraphics();
Font useFont = new Font(/*MSG0*/"Arial", 9);
TextFormatFlags flags = TextFormatFlags.WordBreak;
方法1:
System.Drawing.Size strSize = TextRenderer.MeasureText(graphics, str, useFont, new Size(315, int.MaxValue), flags);
疑问:
此时返回的strSize.Height和实际高度是不相符合的(相差很大),而且strSize.Width(1244),这个值又是为什么,它的width应该小于我的315这个值啊!Y? 请高手指点一下,我try了很久,没有找到原因,也没弄明白其中奥秘.方法2:
int myWidth1 = 315;
int myWidth2 = 334;
strSizeF = graphics.MeasureString(str, useFont, myWidth1);
疑问:
此时返回的strSizeF.width(略小于我的315,合理),但是如果我用myWidth2去测量,而且将str换成别的字符串(不提供了,不同的DPI下效果不一样), 其中str1对应myWidth1,str2对应myWidth2,并且这两个字符串通过UI显示,其实都是在不同的label.width下正好显示两行,但是在某些情况下,计算出来的Height值不一样,一个是3行,一个是2行,这就导致了2行的用了3行空间,下面一个空行,很难看,请问有什么办法解决?

解决方案 »

  1.   

    public void MeasureStringSizeFFormatInts(PaintEventArgs e)
    {
    // Set up string.
    string measureString = "Measure String";
    Font stringFont = new Font("Arial", 16);
    // Set maximum layout size.
    SizeF layoutSize = new SizeF(100.0F, 200.0F);
    // Set string format.
    StringFormat newStringFormat = new StringFormat();
    newStringFormat.FormatFlags = StringFormatFlags.DirectionVertical;
    // Measure string.
    int charactersFitted;
    int linesFilled;
    SizeF stringSize = new SizeF();
    stringSize = e.Graphics.MeasureString(
    measureString,
    stringFont,
    layoutSize,
    newStringFormat,
    out charactersFitted,
    out linesFilled);
    // Draw rectangle representing size of string.
    e.Graphics.DrawRectangle(
    new Pen(Color.Red, 1),
    0.0F, 0.0F, stringSize.Width, stringSize.Height);
    // Draw string to screen.
    e.Graphics.DrawString(
    measureString,
    stringFont,
    Brushes.Black,
    new PointF(0, 0),
    newStringFormat);
    // Draw output parameters to screen.
    string outString = "chars " + charactersFitted + ", lines " + linesFilled;
    e.Graphics.DrawString(
    outString,
    stringFont,
    Brushes.Black,
    new PointF(100, 0));
    }
      

  2.   

    to fw629(),这个不行吧,不是我画出string,而是我要根据计算出来的高度,将这个高度赋给label,然后将label.Text = str;
      

  3.   

    既然可以计算出str的象素长度,就可以直接用:象素长度/label.width不就是多少行了吗?而且字体本身就可以得到字体的高度,lable.height不就出来了?
    伪代码:其中newStringFormat.FormatFlags = StringFormatFlags.DirectionVertical;换成newStringFormat.FormatFlags = StringFormatFlags.DirectionRightToLeft;就是str.width了label.height=(str.width/label.width)*font.height;
      

  4.   

    呵呵,不是那么简单的,首先要保证单词的完整性,既不能出现wor
    ld这种,第二,如果一个单词太长,超过一行,比如你一行是100个pixel,但是这一个单词占用120个pixel,举例
    "hello world,.............
    sjkfjaskjddksjadkdjaskfdjaskjfd
    dkjaskjdaskjdka", .....表示空格,
    但是剩余的空间不够显示"sjkfjaskjddksjadkdjaskfdjaskjfddkjaskjdaskjdka"(认为它是一个整单词),那么就会换行处理,显示不完全再换行继续显示.(这是当前vs自带控件的实现形势) 这个你可以做一个例子参照一下,现在自带的控件怎么实现的,用label,"Autosize"设置为false,给一个固定的宽,然后你计算出来的高赋给label.height,你看看能不能显示完全.别且没有多于的空行,please recheck. :)
      

  5.   

    TextFormatFlags flags = TextFormatFlags.WordBreak | TextFormatFlags.TextBoxControl;
    //                                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~加上测试看看