fuldho 发表于 2016-4-16 13:49:20

本帖最后由 fuldho 于 2016-4-16 13:52 编辑

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

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


lanfengc 发表于 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=[-1,-1]
        If $_text="" Then Return $_resultArray
        Local $hdc = DllCall($user32Dll, "handle", "GetDC", "hwnd", 0)
        If @error Then Return $_resultArray
        $hdc = $hdc
        ;构建一个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=$right-$left
        ;计算高度
        $_resultArray=$bottom-$top
        Return $_resultArray
EndFunc

fuldho 发表于 2016-4-16 15:10:03

回复 17# lanfengc

6楼要求“给定的宽度能容纳下多少个字符”

afan 发表于 2016-4-16 18:52:46

本帖最后由 afan 于 2016-4-16 18:54 编辑

忍不住说一句,这是2010年坛友提的类似问题…
善用搜索不光只是简单的搜索,如何使用关键字也是智慧

lanfengc 发表于 2016-4-16 21:49:10

回复 18# fuldho


    获取某个字符的宽度. 然后用已知宽度除以 该字符的宽度

fuldho 发表于 2016-4-16 22:22:42

本帖最后由 fuldho 于 2016-4-16 22:27 编辑

回复 20# lanfengc

16楼的 字符串不可能是单一的字符,在未知字符串之前120宽度到底可以容纳字符是多少个?

cashiba 发表于 2016-4-17 11:42:25

回复lanfengc
16楼的 字符串不可能是单一的字符,在未知字符串之前120宽度到底可以容纳字符是多少个? ...
fuldho 发表于 2016-4-16 22:22 http://www.autoitx.com/images/common/back.gif只要有计算字符宽度的函数或函数组合,可以用stringmid函数将一段文本拆解计算单字符宽,然后累加字符数和字符宽,应该可以判断能容纳的字符数了吧

cashiba 发表于 2016-4-17 12:48:11


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

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

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

即达到下图效果


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

fuldho 发表于 2016-4-17 16:03:03

回复 23# cashiba

字符串是已知的使用10楼的
    _WinAPI_GetTextExtentPoint32可以得到

cashiba 发表于 2016-4-17 21:20:53

回复cashiba

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

$j--------------------列序数,从1到$n,最后一列为$n
$w_col($j)---------每列的原列宽
$w_str($j)---------用_WinAPI_GetTextExtentPoint32计算得到的每列的所有行中最长文本的宽度
@desktopwidth---屏幕宽度

雨林GG 发表于 2016-4-19 15:01:11

帮顶了,找到计算方法了吗?

piku 发表于 2016-4-20 17:26:09

楼主的问题,我想是不是可以用等宽字体避免

cashiba 发表于 2016-4-21 20:34:52

楼主的问题,我想是不是可以用等宽字体避免
piku 发表于 2016-4-20 17:26 http://www.autoitx.com/images/common/back.gif计算文本宽度的最终目的,是想解决23楼的问题-----表格如何以最适宜列宽满屏呈现各列数据

chamlien 发表于 2016-4-21 23:52:46

回复 28# cashiba


    表格不是有一项”最适合列宽“吗?(显然我的回答不是你想要的...)
页: 1 [2]
查看完整版本: 一个困扰已久的问题:如何计算文本宽度?