zoukankan      html  css  js  c++  java
  • C#如何测量字符串的高度宽度和精确取得字符串的高度宽度

    因为MFC中CDC有GetTextExtent()可以获得字符串的高度宽度 像素单位,所以自然想到c#的GDI+的MeasureString,这个同样是测量字符串高度宽度,但是这个不同于CDC,他不适用CDC.GetTextExtent()的适用领域,GDI+ MeasureString会自己处理矩形区域,返回这个矩形区域SizeF,这就是为什么是浮点而不是整数,它根本就不是字符串准确的高度宽度。 举个例子:给定字符串s,用Graphics的MeasureString获取高度宽度sizeF,并在一个给定的起点显示以sizeF为高度宽度的矩形大小和字符串s

    string s ="an English string and 一个中文字符串";
    Graphics g
    =this.CreateGraphics();
    g.PageUnit
    = GraphicsUnit.Pixel;
    g.SmoothingMode
    = SmoothingMode.HighQuality;
    StringFormat sf
    =new StringFormat();
    sf.FormatFlags
    = StringFormatFlags.MeasureTrailingSpaces;
    SizeF sizeF
    = g.MeasureString(s, this.Font, 500, sf);
    g.DrawRectangle(Pens.Red,
    new Rectangle(100, 400, Convert.ToInt32(sizeF.Width), Convert.ToInt32(sizeF.Height)));
    g.DrawString(s,
    this.Font, new SolidBrush(Color.Green), 100, 400);

    以100,400坐标位奇点绘制sizeF大小的矩形 和 字符串 改sizeF是测量该字符串得到的。

    效果如下:(没处理显示质量 这个不是重点)注意'g'和'串'

    说明Gdi+的MeasureString跟CDC的GetTextExtent完全不一样 GDI+在字符串四周添加一些长度,以适应字符串绝对可以被测量得到的SizeF包裹住,而且在末尾添加的更多空白,大概是想包裹住文字单击时的鼠标状态。

    类似上面的代码,使用TextRender的MeasureText精确获得包裹字符串的区域,效果如下:

    区别在于字符串末尾增宽 和 对英文字符下部的增宽处理。

  • 相关阅读:
    DiskFileUpload上传与Spring的CommonsMultipartResolver上传对比
    ajax请求jesery接口无法获取参数的问题解决方案
    java乱码问题总结
    indiGolog的安装
    hadoop启动步骤
    ubuntu修改默认jdk
    ubuntu 安装 ssh
    rabbitmq五种模式详解(含实现代码)
    终于可以像使用 Docker 一样丝滑地使用 Containerd 了
    Docker安装Nacos动态服务发现、配置和服务管理平台
  • 原文地址:https://www.cnblogs.com/chenbg2001/p/2955016.html
Copyright © 2011-2022 走看看