前段时间在优化项目时,突然想到在Panel上显示文字并换行的问题。当有一段文字需要显示并且最好是显示在Panel。于是我就动手写了下,做了一个Demo程序,现在将主要的代码贴出来,如果存在不足还希望能够帮忙提意见,以补充完善.
///<summary>///显示文本时需要用到的方法///</summary>intlineDistance =
5;
//行间距
Graphics gcs;
intiHeight =
0;
string[]nrLine;
string[]nrLinePos;
intsearchPos =
0;
intsection =
1;
intsectionHeight =
10;
DispMode dm = DispMode.None;
intiPanelNotPagerHeight=
0;
///<summary>///分析要显示文本的内容,将文本进行分段,分行,并测算好行距,段距等///</summary>///<paramname="pl"></param>///<paramname="ft"></param>///<paramname="iWidth"></param>///<paramname="value"></param>privatevoidGetTextInfo(Panel pl,Font ft,
intiWidth,
stringvalue)
{
try
{
iHeight =
0;
if(
value!=
"")
{
if(gcs ==
null)
{
gcs = pl.
CreateGraphics();
SizeF sf0 = gcs.
MeasureString(
newstring(
'测',
20),ft);
searchPos =(
int)(iWidth*
20/sf0.Width);
if(searchPos>
2)searchPos-=
2;
}
nrLine =
value.
Split(
newstring[
1]{
"\r\n"},StringSplitOptions.RemoveEmptyEntries);
//记下每一段文本的信息
section = nrLine.Length;
nrLinePos =
newstring[section];
//存放每行分割的Index数字
SizeF sf1,sf2;
stringtemps,tempt;
stringdrawstring;
inttemPos;
//临时Indexintipos;
//文字Index//将每一段文字的分成句子,并记下每句的起始Idexfor(
inti =
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)
{
boolisfind =
false;
for(
intj = 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)
{
break;
}
}
ipos+= drawstring.Length;
nrLinePos[i]+=
","+ipos.
ToString();
iHeight++;
}
}
if(dm == DispMode.None)
{
if(
value==
"")
{
iPanelNotPagerHeight =
0;
return;
}
else
{
iPanelNotPagerHeight = iHeight*(ft.Height+lineDistance)+(section-
1)*(sectionHeight-lineDistance);
}
}
}
catch(Exception e)
{
label1.Text=e.Message;
return;
}
}
///<summary>///根据GetTextInfo方法中测算好的信息来绘制文本,将文本显示到Panel上///</summary>///<paramname="pl"></param>///<paramname="text"></param>///<paramname="font"></param>///<paramname="solidbrushColor"></param>///<paramname="iWidth"></param>privatevoidPaintTextOnPanel(Panel pl,
stringtext,Font font,Color solidbrushColor,
intiWidth)
{
Graphics g = pl.
CreateGraphics();
String drawString = text;
Font drawFont = font;
SolidBrush drawBrush =
newSolidBrush(solidbrushColor);
SizeF textSize = g.
MeasureString(text,font);
//文本的矩形区域大小intlineCount = Convert.
ToInt16(textSize.Width/iWidth)+
1;
//计算行数intfHeight = font.Height;
inthtHeight =
0;
boolisPageStart =
false;
floatx =
0.0F;
StringFormat drawFormat =
newStringFormat();
lineCount = drawString.Length;
//行数不超过总字符数目inti,idx,first;
stringsubStr,tmpStr =
"",midStr =
"";
string[]idxs;
inttmpPage =
1;
stringpreLineStr =
"";
for(i =
0;i<section;i++)
{
if(i ==
10)
{
first =
0;
}
first =
0;
subStr = nrLine[i];
if(nrLinePos[i]!=
null)tmpStr = nrLinePos[i].
TrimStart(
',');
midStr = subStr.
Substring(first);
if(tmpStr!=
"")
{
idxs = tmpStr.
Split(
',');
for(
intj =
0;j<idxs.Length;j++)
{
idx =
int.
Parse(idxs[j]);
//每句的结束Index
midStr = subStr.
Substring(first,idx-first);
//通过上句的结束Index和本句的结束Index计算本句的内容if(dm == DispMode.None)
{
g.
DrawString(midStr,drawFont,drawBrush,x,Convert.
ToInt16(htHeight),drawFormat);
}
if(j == idxs.Length-
1)
{
htHeight+=(fHeight+sectionHeight);
}
else
{
htHeight+=(fHeight+lineDistance);
}
first = idx;
//记下本句结束的Index
}
}
}
}
///<summary>///显示模式,分为全显示和分页显示两种///</summary>publicenumDispMode
{
None =
0,
Page =
1}
调用显示Panel上文本的方法如下
private showTextOnPanel()
{
string txt="客服本来就是一个充满压力的工作,也许你以前没怎么挨过骂,起码挨骂还可以顶嘴,但是作为一个专业的客服专员,你就不允许在电话里表现出情绪波动,无论客户如何无理,如果语气不好,甚至爆粗,你的导师都会教你如何应付,但是前提是你一定不可以表现的不客气,否则全都是你错。这个就是客服,专业的客服!你会面对客户的质问(为什么这个你不懂?我要知道准确的解决时间),面对客户的质疑(你是不是新手啊?你确定这样做一定有效?),面对客户的威胁(再弄不好我要投诉你!你经理是谁?我要你经理接电话)。";
//指定字体
Font drawFont =newFont("Arial",14);
//调用方法显示
GetTextInfo(panel1,drawFont,400,txt);
PaintTextOnPanel(panel1,txt,drawFont,Color.Red,400);
}
分享到:
相关推荐
c# winform 绘制多行文本:自动换行:文本c# winform 绘制多行文本:自动换行:文本c# winform 绘制多行文本:自动换行:文本c# winform 绘制多行文本:自动换行:文本c# winform 绘制多行文本:自动换行:文本c# winform 绘制...
在 .net C#,在panel上动态增加控件示例子,简单,一看就会.
/// 绘制文字自动换行 /// /// 绘图图面 /// 绘制文本 /// 绘制字体 /// 字体颜色 /// 最大宽度,达到最大宽度则换行 /// 起始坐标 /// 段落高度间隔 /// 字体间隔</param>
C# WinForm 在Panel中添加Form 教程+源码 可以像MDI窗体那个进行操作,用于解决界面美化过程中的MDI窗体, 新式弹窗.学习一下,绝对有用 C# winform必学
c# winform panel 流式布局 panel块可自动排列 效果详见 http://www.cnblogs.com/simadi/p/3867986.html
提供了一个C#中主窗体Panel中加载其他多个窗体Panel控件的办法
c#自定义圆角panel,可设置圆角的弧度,可设置图片,并且有单击事件,自己可以再次修改源码。文件中已生成dll
C# winform 透明Panel ,可以当一个隐藏的按钮使用,写个关闭程序的功能,或者其他功能
C# 在winform的Panel上画出一组数据点的图像,提供三种画图方法:点图、线图、阶梯图
C#串口通信(解决中文传输和实现换行),该版本解决了传输中文变成乱码、敲回车键不换行等问题
C#158在消息框中换行输出信息 源代码
C# TextBox 换行功能实现
listView实现文字编辑的自动换行.
Winform中的ComBox控件实现换行 当文本长度达到最大时实现换行
winform 对panel里面内容的打印实现
在C#中,实现可以自由扩展缩进的Panel自定义控件,并支持多个Panel自定义控件间的联动伸缩。
c#在图片上添加文字和二维码源码 原文地址:https://blog.csdn.net/u012577474 添加图片方法: DrawImage(Image, 画图位置x, 画图位置y, 图片宽, 图片高); 添加文字方法: DrawString(文字, 字体, 画笔, 位置);
给panel加入阴影效果。程序用c#实现,简单实用,旨在抛砖引玉。
C# Winform遍历控件(窗体、Panel的子控件)Controls ,适合在桌面应用程序中快速上手及运用
C#串口调试助手(实现了中文传输以及自动换行)