Wince下的TextBox控件只能显示一行,多的就不能显示全了,要实现多行显示就得自定义控件,将要显示的字符串使用GDI+绘制到控件的工作区中。但是.Net CF中Graphics的DrawString方法并不像.Net FrameWork一样能够自动换行,所以需要自己写换行方法。
在写这个方法之前要考虑解决如下几个问题:
1. 要兼容换行与不换行两种情况
2. 不同语言的文字换行规则不一样:中文的可以在任意两个字符中间断开换行;英文却不能再一个单词中间分开
3. 同样的显示区,不同字体能显示下的内容是不同的
下面是一个分两行显示的方法:
/// <summary>
/// 将文本绘制在多行
/// </summary>
/// <param name="graphics">绘图器</param>
/// <param name="str">文本</param>
/// <param name="rect">区域</param>
/// <param name="sb">画刷</param>
/// <param name="font">字体</param>
/// <param name="sf">文本格式</param>
public static void DrawStringInRows(Graphics graphics, string str, Font font, SolidBrush sb, Rectangle rect, StringFormat sf)
{
Regex reg = new Regex(@"[\u0800-\u4e00]");//用于判断是否有中文的正则表达式
SizeF desSizeF = graphics.MeasureString(str, font);
if (desSizeF.Width / rect.Width <= 1.0f) //一行能够显示,直接绘制
{
graphics.DrawString(str, font, sb, rect, sf);
}
else
{
Rectangle rect1 = new Rectangle(rect.X, rect.Y, rect.Width, rect.Height / 2);
Rectangle rect2 = new Rectangle(rect.X, rect.Y + rect.Height / 2, rect.Width, rect.Height - rect.Height / 2);
string[] strArry = str.Split(' ');
float wordLength = 0;
float arrayLength = 0;
int arrayIndex = 0;
int index = 0;
string str1 = "";
string str2 = "";
for (index = 0; index < strArry.Length; index++) //获取第一行要显示的字符串
{
wordLength = graphics.MeasureString(strArry[index], font).Width;
if (arrayLength + wordLength < rect.Width)
{
str1 += strArry[index] + " ";
arrayLength += wordLength + graphics.MeasureString(" ", font).Width;
}
else
{
break;
}
}
if (reg.IsMatch(strArry[index]))//需要分割的是中文
{
for (int j = 0; j < strArry[index].Length; j++)
{
wordLength = graphics.MeasureString(strArry[index].Substring(j, 1), font).Width;
arrayLength += wordLength;
if (arrayLength >= rect.Width)
{
arrayIndex = j == 0 ? 0 : j - 1;
str1 += strArry[index].Substring(0, arrayIndex) + " ";
str2 += strArry[index].Substring(arrayIndex) + " ";
break;
}
}
}
else //要分割的不是中文
{
str2 += strArry[index] + " ";
}
for (int j = index + 1; j < strArry.Length; j++)
{
str2 += strArry[j] + " ";
}
graphics.DrawString(str1, font, sb, rect1, sf);
graphics.DrawString(str2, font, sb, rect2, sf);
}
}