label 添加 Paint 事件。用"\n" 段落换行
private void label2_Paint(object sender, PaintEventArgs e)
{
int LineDistance = 8;//行间距
System.Windows.Forms.Label label = sender as System.Windows.Forms.Label;
System.Drawing.Font drawFont = label.Font;
label.AutoSize = false;
SolidBrush drawBrush = new SolidBrush(label.ForeColor);
Graphics g = e.Graphics;
g.Clear(label.BackColor);
StringFormat drawFormat = new StringFormat();
string[] arrDrawString = label.Text.Split(new char[] { '\n'});
int height = 0;
foreach (string str in arrDrawString)
{
//文本的矩形区域大小
SizeF textSize = g.MeasureString(str, label.Font);
//计算行数
int strLineCount = Convert.ToInt32(Math.Ceiling(textSize.Width / label.Width));
height += Convert.ToInt16((textSize.Height + LineDistance) * strLineCount);
}
label.Height = height; //计算调整后的高度
float netTextPos_Y = 0; // 下一行的位置
foreach (string drawString in arrDrawString)
{
bool drawText = false;
int strLenght = 1; // 长度
int startIndex = 0; // 开始位置
for (int i = 0; i < drawString.Length; i++, strLenght++)
{
string subN = drawString.Substring(startIndex, strLenght);
if (startIndex + strLenght >= drawString.Length)
{
drawText = true;
}
else
{
string subN1 = drawString.Substring(startIndex, strLenght + 1);
if (g.MeasureString(subN, label.Font).Width <= label.Width && g.MeasureString(subN1, label.Font).Width > label.Width)
{
drawText = true;
}
}
if (drawText)
{
drawText = false;
strLenght = 0;
startIndex = i + 1;
SizeF textSize = g.MeasureString(subN, label.Font);
e.Graphics.DrawString(subN, drawFont, drawBrush, 0, netTextPos_Y , drawFormat);
netTextPos_Y = netTextPos_Y + textSize.Height + LineDistance;
}
}
}
}
效果图: