首先需要说明的是,我所说的字符串的长度,不是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:字体映射器转换这个值到设备单位,并将它的绝对值和已有字体的字符高度相匹配。
比较所有的高度,字体映射器选择不超过要求大小的最大字体。
此映射当字体第一次