给定一段文本可以判断总宽,已知宽度判断容纳字符数有难度了
120宽度 W 只容纳9个 S 达到16个,
回复 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
回复 17# lanfengc
6楼要求“给定的宽度能容纳下多少个字符” 本帖最后由 afan 于 2016-4-16 18:54 编辑
忍不住说一句,这是2010年坛友提的类似问题…
善用搜索不光只是简单的搜索,如何使用关键字也是智慧 回复 18# fuldho
获取某个字符的宽度. 然后用已知宽度除以 该字符的宽度 本帖最后由 fuldho 于 2016-4-16 22:27 编辑
回复 20# lanfengc
16楼的 字符串不可能是单一的字符,在未知字符串之前120宽度到底可以容纳字符是多少个? 回复lanfengc
16楼的 字符串不可能是单一的字符,在未知字符串之前120宽度到底可以容纳字符是多少个? ...
fuldho 发表于 2016-4-16 22:22 http://www.autoitx.com/images/common/back.gif只要有计算字符宽度的函数或函数组合,可以用stringmid函数将一段文本拆解计算单字符宽,然后累加字符数和字符宽,应该可以判断能容纳的字符数了吧
计算字符宽度的目的之一,如上图,
Excel表或类似的数据表格,有时列数比较多,每个列各行的数据字符数有多有少,每列的列宽跟最多字符数行的宽度也不匹配。
在满屏的情况下,想尽可能的规整和美观的呈现数据,尽量减少使用横向滚动条的话,一般需要满足下面的条件:
1、所有列都在屏幕范围内,也就是总列宽=屏幕宽度
每一列中,以字符数最多的行,其字符总宽度为该列最适宜列宽
2、最适宜列宽短的列,尽可能在一行内显示每行的完整数据
3、最适宜列宽长的列,尽可能多的显示每一行的数据
即达到下图效果
首先是需要计算字符宽度,然后是有几个因变量互相关联,一直难以达到效果,所以造成困扰。
ACN的大侠大神们肯定有办法.... 回复 23# cashiba
字符串是已知的使用10楼的
_WinAPI_GetTextExtentPoint32可以得到 回复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---屏幕宽度 帮顶了,找到计算方法了吗? 楼主的问题,我想是不是可以用等宽字体避免 楼主的问题,我想是不是可以用等宽字体避免
piku 发表于 2016-4-20 17:26 http://www.autoitx.com/images/common/back.gif计算文本宽度的最终目的,是想解决23楼的问题-----表格如何以最适宜列宽满屏呈现各列数据 回复 28# cashiba
表格不是有一项”最适合列宽“吗?(显然我的回答不是你想要的...)
页:
1
[2]