陈宝刚---享受生活,追逐梦想!
理想是心中的火焰,有追求的人才是幸福的人!
posts - 507,comments - 56,views - 37万

因为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精确获得包裹字符串的区域,效果如下:

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

posted on   追梦人RUBY  阅读(7593)  评论(1编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
< 2013年3月 >
24 25 26 27 28 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 1 2 3 4 5 6

点击右上角即可分享
微信分享提示