#include <array.au3>
#include <StaticConstants.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WINAPI.au3>
#include <sendmessage.au3>
#Region ### START Koda GUI section ### Form=
#NoTrayIcon
HotKeySet("ESC", "_Exit")
Local $String='这里是可变内容'&@CRLF&'这里是第二行'&@CRLF&'这里是第三行'&@CRLF&'这里是第四行'
$a=_stringSize($String,18,800,6,'宋体');待测试字符串,字体大小,字体重量(400 =缺省值),字体属性,字体名字
$form1 = GUICreate("form1", $a[2],$a[3] ,@DesktopWidth-$a[2],@DesktopHeight-$a[3]-30,BitOR($WS_POPUP, $WS_EX_TOPMOST),$WS_EX_LAYERED,WinGetHandle(AutoItWinGetTitle()))
GUIctrlSetBkColor(-1,0xABCDEF)
GUICtrlCreateLabel($String,0,0,$a[2],$a[3])
GUICtrlSetFont(-1,18,800,6,'宋体');这里参数和_stringsize()参数保持一致
GUIctrlSetBkColor(-1,0xABCDEF)
_WinAPI_SetLayeredWindowAttributes($form1, 0xABCDEF)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
WinSetOnTop($form1,"form1",1)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $GUI_EVENT_PRIMARYDOWN
_SendMessage($form1, $WM_SYSCOMMAND, 0xF012, 0)
EndSwitch
WEnd
GUIDelete($form1)
Exit
Func _Exit()
Exit
EndFunc
#include-once
Func _StringSize($sText, $iSize = Default, $iWeight = Default, $iAttrib = Default, $sName = Default, $iWidth = 0)
Local $avSize_Info[4], $aRet, $iLine_Width = 0, $iLast_Word, $iWrap_Count
Local $hLabel_Handle, $hFont, $hDC, $oFont, $tSize = DllStructCreate("int X;int Y")
If Number($sName) = -1 Then $sName=""
If Not IsString($sText) Then Return SetError(1, 1, 0)
If Not IsNumber($iSize) And $iSize <> Default Then Return SetError(1, 2, 0)
If Not IsInt($iWeight) And $iWeight <> Default Then Return SetError(1, 3, 0)
If Not IsInt($iAttrib) And $iAttrib <> Default Then Return SetError(1, 4, 0)
If Not IsString($sName) And $sName <> Default Then Return SetError(1, 5, 0)
If Not IsNumber($iWidth) Then Return SetError(1, 6, 0)
Local $hGUI = GUICreate("", 1200, 500, 10, 10)
If $hGUI = 0 Then Return SetError(2, 0, 0)
GUISetFont($iSize, $iWeight, $iAttrib, $sName)
$avSize_Info[0] = $sText
If StringInStr($sText, @CRLF) = 0 Then StringRegExpReplace($sText, "[\x0a|\x0d]", @CRLF)
Local $asLines = StringSplit($sText, @CRLF, 1)
Local $hText_Label = GUICtrlCreateLabel($sText, 10, 10)
Local $aiPos = ControlGetPos($hGUI, "", $hText_Label)
GUISetState(@SW_HIDE)
GUICtrlDelete($hText_Label)
$avSize_Info[1] = ($aiPos[3] - 8)/ $asLines[0]
$avSize_Info[2] = $aiPos[2]
$avSize_Info[3] = $aiPos[3] - 4
If $aiPos[2] > $iWidth And $iWidth > 0 Then
$avSize_Info[0] = ""
$avSize_Info[2] = $iWidth
Local $iLine_Count = 0
For $j = 1 To $asLines[0]
$hText_Label = GUICtrlCreateLabel($asLines[$j], 10, 10)
$aiPos = ControlGetPos($hGUI, "", $hText_Label)
GUICtrlDelete($hText_Label)
If $aiPos[2] < $iWidth Then
$iLine_Count += 1
$avSize_Info[0] &= $asLines[$j] & @CRLF
Else
$hText_Label = GUICtrlCreateLabel("", 0, 0)
$hLabel_Handle = ControlGetHandle($hGui, "", $hText_Label)
$aRet = DllCall("User32.dll", "hwnd", "GetDC", "hwnd", $hLabel_Handle)
If @error Then _StringSize_Error(3, 1, $hLabel_Handle, 0, $hGUI)
$hDC = $aRet[0]
$aRet = DllCall("user32.dll", "lparam", "SendMessage", "hwnd", $hLabel_Handle, "int", 0x0031, "wparam", 0, "lparam", 0) ; $WM_GetFont
If @error Then _StringSize_Error(3, 2, $hLabel_Handle, $hDC, $hGUI)
$hFont = $aRet[0]
$aRet = DllCall("GDI32.dll", "hwnd", "SelectObject", "hwnd", $hDC, "hwnd", $hFont)
If @error Then _StringSize_Error(3, 3, $hLabel_Handle, $hDC, $hGUI)
$oFont = $aRet[0]
If $oFont = 0 Then _StringSize_Error(3, 4, $hLabel_Handle, $hDC, $hGUI)
$iWrap_Count = 0
While 1
$iLine_Width = 0
$iLast_Word = 0
For $i = 1 To StringLen($asLines[$j])
If StringMid($asLines[$j], $i, 1) = " " Then $iLast_Word = $i - 1
Local $sTest_Line = StringMid($asLines[$j], 1, $i)
GUICtrlSetData($hText_Label, $sTest_Line)
$iSize = StringLen($sTest_Line)
DllCall("GDI32.dll", "int", "GetTextExtentPoint32", "hwnd", $hDC, "str", $sTest_Line, "int", $iSize, "ptr", DllStructGetPtr($tSize))
If @error Then _StringSize_Error(3, 5, $hLabel_Handle, $hDC, $hGUI)
$iLine_Width = DllStructGetData($tSize, "X")
If $iLine_Width >= $iWidth - Int($iSize / 2) Then ExitLoop
Next
If $i > StringLen($asLines[$j]) Then
$iWrap_Count += 1
$avSize_Info[0] &= $sTest_Line & @CRLF
ExitLoop
Else
$iWrap_Count += 1
If $iLast_Word = 0 Then
_StringSize_Error(4, 0, $hLabel_Handle, $hDC, $hGUI)
EndIf
$avSize_Info[0] &= StringLeft($sTest_Line, $iLast_Word) & @CRLF
$asLines[$j] = StringTrimLeft($asLines[$j], $iLast_Word)
$asLines[$j] = StringStripWS($asLines[$j], 1)
EndIf
WEnd
$iLine_Count += $iWrap_Count
DllCall("User32.dll", "int", "ReleaseDC", "hwnd", $hLabel_Handle, "hwnd", $hDC)
If @error Then _StringSize_Error(3, 6, $hLabel_Handle, $hDC, $hGUI)
GUICtrlDelete($hText_Label)
EndIf
Next
$avSize_Info[3] = ($iLine_Count * $avSize_Info[1]) + 4
EndIf
GUIDelete($hGUI)
Return $avSize_Info
EndFunc ; => _StringSize
Func _StringSize_Error($iError, $iExtended, $hLabel_Handle, $hDC, $hGUI)
DllCall("User32.dll", "int", "ReleaseDC", "hwnd", $hLabel_Handle, "hwnd", $hDC)
GUIDelete($hGUI)
Return SetError($iError, $iExtended, 0)
EndFunc ; => _StringSize_Error
|