RaUI/Source/ryControls/Controls/LabelTx.cs
2020-11-28 15:03:57 +08:00

239 lines
7.8 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Drawing;
namespace ryControls
{
/// <summary>
/// 可以改变文本行距行间距的Label
/// </summary>
public partial class LabelTx : System.Windows.Forms.Label
{
int lineDistance = 5;//行间距
Graphics gcs;
int iHeight = 0, height = 200;
string[] nrLine;
string[] nrLinePos;
int searchPos = 0;
int section = 1;
/// <summary>
/// 行间距
/// </summary>
[Description("行间距")]
public int LineDistance
{
get { return lineDistance; }
set
{
lineDistance = value;
Changed(this.Font, this.Width, this.Text);
}
}
/// <summary>
/// 可以改变文本行距行间距的Label
/// </summary>
public LabelTx()
: base()
{
//this.TextChanged += new EventHandler(LabelTx_TextChanged);
base.SizeChanged += new EventHandler(LabelTx_SizeChanged);
base.Resize+= new EventHandler(LabelTx_SizeChanged);
base.FontChanged += new EventHandler(LabelTx_FontChanged);
//this.Font = new Font(this.Font.FontFamily, this.Font.Size, GraphicsUnit.Pixel);
}
void LabelTx_FontChanged(object sender, EventArgs e)
{
Changed(this.Font, this.Width, this.Text);
}
void LabelTx_SizeChanged(object sender, EventArgs e)
{
Changed(this.Font, this.Width, this.Text);
}
/// <summary>
///
/// </summary>
public void UpdateInfo()
{
Changed(this.Font, this.Width, this.Text);
}
/// <summary>
/// 字体高度
/// </summary>
public int FHeight
{
get { return this.Font.Height; }
}
/// <summary>
///
/// </summary>
protected new int Height
{
get { return height; }
set
{
height = value;
base.Height = value;
}
}
/// <summary>
/// 文本
/// </summary>
public override string Text
{
get
{
return base.Text;
}
set
{
//is.Font.Size.
base.Text = value;
Changed(this.Font, this.Width, value);
}
}
/// <summary>
///
/// </summary>
/// <param name="ft"></param>
/// <param name="iWidth"></param>
/// <param name="value"></param>
protected void Changed(Font ft, int iWidth, string value)
{
iHeight = 0;
if (value != "")
{
if (gcs == null)
{
gcs = this.CreateGraphics();
}
SizeF sf0 = gcs.MeasureString(new string('测', 20), ft);
searchPos = (int)(iWidth * 20 / sf0.Width);
nrLine = value.Replace("\r","").Split("\n".ToCharArray());
section = nrLine.Length;
nrLinePos = new string[section];
SizeF sf1, sf2;
string temps, tempt;
string drawstring;
int temPos, ipos;
for (int i = 0; i < section; i++)
{
ipos = 0;
temPos = searchPos;
if (searchPos >= nrLine[i].Length)
{
ipos += nrLine[i].Length;
nrLinePos[i] += "," + ipos.ToString();
iHeight++;
continue;
}
drawstring = nrLine[i];
nrLinePos[i] = "";
while (drawstring.Length > searchPos)
{
bool isfind = false;
for (int j = searchPos; j < drawstring.Length; j++)
{
temps = drawstring.Substring(0, j);
tempt = drawstring.Substring(0, j + 1);
sf1 = gcs.MeasureString(temps, ft);
sf2 = gcs.MeasureString(tempt, ft);
if (sf1.Width < iWidth && sf2.Width > iWidth)
{
iHeight++;
ipos += j;
nrLinePos[i] += "," + ipos.ToString();
isfind = true;
drawstring = drawstring.Substring(j);
break;
}
}
if (!isfind)
{
//drawstring = drawstring.Substring(searchPos);
//iHeight++;
break;
}
}
ipos += drawstring.Length;
nrLinePos[i] += "," + ipos.ToString();
iHeight++;
//tempLine = (int)(sf1.Width - 1) / this.Width + 1;
//iHeight += tempLine;
}
}
this.Height = iHeight * (ft.Height + lineDistance);
}
/// <summary>
///
/// </summary>
/// <param name="e"></param>
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
//base.OnPaint(e);
//if (isPaint) return;
//isPaint = true;
Graphics g = e.Graphics;
String drawString = this.Text;
Font drawFont = this.Font;
SolidBrush drawBrush = new SolidBrush(this.ForeColor);
SizeF textSize = g.MeasureString(this.Text, this.Font);//文本的矩形区域大小
int lineCount = Convert.ToInt32(textSize.Width / this.Width) + 1;//计算行数
int fHeight = this.Font.Height;
int htHeight = 0;
this.AutoSize = false;
float x = 0.0F;
//float y = 0.0F;
StringFormat drawFormat = new StringFormat();
//int step = 1;
//bool isFirst = true;
//SizeF sf1, sf2;
//string subN, subN1;
lineCount = drawString.Length;//行数不超过总字符数目
int i, idx, first;
string subStr, tmpStr = "", midStr = "";
string[] idxs;
for (i = 0; i < section; i++)
{
first = 0;
subStr = nrLine[i];
if (nrLinePos[i] != null) tmpStr = nrLinePos[i].TrimStart(',');
midStr = subStr.Substring(first);
if (tmpStr != "")
{
idxs = tmpStr.Split(',');
for (int j = 0; j < idxs.Length; j++)
{
idx = int.Parse(idxs[j]);
midStr = subStr.Substring(first, idx - first);
e.Graphics.DrawString(midStr, drawFont, drawBrush, x, Convert.ToInt32(htHeight), drawFormat);
htHeight += (fHeight + lineDistance);
first = idx;
}
//midStr = subStr.Substring(first);
}
//e.Graphics.DrawString(midStr, drawFont, drawBrush, x, Convert.ToInt16(htHeight), drawFormat);
//htHeight += ( lineDistance);//fHeight +
}
}
}
}