中英文数字字符等混合字符串精确测量字符大小并两种方式绘制比较

该博客探讨了如何精确测量包含中英文数字字符的混合字符串的字符大小,并介绍了两种不同的绘制方法进行比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       //绘制函数

       private static string DrawText(PaintEventArgs e, Font font)

        {
            string s = "Tail Spin Toys 中\b文 + 数<d0.25.>{a2}(aBc)字,123.256 A,bc! Th.is is a test Measure string demo.30";

            //string s = "This is a English string ......";
            StringBuilder sb = new StringBuilder();
            //Font font = new Font("仿宋", 13, FontStyle.Regular);
            sb.AppendLine("字体:" + font.Name + ";字体大小:(" + font.SizeInPoints.ToString() + "----" + font.Size.ToString() + ")");
            Point startPoint = new Point(10, 10);


            // Set TextFormatFlags to no padding so strings are drawn together.
            TextFormatFlags flags = TextFormatFlags.NoPadding;
            Size proposedSize = new Size(0, 0); //new Size(int.MaxValue, int.MaxValue);


            int width = 0;
            int height = 0;
            int spaceCount = 0;
            //foreach (char c in s)
            for (int i = 0; i < s.Length; i++)
            {
                char c = s[i];
                Size size = TextRenderer.MeasureText(e.Graphics, c.ToString(), font, proposedSize, flags);
                Rectangle rect = new Rectangle(startPoint, size);


                //两种绘制对比,表现上差异不是很大
                TextRenderer.DrawText(e.Graphics, c.ToString(), font, startPoint, Color.Black, flags);
                e.Graphics.DrawString(c.ToString(), font, Brushes.Blue, new PointF(startPoint.X, startPoint.Y), StringFormat.GenericTypographic);
                
                startPoint.X += size.Width;
                width += size.Width;
                height = Math.Max(height, size.Height);


                if (c == ' ')
                {
                    sb.AppendLine("空格宽:" + size.Width.ToString() + ";位置:" + i.ToString());
                    spaceCount++;
                }


                sb.AppendLine("字符:" + c.ToString() + " 宽度:" + size.Width.ToString() + " 高度:" + size.Height.ToString());


            }


            sb.AppendLine("空格数:" + spaceCount);


            Rectangle rect1 = new Rectangle(new Point(10, 10), new Size(width, height));


            e.Graphics.DrawRectangle(Pens.Red, rect1);


            return  sb.ToString();


        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值