C# winform自定义Label控件使其能设置行距
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Drawing;
- using System.ComponentModel;
- namespace WindowsFormsApplication10
- {
- 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;
- public int LineDistance
- {
- get { return lineDistance; }
- set
- {
- lineDistance = value;
- Changed(this.Font, this.Width, this.Text);
- }
- }
- public LabelTx()
- : base()
- {
- //this.TextChanged += new EventHandler(LabelTx_TextChanged);
- this.SizeChanged += new EventHandler(LabelTx_SizeChanged);
- this.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);
- }
- public LabelTx(IContainer container)
- {
- container.Add(this);
- //base.Height
- //InitializeComponent();
- }
- public int FHeight
- {
- get { return this.Font.Height; }
- }
- protected int Height
- {
- get { return height; }
- set
- {
- height = value;
- base.Height = value;
- }
- }
- public override string Text
- {
- get
- {
- return base.Text;
- }
- set
- {
- //is.Font.Size.
- base.Text = value;
- Changed(this.Font, this.Width, value);
- }
- }
- 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.Split(new string[1] { "/r/n" }, StringSplitOptions.RemoveEmptyEntries);
- 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);
- }
- 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.ToInt16(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.ToInt16(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 +
- }
- }
- }
- }
C# winform自定义Label控件使其能设置行距的更多相关文章
- winform 可拖动的自定义Label控件
效果预览: 实现步骤如下: (1)首先在项目上右击选择:添加->新建项,添加自定义控件 (2)自定义的一个Label让它继承LabelControl控件,LabelControl控件是DevEx ...
- 自定义Label控件
最近开发过程中有一个需求就是修改label控件的模板,使其能够在鼠标移近的时候变成TextBox,从而方便输入,然后进行相应的修改,最终达到动态修改Label的目的,这里贴出相应的代码,并做简要的分析 ...
- Winform自定义键盘控件开发及使用
最近有学员提出项目中要使用键盘控件,系统自带的osk.exe不好用,于是就有了下面的内容: 首先是进行自定义键盘控件的开发,其实核心大家都知道,就是利用SendKeys.Send发送相应 的字符,但是 ...
- WinForm使用Label控件模拟分割线(竖向)
用Label控件进行模拟 宽度设为1:this.lblPagerSpliter1.Size = new System.Drawing.Size(1, 21); 去掉边框:this.lblPagerSp ...
- WinForm自定义验证控件
本文转载:http://blog.csdn.net/ziyouli/article/details/7583824 此篇博文不错:http://blog.csdn.net/sony0732/artic ...
- winform 自定义分页控件 及DataGridview数据绑定
分页效果如上图所示,用到的控件均为基本控件 ,其方法如下 右击项目-添加-新建项 选择用户控件 然后在用户控件中拖入所需要的Label,Button,Text 用户控件全部代码: using Syst ...
- Winform自定义分页控件的实现
实现效果 有点丑陋 但是功能是没问题的 测试过 实现思路 先创建一个用户控件 代码实现 public partial class PagerControl : UserControl { ; /// ...
- winform自定义分页控件
1.控件代码: public partial class PagerControl : UserControl { #region 构造函数 public PagerControl() { Initi ...
- winform自定义日期控件,要求可以手动输入日期DatePicker
要求:文本框中能手动输入数字,向上箭头根据鼠标位置给年月日递增,向下箭头递减 一:页面加载时: private void FlatDatePicker_Load(object sender, Even ...
随机推荐
- Linux中的sed
sed [选项] [动作] 文件 选项: -n :静默模式.使用-n则只有经过sed处理的那一行. -e :允许多重编辑: -f :结果默认输出到终端,使用-f会将结果写在 ...
- IOPS和Throughput
IOPS和Throughput吞吐量两个参数是衡量存储性能的主要指标.IOPS表示存储每秒传输IO的数量,Throughput吞吐量则表示每秒数据的传输总量.两者在不同的情况下都能表示存储的性能状况, ...
- DataGridView如何快速导出Excel
从DataGridView或DataTable导出Excel文件,为了按照数据类型设置单元格格式,导出Excel时速度都比较慢,一直找不到好的办法. 最后从外文网站上找到解决办法,使用ws.get_R ...
- power designer
概述 Power Designer 是Sybase公司的CASE工具集,使用它可以方便地对管理信息系统进行分析设计,他几乎包括了数据库模型设计的全过程.利用Power Designer可以制作数据流程 ...
- 使用Github总结
1. 使用Git GUI 首先熟悉一下GUI,如下: 第一步,首先将代码fork到自己的版本库下面,如下: 并获取clone URL,如下图: 然后点击GUI克隆已有版本库,如下图: 点击克隆就可以得 ...
- 如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例
wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视.本文对这些关键字的使用进行了描述. 在 Java 中可以用 wait ...
- 制作UI纹理(UI Texture)
什么情况下使用UI Texture UI Texture的功能是在屏幕上显示一张图片,在这一点上它和Sprite有着相似的功能,但是UI Texture会消耗单独的DrawCall去渲染,并会单独加载 ...
- ubuntu - sudo in php exec
最近写防火墙的WEB版,需要在PHP中调用linux系统命令,但是防火墙有关的执行都需要管理员权限才能执行. 在ubuntu下,Apache2的运行账户默认是www-data,默认是不能通过sudo来 ...
- 移动前端javascript事件
移动端事件: // 手势事件 touchstart //当手指接触屏幕时触发 touchmove //当已经接触屏幕的手指开始移动后触发 touchend //当手指离开屏幕时触发 touchcanc ...
- final, finally 和finalize的区别
final 修饰符(关键字) 如果一个类被声明为final,意味着它不能再派生新的子类,不能作为父类被继承.因此一个类不能及被声明为abstract,又被声明为final的.将变量或方法声明为fina ...