您的位置:程序门 -> .net技术 -> c#



怎么用measurecharacterranges测量文本范围,得到的范围不正确?


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


怎么用measurecharacterranges测量文本范围,得到的范围不正确?[已结贴,结贴人:chequan]
发表于:2007-03-08 22:34:45 楼主
如下代码所示:
private   void   panel2_paint(object   sender,   painteventargs   e)
{
        string   text   =   "panel1_paint ";
        font   font   =   new   font(this.font.fontfamily,   22);
        stringformat   format   =   stringformat.generictypographic;
        format.formatflags   =   stringformatflags.measuretrailingspaces;
        characterrange[]   ranges   ={   new   characterrange(0,   text.length)   };
        format.setmeasurablecharacterranges(ranges);
        region[]   region   =   e.graphics.measurecharacterranges(text,   font,   new   rectanglef(10,   10,   int.maxvalue,   int.maxvalue),   format);
        rectangle   rect   =   rectangle.round(region[0].getbounds(e.graphics));
        e.graphics.drawstring(text,   font,   brushes.red,   rect,   format);
        e.graphics.drawrectangle(pens.blue,   rect);
}
这段代码用来测试和绘制英文是没有问题的,可是如果测量和绘制的文本中含有中文字符的话,就不正确了。如:
private   void   panel2_paint(object   sender,   painteventargs   e)
{
        string   text   =   "panel1_paint宋体 ";
        font   font   =   new   font(this.font.fontfamily,   22);
        stringformat   format   =   stringformat.generictypographic;
        format.formatflags   =   stringformatflags.measuretrailingspaces;
        characterrange[]   ranges   ={   new   characterrange(0,   text.length)   };
        format.setmeasurablecharacterranges(ranges);
        region[]   region   =   e.graphics.measurecharacterranges(text,   font,   new   rectanglef(10,   10,   int.maxvalue,   int.maxvalue),   format);
        rectangle   rect   =   rectangle.round(region[0].getbounds(e.graphics));
        e.graphics.drawstring(text,   font,   brushes.red,   rect,   format);
        e.graphics.drawrectangle(pens.blue,   rect);
}
这样的话,绘制出来的文本总是缺少最后一个文字。请问怎么才能解决这个问题,万分感谢!
发表于:2007-03-08 22:53:131楼 得分:20
characterrange[]   ranges   ={   new   characterrange(0,   text.length)   };
这里   一个汉字   应该是2个字符
text.length这样取只按照英文一样
当然   总长少了一个汉字的位置肯定就没有了
用下面的函数   取字符   长度
        ///   <summary>
                ///   检测含有中文字符串的实际长度
                ///   </summary>
                ///   <param   name= "str "> 字符串 </param>
                public   static   int   cnlenth(string   str)
                {
                        system.text.asciiencoding   n   =   new   system.text.asciiencoding();
                        byte[]   b   =   n.getbytes(str);
                        int   l   =   0;   //   l   为字符串之实际长度
                        for   (int   i   =   0;   i   <=   b.length   -   1;   i++)
                        {
                                if   (b[i]   ==   63)   //判断是否为汉字或全脚符号
                                {
                                        l++;
                                }
                                l++;
                        }
                        return   l;
                }
发表于:2007-03-08 23:04:032楼 得分:0
hertcloud(·£孙子兵法£·)   你好,这个问题不是你所说的那样的,我也按照你说的试过了,出现异常。
characterrange里面的字符个数就是单纯的字符个数,而不管是中文还是英文的哟。
所以问题不在这里。


快速检索

最新资讯
热门点击