根据控件的宽度决定要显示的字符串

本文关键字:显示 字符串 决定 控件 | 更新日期: 2023-09-27 18:01:58

我在SplitterPanel中有一个列表框。我已经重写了它的MeasureItem()和DrawItem()方法。

我想做的是,取决于Listbox。宽度,返回整个字符串或它的缩短版本,如"Dance toni…"。

我浏览了SO,发现了两个与我的问题有关的问题。其中一个问题是测量文本的宽度,这是我在DrawItem()中使用e.Graphics.MeasureString()。

Summary -我有一个列表框的宽度,和一个字符串的宽度,以像素为单位。如果字符串比列表框的宽度短,我想要完整地显示字符串。然而,如果它更长,我想返回一个版本,如"Hello每…",将适合在列表框的宽度内。

到目前为止,我有:

        private string FitText(string s)
    {
        int width = (TextRenderer.MeasureText(s, titleFont)).Width;
        if (width <= mailList.Width)
        {
            return s;
        }
        else if (width > mailList.Width)
        {
            // What goes here?
        }
    }

我敢肯定这只是简单的数学,但我还是算不出来。

根据控件的宽度决定要显示的字符串

我认为你需要检查它是否合适,如果是,返回整个字符串,否则修改你的代码运行一个循环,不断测量s减去一个字符和加上省略号的大小,直到它适合或直到没有更多的字符,然后返回,或者只是省略号,否则。

string EllipsisString = "..."; // you could also just set this as the unicode ellipsis char if that displays properly
private string FitText(string s)
{
    bool WidthFound = true;
    string TestString = s;
    string StringToReturn = s;
    int width = (TextRenderer.MeasureText(s, titleFont)).Width;
    if (width > mailList.Width)
    {
        WidthFound = false;
        for (int i=1; i < s.Length; ++i)
        {
           TestString = s.Substring(0, s.Length - i) + EllipsisString;
           width = (TextRenderer.MeasureText(TestString, titleFont)).Width;
           if (width <= mailList.Width)
           {
              StringToReturn = TestString;
              WidthFound = true;
              break;
           }
        }
    }
    if (WidthFound)
        return StringToReturn;
    else
        return EllipsisString;
}

[edit: too many to name]

下面是我要使用的伪代码…

1)以某种形式缩短字符串(删除最后一个字符/单词)
2)根据width
重新测试长度3)插入有效的重复,如果不是
4)如果字符串太短,使用一些默认形式

String s = "A long string that you're trying to fit into the button."
while (width > mailList.Width) {
   s = s.SubString(0,s.lastIndexOf(" ")-1); //Change this to whatever you'd want to shorten the string by
  width = (TextRenderer.MeasureText(s, titleFont)).Width; 
  if (width < 5) { //Some value indicating it's too short
    s = "Button...";
    break;
  }
}
return s;

http://msdn.microsoft.com/en-us/library/aa904308%28v=vs.71%29.aspx

    string ts = s;
    while((TextRenderer.MeasureText(ts, titleFont)).Width > mailList.Width + (TextRenderer.MeasureText("...", titleFont)).Width)
{
ts = ts.SubString(0,ts.Length-1);
}
return ts + "..."