`
hududanyzd
  • 浏览: 815766 次
文章分类
社区版块
存档分类
最新评论

C#中在panel上写文字并换行的方法

 
阅读更多

前段时间在优化项目时,突然想到在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;//临时Index
intipos;//文字Index
//将每一段文字的分成句子,并记下每句的起始Idex
for(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 绘制多行文本:自动换行:文本c# winform 绘制...

    c#分块窗体界面设计

    在C#编程中,创建一个分块的窗体界面设计是一项常见的任务,它不仅可以提升应用程序的视觉吸引力,还可以使用户界面更加清晰、易用。本教程将指导你如何利用C#来实现这样的效果,尤其关注窗体的美化过程。 首先,...

    C#利用GDI绘制常见图形和文字

    值得注意的是,`CreateGraphics()`方法通常用于临时绘图,如果需要在窗体上持久显示图形,应该重写`OnPaint`事件并使用`PaintEventArgs`中的`e.Graphics`对象,这样图形会在每次窗体重绘时自动更新。 总的来说,C#...

    C#编程经验技巧宝典

    85 &lt;br&gt;0131 巧截字符串的数字 86 &lt;br&gt;0132 如何存储变长字符串 86 &lt;br&gt;0133 在进行字符串比较时忽略大小写 87 &lt;br&gt;0134 如何去除字符串尾空格 87 &lt;br&gt;0135 如何去掉字符串中所有空格 ...

    C#应用程序开发-Windows常用控件.pptx

    【C#应用程序开发】在Windows桌面应用开发中,掌握常用控件是至关重要的。这篇文档主要介绍了四个核心的控件类别:标签(Label)、文本框(TextBox)、按钮(Button),以及组框(GroupBox)、面板(Panel)、复选框...

    竖排按钮显示

    在本文中,我们将深入探讨如何在WPF中实现竖排按钮显示,并了解相关技术细节。 首先,WPF提供了多种布局系统,包括StackPanel、Grid、Canvas等,其中StackPanel特别适合用来实现竖排布局。StackPanel会按照其...

    C# for CSDN 乱七八糟的看不懂

    第6页 C#(WINFORM)学习 找到集合中数量最多的一个元素 利用方法来查找,可以返回两个变量。 object Jmax0(ArrayList v11,ref int jj) { int i; object j0=0; ArrayList y11=new ArrayList(); //各个不同的元素的...

    DevExpress控件使用,及属性介绍

    - **自动换行**:通过 `Column.AppearanceCell.TextOptions.WordWrap` 设置单元格中的文字是否自动换行。 - **行颜色**:使用 `Gridview.OptionView` 的 `EnableAppearanceEvenRow` 和 `EnableAppearanceOddRow` ...

    2021-2022计算机二级等级考试试题及答案No.14153.docx

    这些题目涉及了计算机基础知识、编程...23. 自动换行:在VB或类似环境中,若想让标签框的文字自动折行,需设置AutoSize和WordWrap属性为True。 以上就是这些计算机二级考试题目的详细解析,涵盖了多个方面的IT知识。

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    +PageManager的实例方法AddAjaxUpdateControl改名为AddAjaxAspnetControls,现在可以在Page_Load中设置需要在AJAX中需要更新的Asp.net控件了。 -在Page_Load中设置了哪些需要在AJAX中更新的Asp.net控件会在回发时...

    免费DataGridView打印及.NET轻松打印控件5.0版

    本DataGridView打印控件和.NET轻松打印控件5.0版(含报表模板设计组件)2012年5月12日修改完成,完全免费,在.NET2.0及以上环境下都可以使用(VB、C#等都可以用),有帮助文档与使用实例。 与4.95版相比,控件5.0版...

    ExtAspNet_v2.3.2_dll

    -ExtAspNet支持原生的AJAX,也就是说控件的属性改变在AJAX过程中会反映到页面中,但并不是所有的控件属性都支持AJAX改变。 -加载s.gif图片在本机进行,不会请求extjs.com远程资源(feedback:efrigate43,abaocoole)...

Global site tag (gtag.js) - Google Analytics