某種情況下,
需要使用label在界面中添加說明性的文本,
文本長度往往比較長,
需要換行,
雖然在字符中加入\r\n后可以實現換行,
但默認的行距很小,
文本擠在一起,
看起來比較費眼,
所以想着調整一下行距,
經過搜索,
在這里找到了相關的方法。
我自己試着改了一下,
直接在label的paint方法中實現了,
沒有定義自己的控件。
代碼如下:
private void label8_Paint(object sender, PaintEventArgs e)
{
System.Windows.Forms.Label label = sender as System.Windows.Forms.Label;
int LineDistance = 4;//行間距
Graphics g = e.Graphics;
g.Clear(label.BackColor);
String drawString = label.Text;
System.Drawing.Font drawFont = label.Font;
SolidBrush drawBrush = new SolidBrush(label.ForeColor);
//文本的矩形區域大小
SizeF textSize = g.MeasureString(label.Text, label.Font);
//計算行數
int lineCount = Convert.ToInt16(textSize.Width / label.Width) + 1;
//計算調整后的高度
label.Height = Convert.ToInt16((textSize.Height + LineDistance) * lineCount);
label.AutoSize = false;
float x = 0.0F;
float y = 0.0F;
StringFormat drawFormat = new StringFormat();
int step = 1;
lineCount = drawString.Length;//行數不超過總字符數目
for (int i = 0; i < lineCount; i++)
{
//計算每行容納的字符數目
int charCount;
for (charCount = 0; charCount < drawString.Length; charCount++)
{
string subN = drawString.Substring(0, charCount);
string subN1 = drawString.Substring(0, charCount + 1);
if (g.MeasureString(subN, label.Font).Width <= label.Width
&& g.MeasureString(subN1, label.Font).Width > label.Width)
{
step = charCount;
break;
}
}
string subStr;
if (charCount == drawString.Length)//最后一行文本
{
subStr = drawString;
e.Graphics.DrawString(subStr, drawFont, drawBrush, x,
Convert.ToInt16(textSize.Height * i) + i * LineDistance, drawFormat);
break;
}
else
{
subStr = drawString.Substring(0, step);//當前行文本
drawString = drawString.Substring(step);//剩余文本
e.Graphics.DrawString(subStr, drawFont, drawBrush, x,
Convert.ToInt16(textSize.Height * i) + i * LineDistance, drawFormat);
}
}
}

雖然還有些不足,
比如逗號在行首,
但整體效果比之前要好不少了!
