yhxhappy 发表于 2012-5-31 23:31:08

如何取得 Label 中字符的行数?[已解决]

本帖最后由 yhxhappy 于 2012-6-2 16:03 编辑

如下图,当Label中的字符过多时,会转下一行。


我能取得字符的全长(像素宽度),但用这个宽度除以Label的宽度显然行不通。
现我想知道Label占用了几行,大家帮看看!#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Local $Text = "Object-oriented GUI graphical storage management software, it can achieve the MegaRAID storage array of local, remote monitoring, configuration and management."

GUICreate("我的 GUI") ; 创建居中显示的 GUI 窗口
GUICtrlCreateLabel($Text, 10, 10, 200, 100)
GUICtrlSetBkColor(-1, 0x1c9fe3)
GUICtrlSetColor(-1, 0xffffff)

GUISetState(@SW_SHOW) ; 显示一个空白的窗口

    ; 运行 GUI, 直到 GUI 被关闭
While 1
        $msg = GUIGetMsg()
        If $msg = $GUI_EVENT_CLOSE Then Exit
WEnd感谢大家的帮助,在4楼写的脚本基本能实现我要的功能了。

sdc7 发表于 2012-6-1 08:43:11

可以那种不是由换行符组成的 否则你可以检查换行符的个数来确定·

netegg 发表于 2012-6-1 21:38:33

本帖最后由 netegg 于 2012-6-1 21:41 编辑

大概思路有,实现可能很麻烦,获取控件的大小,以控件创建场景,用_GDIPlus_GraphicsMeasureCharacterRanges获取包含全部字符的上下界的矩形,获取字体的高度,行间距,计算

yhxhappy 发表于 2012-6-2 01:40:28

回复 3# netegg

多谢 netegg 的提醒,参照_GDIPlus_GraphicsMeasureCharacterRanges的示例,可以取得行数了,但发现识别时如果有某一行的字符太靠近label边缘,则识别结果会多一行。#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
#include <Array.au3>
#include <StaticConstants.au3>


Local $sString = "Object-oriented GUI graphical xxxxx storage management software, it can achieve the MegaRAID storage array of local, remote monitoring, configuration and management.>>"
Local $LabelW = 200;, $LabelH = 300

$hGUI = GUICreate("我的 GUI") ; 创建居中显示的 GUI 窗口

$LabelLine = _GetLabelLine($hGUI, $sString, $LabelW, 9, 0, "Arial")

GUICtrlCreateLabel($sString, 10, 10, $LabelW, $LabelLine*15)
        GUICtrlSetBkColor(-1, 0x1c9fe3)
        GUICtrlSetColor(-1, 0xffffff)
        GUICtrlSetFont(-1, 9, 400, 0, "Arial")
GUICtrlCreateLabel("字符串占用的行数: " & $LabelLine, $LabelW+30, 20, 200, 50)

GUISetState(@SW_SHOW) ; 显示一个空白的窗口

; 运行 GUI, 直到 GUI 被关闭
While 1
        $msg = GUIGetMsg()
        If $msg = $GUI_EVENT_CLOSE Then Exit
WEnd

Func _GetLabelLine($hWnd, $sString, $LabelW, $FSize, $FStyle, $FName)
        _GDIPlus_Startup()
        $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $hFormat = _GDIPlus_StringFormatCreate()
    $hFamily = _GDIPlus_FontFamilyCreate($FName)
    $hFont = _GDIPlus_FontCreate($hFamily, $FSize, $FStyle)
    $tLayout = _GDIPlus_RectFCreate(0, 0, $LabelW, 0)
    $aInfo = _GDIPlus_GraphicsMeasureString($hGraphic, $sString, $hFont, $tLayout, $hFormat)

        _GDIPlus_FontDispose($hFont)
        _GDIPlus_FontFamilyDispose($hFamily)
        _GDIPlus_StringFormatDispose($hFormat)
        _GDIPlus_GraphicsDispose($hGraphic)
        _GDIPlus_Shutdown()

        If IsArray($aInfo) Then
                Return $aInfo
        Else
                Return 0
        EndIf
EndFunc

3mile 发表于 2012-6-2 08:10:22

应该是类似这里
http://www.autoitx.com/forum.php?mod=viewthread&tid=25623&fromuid=7639113
页: [1]
查看完整版本: 如何取得 Label 中字符的行数?[已解决]