找回密码
 加入
搜索
查看: 13858|回复: 17

[GUI管理] [已解决]如何计算 字符串 在 Label 占用的像素宽度

 火.. [复制链接]
发表于 2010-8-2 17:26:16 | 显示全部楼层 |阅读模式
本帖最后由 yhxhappy 于 2010-11-8 19:02 编辑

如题。
我想要创建一个Label控件,然后点击该控件时触发操作,但Label上文本不固定,如果Label宽度固定的话,字符少了,会有空的位置,点击空的位置也会触发操作。
所以我想先计算字符串的长度,再根据长度来设置Label控件的宽度
曾经考虑过计算字节数再乘以一定的值,但行不通,因为要考虑中英文的宽度差别,而且不同英文字母在不同的字体下宽度也不固定。
自己看了帮助,发现这个:
_WinAPI_GetTextExtentPoint32($hDC, $sText) 计算指定字符串文本的宽度和高度
不知道这个行不行,$hDC(设备场景标识)不知道该填什么。
还望各位大大能指点一下
发表于 2010-8-2 17:30:23 | 显示全部楼层
你只能用字符串查有多少,再估计一个有多少来算
 楼主| 发表于 2010-8-2 18:01:30 | 显示全部楼层
回复 2# rikthhpgf2005


    之前也这么想过,但想求一个精确一点的值。
    像i和w这两个字母的宽度就明显不同,还有大写和小写也差很多,再加上标点符号,计算起来就复杂了
发表于 2010-8-2 19:02:01 | 显示全部楼层
Label控件不会没有吧,点击原点附近的不行么?
 楼主| 发表于 2010-8-2 19:13:54 | 显示全部楼层
回复 4# xyold1


    我还给Label 设置了鼠标指针,鼠标经过控件时显示手型的鼠标指针。Label 控件太宽而字太少的话,在没有字的地方,鼠标经过也会显示 手指的鼠标指针,不太好
发表于 2010-8-2 19:16:21 | 显示全部楼层
这个控件不能设置可扩展的形式?
VB中可以的
发表于 2010-8-2 19:22:11 | 显示全部楼层
我想label控件应该有这个属性吧
发表于 2010-8-2 20:15:14 | 显示全部楼层
这个受字体(字形)、权值、大小等因素的影响,貌似无法精确计算,只能大概估算
发表于 2010-8-2 21:45:30 | 显示全部楼层
_WinAPI_GetTextExtentPoint32() 貌似可以解决,我再研究下
发表于 2010-8-2 21:54:40 | 显示全部楼层
楼主可以看下ListView其中的一个消息LVM_GETSTRINGWIDTH,计算字符串像素宽度,绝对可以实现的。
发表于 2010-8-2 21:56:39 | 显示全部楼层
P版来了,什么都好解决了~~
 楼主| 发表于 2010-8-3 09:01:36 | 显示全部楼层
本帖最后由 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()
发表于 2010-8-3 10:08:19 | 显示全部楼层
不知道这个 LVM_GETSTRINGWIDTH 是不是简单的利用全角字符为半角字符宽度两倍的原理,如果是这样那难免偏差。应该不是这样吧…
LZ的Label控件可调整的(字体、字形、权值等)范围比较大,_WinAPI_GetTextExtentPoint32()还是可以解决的。(先获取Label控件的字体)
我用这个函数已经可以获取到文本的宽与高了,等有时间抽空整理个调试界面出来。
发表于 2010-8-3 17:14:51 | 显示全部楼层
12#的可行。。。
 楼主| 发表于 2010-8-3 22:42:45 | 显示全部楼层
本帖最后由 yhxhappy 于 2010-8-3 22:45 编辑

回复 14# rikthhpgf2005


    我在等afan更好的方法,我那个方法只能使用GUI默认的字体及字号,不能自定义字体、字号,甚至加粗也不行
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-15 07:43 , Processed in 0.077986 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表