[已解决]如何计算 字符串 在 Label 占用的像素宽度
本帖最后由 yhxhappy 于 2010-11-8 19:02 编辑如题。
我想要创建一个Label控件,然后点击该控件时触发操作,但Label上文本不固定,如果Label宽度固定的话,字符少了,会有空的位置,点击空的位置也会触发操作。
所以我想先计算字符串的长度,再根据长度来设置Label控件的宽度
曾经考虑过计算字节数再乘以一定的值,但行不通,因为要考虑中英文的宽度差别,而且不同英文字母在不同的字体下宽度也不固定。
自己看了帮助,发现这个:
_WinAPI_GetTextExtentPoint32($hDC, $sText) 计算指定字符串文本的宽度和高度
不知道这个行不行,$hDC(设备场景标识)不知道该填什么。
还望各位大大能指点一下 你只能用字符串查有多少,再估计一个有多少来算 回复 2# rikthhpgf2005
之前也这么想过,但想求一个精确一点的值。
像i和w这两个字母的宽度就明显不同,还有大写和小写也差很多,再加上标点符号,计算起来就复杂了 Label控件不会没有吧,点击原点附近的不行么? 回复 4# xyold1
我还给Label 设置了鼠标指针,鼠标经过控件时显示手型的鼠标指针。Label 控件太宽而字太少的话,在没有字的地方,鼠标经过也会显示 手指的鼠标指针,不太好 这个控件不能设置可扩展的形式?
VB中可以的 我想label控件应该有这个属性吧 这个受字体(字形)、权值、大小等因素的影响,貌似无法精确计算,只能大概估算 _WinAPI_GetTextExtentPoint32() 貌似可以解决,我再研究下 楼主可以看下ListView其中的一个消息LVM_GETSTRINGWIDTH,计算字符串像素宽度,绝对可以实现的。 P版来了,什么都好解决了~~ 本帖最后由 yhxhappy 于 2010-8-3 10:18 编辑
P版说的我新手不明白,找了ListView的UDF,发现这个:
_GUICtrlListView_GetStringWidth($hWnd, $sString) 确定指定字符串的宽度
我试了发现在字符串是纯中文的情况下,宽度计算得很准确,但在中英文及标点混合的情况就偏差一些。#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
GUICreate("ListView Get String Width", 400, 150)
$hListView = GUICtrlCreateListView("", 2, 2, 394, 200, BitOR($LVS_SHOWSELALWAYS, $LVS_REPORT))
GUICtrlSetState(-1, $GUI_HIDE)
$txt = "测试字符串ABCDEabcde,.=\/@#$%12345"
$width = _GUICtrlListView_GetStringWidth($hListView, $txt)
GUISetState()
GUICtrlCreateLabel($txt, 20, 50, $width, 15)
GUICtrlSetBkColor(-1, 0xFFFFFF)
MsgBox(4160, "", "字符串'" & $txt &"' 的像素宽度: "& $width)
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
GUIDelete() 不知道这个 LVM_GETSTRINGWIDTH 是不是简单的利用全角字符为半角字符宽度两倍的原理,如果是这样那难免偏差。应该不是这样吧…
LZ的Label控件可调整的(字体、字形、权值等)范围比较大,_WinAPI_GetTextExtentPoint32()还是可以解决的。(先获取Label控件的字体)
我用这个函数已经可以获取到文本的宽与高了,等有时间抽空整理个调试界面出来。 12#的可行。。。 本帖最后由 yhxhappy 于 2010-8-3 22:45 编辑
回复 14# rikthhpgf2005
我在等afan更好的方法,我那个方法只能使用GUI默认的字体及字号,不能自定义字体、字号,甚至加粗也不行
页:
[1]
2