windows客户端开发--如何测量一个字符串显示的物理长度

本文介绍了在Windows客户端开发中,如何测量一个字符串在屏幕上的物理宽度,重点讲解了使用CreateFont函数创建逻辑字体以及通过GetTextExtentPoint32和DrawText函数获取字符串尺寸的方法,以解决label控件不能自适应宽度的问题。
摘要由CSDN通过智能技术生成

首先需要说明的是,我所说的字符串的长度,不是string的length,也不是string的size。我指的是显示的长度,即物理长度。

缘由:
之所以要提到这个,是因为遇到了一些问题。
再使用duilib进行开发时,发现label控件不能自适应宽度。

思考:
这显示是这个库的一个不足,但是我们可以试图去修改一下这个库。但是本着开源的精神,或许这个库的设计初衷就是label不能自适应字符串的宽度呢?

所有只有走第二条路,我们首先获得要显示字符串的宽度width值,然后把这个label的宽度设置为width。

实现:
现在的问题就是在windows上,如何获得一个字符串的宽度呢?

这个时候一定想到了使用设备描述表,HDC。

如何获得DC以及如何释放DC,这里就不再赘述了,之前的博客有过讲解。

这个时候你又会问,我怎么确定一个字符串的显示长度呢?
对于同一个字符串,不同大小的字体,显示也是不一样的啊。

所以,我们肯定也需要用到字体。

这里有个函数:

HFONT hFont = CreateFont(27, 0, 0, 0, FW_DONTCARE, 0, 0, 0,
        ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
        DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, NULL);

看看这个函数,参数很多:

cHeight是字体的高度。
cWidth是字体的宽度。
cEscapement是字体的倾斜角。
cOrientation是字体的倾斜角。
cWeight是字体的粗细。
bItalic是字体是否斜体。
bUnderline是字体是否有下划线。
bStrikeOut是字体是否有删除线。
iCharSet是字体使用的字符集。
iOutPrecision是指定如何选择合适的字体。
iClipPrecision是用来确定裁剪的精度。
iQuality是怎么样跟选择的字体相符合。
iPitchAndFamily是间距标志和属性标志。
pszFaceName是字体的名称。
函数功能:该函数创建一种有特殊性的逻辑字体,此逻辑字体可以在后面被任何设备选择。
函数原型:HFONT CreateFont(int nHeight, int nWidth, int nEscapement, int nOrientation, int fnWeight, DWORD fdwltalic, DWORD fdwUnderline, DWORD fdwStrikeOut, DWORD

fdwCharSet, DWORD fdwOutputPrecision, DWORD fdwClipPrecision, DWORD fdwQuality, DWORD fdwPitchAndFamily, LPCTSTR lpszFace);

参数:
nHeight:指定字体的字符单元或字符的逻辑单位高度,字符的高度值(也被称为em高度)是指字符单元高度值减去内部标头值。字体映射器以如下方式解释nHeight指定的值,各值含义
为:

0:字体映射器转换这个值以设备单位,并和已有字体的单元高度相匹配。

0:字体映射器转换在选择匹配时用一个缺省的高度值。

<0:字体映射器转换这个值到设备单位,并将它的绝对值和已有字体的字符高度相匹配。

比较所有的高度,字体映射器选择不超过要求大小的最大字体。

此映射当字体第一次

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一苇渡江694

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值