Wince下自定义控件文字换行显示

     Wince下的TextBox控件只能显示一行,多的就不能显示全了,要实现多行显示就得自定义控件,将要显示的字符串使用GDI+绘制到控件的工作区中。但是.Net CF中Graphics的DrawString方法并不像.Net FrameWork一样能够自动换行,所以需要自己写换行方法。

   在写这个方法之前要考虑解决如下几个问题:

       1. 要兼容换行与不换行两种情况

       2. 不同语言的文字换行规则不一样:中文的可以在任意两个字符中间断开换行;英文却不能再一个单词中间分开

       3. 同样的显示区,不同字体能显示下的内容是不同的

  下面是一个分两行显示的方法:


        /// <summary>
        /// 将文本绘制在多行
        /// </summary>
        /// <param name="graphics">绘图器</param>
        /// <param name="str">文本</param>
        /// <param name="rect">区域</param>
        /// <param name="sb">画刷</param>
        /// <param name="font">字体</param>
        /// <param name="sf">文本格式</param>
        public static void DrawStringInRows(Graphics graphics, string str, Font font, SolidBrush sb, Rectangle rect, StringFormat sf)
        {

           Regex reg = new Regex(@"[\u0800-\u4e00]");//用于判断是否有中文的正则表达式
            SizeF desSizeF = graphics.MeasureString(str, font);


            if (desSizeF.Width / rect.Width <= 1.0f)  //一行能够显示,直接绘制
            {
                graphics.DrawString(str, font, sb, rect, sf);
            }
            else
            {
                Rectangle rect1 = new Rectangle(rect.X, rect.Y, rect.Width, rect.Height / 2);
                Rectangle rect2 = new Rectangle(rect.X, rect.Y + rect.Height / 2, rect.Width, rect.Height - rect.Height / 2);

                string[] strArry = str.Split(' ');
                float wordLength = 0;
                float arrayLength = 0;
                int arrayIndex = 0;

                int index = 0;
                string str1 = "";
                string str2 = "";

                for (index = 0; index < strArry.Length; index++) //获取第一行要显示的字符串
                {
                    wordLength = graphics.MeasureString(strArry[index], font).Width;
                    if (arrayLength + wordLength < rect.Width)
                    {
                        str1 += strArry[index] + " ";
                        arrayLength += wordLength + graphics.MeasureString(" ", font).Width;
                    }
                    else
                    {
                        break;
                    }
                }

                if (reg.IsMatch(strArry[index]))//需要分割的是中文
                {
                    for (int j = 0; j < strArry[index].Length; j++)
                    {
                        wordLength = graphics.MeasureString(strArry[index].Substring(j, 1), font).Width;
                        arrayLength += wordLength;

                        if (arrayLength >= rect.Width)
                        {
                            arrayIndex = j == 0 ? 0 : j - 1;

                            str1 += strArry[index].Substring(0, arrayIndex) + " ";
                            str2 += strArry[index].Substring(arrayIndex) + " ";

                            break;
                        }
                    }
                }
                else //要分割的不是中文
                {
                    str2 += strArry[index] + " ";
                }

                for (int j = index + 1; j < strArry.Length; j++)
                {
                    str2 += strArry[j] + " ";
                }

                graphics.DrawString(str1, font, sb, rect1, sf);
                graphics.DrawString(str2, font, sb, rect2, sf);
            }
        }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值