找回密码
 加入
搜索
楼主: cashiba

[系统综合] 一个困扰已久的问题:如何计算文本宽度?

 火.. [复制链接]
发表于 2016-4-16 13:49:20 | 显示全部楼层
本帖最后由 fuldho 于 2016-4-16 13:52 编辑

给定一段文本可以判断总宽,已知宽度判断容纳字符数有难度了

120宽度 W 只容纳9个 S 达到16个,


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2016-4-16 15:00:40 | 显示全部楼层
回复 1# cashiba
回复 16# fuldho

    ;这是要获取宽度的文字
Global $text="W"
Global $user32Dll=DllOpen("user32.dll")
GetTextWidthAndHeight($text)

Func GetTextWidthAndHeight($_text="")
        Local $_resultArray[2]=[-1,-1]
        If $_text="" Then Return $_resultArray
        Local $hdc = DllCall($user32Dll, "handle", "GetDC", "hwnd", 0)
        If @error Then Return $_resultArray
        $hdc = $hdc[0]
        ;构建一个Rect的结构体
        Local $tagRECT = "struct;long Left;long Top;long Right;long Bottom;endstruct"
        Local $tRect = DllStructCreate($tagRect)
        ;初始化结构体变量初始值
        DllStructSetData($tRect, "Left", 1)
        DllStructSetData($tRect, "Top", 1)
        DllStructSetData($tRect, "Right", 1)
        DllStructSetData($tRect, "Bottom", 1)
        ;获取结构体变量指针
        Local $pRect = DllStructGetPtr($tRect)
        ;定义字体格式
        Local $format = BitOR(1024, 32)
        ;输出文字到DC
        DllCall($user32Dll,"INT","DrawTextA","Int", $hdc,"Str",$text,"int",-1,"ptr",$pRect,"int",$format)
        If @error Then Return $_resultArray
        ;获取返回的Rect信息
        Local $right= DllStructGetData($tRect, "Right")
        Local $left = DllStructGetData($tRect, "Left")
        Local $top= DllStructGetData($tRect, "Top")
        Local $bottom = DllStructGetData($tRect, "Bottom")
        ConsoleWrite($right&@TAB&$left&@TAB&$top&@TAB&$bottom&@CRLF)
        ;计算宽度
        $_resultArray[0]=$right-$left
        ;计算高度
        $_resultArray[1]=$bottom-$top
        Return $_resultArray
EndFunc
发表于 2016-4-16 15:10:03 | 显示全部楼层
回复 17# lanfengc

6楼要求“给定的宽度能容纳下多少个字符”
发表于 2016-4-16 18:52:46 | 显示全部楼层
本帖最后由 afan 于 2016-4-16 18:54 编辑

忍不住说一句,这是2010年坛友提的类似问题…  
善用搜索不光只是简单的搜索,如何使用关键字也是智慧
发表于 2016-4-16 21:49:10 | 显示全部楼层
回复 18# fuldho


    获取某个字符的宽度. 然后用已知宽度除以 该字符的宽度
发表于 2016-4-16 22:22:42 | 显示全部楼层
本帖最后由 fuldho 于 2016-4-16 22:27 编辑

回复 20# lanfengc

16楼的 字符串不可能是单一的字符,在未知字符串之前120宽度到底可以容纳字符是多少个?
 楼主| 发表于 2016-4-17 11:42:25 | 显示全部楼层
回复  lanfengc
16楼的 字符串不可能是单一的字符,在未知字符串之前120宽度到底可以容纳字符是多少个? ...
fuldho 发表于 2016-4-16 22:22
只要有计算字符宽度的函数或函数组合,可以用stringmid函数将一段文本拆解计算单字符宽,然后累加字符数和字符宽,应该可以判断能容纳的字符数了吧
 楼主| 发表于 2016-4-17 12:48:11 | 显示全部楼层

计算字符宽度的目的之一,如上图,
Excel表或类似的数据表格,有时列数比较多,每个列各行的数据字符数有多有少,每列的列宽跟最多字符数行的宽度也不匹配。
在满屏的情况下,想尽可能的规整和美观的呈现数据,尽量减少使用横向滚动条的话,一般需要满足下面的条件:

1、所有列都在屏幕范围内,也就是总列宽=屏幕宽度

   每一列中,以字符数最多的行,其字符总宽度为该列最适宜列宽
2、最适宜列宽短的列,尽可能在一行内显示每行的完整数据
3、最适宜列宽长的列,尽可能多的显示每一行的数据

即达到下图效果


首先是需要计算字符宽度,然后是有几个因变量互相关联,一直难以达到效果,所以造成困扰。
ACN的大侠大神们肯定有办法....

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2016-4-17 16:03:03 | 显示全部楼层
回复 23# cashiba

字符串是已知的使用10楼的
    _WinAPI_GetTextExtentPoint32可以得到
 楼主| 发表于 2016-4-17 21:20:53 | 显示全部楼层
回复  cashiba

字符串是已知的使用10楼的
    _WinAPI_GetTextExtentPoint32可以得到
fuldho 发表于 2016-4-17 16:03
23楼的问题,fuldho老师看看,该怎样根据每列的最长文本宽度来重新设置各列的最适合列宽?

$j--------------------列序数,从1到$n,最后一列为$n
$w_col($j)---------每列的原列宽
$w_str($j)---------用_WinAPI_GetTextExtentPoint32计算得到的每列的所有行中最长文本的宽度
@desktopwidth---屏幕宽度
发表于 2016-4-19 15:01:11 | 显示全部楼层
帮顶了,找到计算方法了吗?
发表于 2016-4-20 17:26:09 | 显示全部楼层
楼主的问题,我想是不是可以用等宽字体避免
 楼主| 发表于 2016-4-21 20:34:52 | 显示全部楼层
楼主的问题,我想是不是可以用等宽字体避免
piku 发表于 2016-4-20 17:26
计算文本宽度的最终目的,是想解决23楼的问题-----表格如何以最适宜列宽满屏呈现各列数据
发表于 2016-4-21 23:52:46 | 显示全部楼层
回复 28# cashiba


    表格不是有一项”最适合列宽“吗?(显然我的回答不是你想要的...)
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-22 22:08 , Processed in 0.147737 second(s), 14 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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