加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

C#中在panel上写文字并换行的技巧

发布时间:2021-11-24 17:10:24 所属栏目:PHP教程 来源:互联网
导读:前段时间在优化项目时,突然想到在Panel上显示文字并换行的问题。当有一段文字需要显示并且最好是显示在Panel。于是我就动手写了下,做了一个Demo程序,现在将主要的代码贴出来,如果存在不足还希望能够帮忙提意见,以补充完善. /// summary /// 显示文本时

前段时间在优化项目时,突然想到在Panel上显示文字并换行的问题。当有一段文字需要显示并且最好是显示在Panel。于是我就动手写了下,做了一个Demo程序,现在将主要的代码贴出来,如果存在不足还希望能够帮忙提意见,以补充完善.
 
/// <summary>
        /// 显示文本时需要用到的方法
        /// </summary>
        int lineDistance = 5;//行间距
        Graphics gcs;
        int iHeight = 0;
        string[] nrLine;
        string[] nrLinePos;
        int searchPos = 0;
        int section = 1;
        int sectionHeight = 10;
        DispMode dm = DispMode.None;
        int iPanelNotPagerHeight=0;
        
        
        /// <summary>
        /// 分析要显示文本的内容,将文本进行分段,分行,并测算好行距,段距等
        /// </summary>
        /// <param name="pl"></param>
        /// <param name="ft"></param>
        /// <param name="iWidth"></param>
        /// <param name="value"></param>
        private void GetTextInfo(Panel pl,Font ft, int iWidth, string value)
        {
            try
            {
                iHeight = 0;
                if (value != "")
                {
                    if (gcs == null)
                    {
                        gcs = pl.CreateGraphics();
                        SizeF sf0 = gcs.MeasureString(new string('测', 20), ft);
                        searchPos = (int)(iWidth * 20 / sf0.Width);
                        if (searchPos > 2) searchPos -= 2;
                    }
 
                    nrLine = value.Split(new string[1] { "rn" }, StringSplitOptions.RemoveEmptyEntries);//记下每一段文本的信息
                    section = nrLine.Length;
                    nrLinePos = new string[section];//存放每行分割的Index数字
                    SizeF sf1, sf2;
                    string temps, tempt;
                    string drawstring;
                    int temPos;//临时Index
                    int ipos;//文字Index
                    //将每一段文字的分成句子,并记下每句的起始Idex
                    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)
                            {
                                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>
        /// <param name="pl"></param>
        /// <param name="text"></param>
        /// <param name="font"></param>
        /// <param name="solidbrushColor"></param>
        /// <param name="iWidth"></param>
        private void PaintTextOnPanel(Panel pl,string text,Font font,Color solidbrushColor,int iWidth)
        {
            Graphics g = pl.CreateGraphics();
            String drawString = text;
            Font drawFont = font;
            SolidBrush drawBrush = new SolidBrush(solidbrushColor);
            SizeF textSize = g.MeasureString(text, font);//文本的矩形区域大小   
            int lineCount = Convert.ToInt16(textSize.Width / iWidth) + 1;//计算行数   
            int fHeight = font.Height;
            int htHeight = 0;
            bool isPageStart = false;
            float x = 0.0F;
            StringFormat drawFormat = new StringFormat();
            lineCount = drawString.Length;//行数不超过总字符数目   
            int i, idx, first;
            string subStr, tmpStr = "", midStr = "";
            string[] idxs;
            int tmpPage = 1;
            string preLineStr = "";
            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 (int j = 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>
        public enum DispMode
        {
            None = 0,
            Page = 1
        }
 
 
 
调用显示Panel上文本的方法如下
 
 
 
private showTextOnPanel()
 
{
 
           string txt="客服本来就是一个充满压力的工作,也许你以前没怎么挨过骂,起码挨骂还可以顶嘴,但是作为一个专业的客服专员,你就不允许在电话里表现出情绪波动,无论客户如何无理,如果语气不好,甚至爆粗,你的导师都会教你如何应付,但是前提是你一定不可以表现的不客气,否则全都是你错。这个就是客服,专业的客服!你会面对客户的质问(为什么这个你不懂?我要知道准确的解决时间),面对客户的质疑(你是不是新手啊?你确定这样做一定有效?),面对客户的威胁(再弄不好我要投诉你!你经理是谁?我要你经理接电话)。";
 
            //指定字体
 
            Font drawFont = new Font("Arial", 14);
 
            //调用方法显示
            GetTextInfo(panel1,drawFont,400,txt);
            PaintTextOnPanel(panel1,txt,drawFont,Color.Red,400);
 
 
 
}

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读