找回密码  加入

AUTOIT CN

搜索
查看: 21958|回复: 29

[特效] 官网 GUI 脚本,应该可以作为托盘提示使用,但汉化后显示失常,有兴趣的看看!!

[复制链接]
发表于 2010-8-12 20:14:28 | 显示全部楼层 |阅读模式
本帖最后由 131738 于 2010-8-14 21:16 编辑

无任何包含文件,文件名:Toast_Example_Obfuscated.au3.au3

Toast 这个词词霸解释为 吐司、面包、祝酒;尽是吃的东西,真不知这个词是如何与这个脚本内容联系起来的!!!

继续往下看,超版 afan 以做了修改。
  1. Func _StringSize($sText, $iSize = Default, $iWeight = Default, $iAttrib = Default, $sName = Default, $iWidth = 0)
  2.         Local $avSize_Info[4], $aRet, $iLine_Width = 0, $iLast_Word, $iWrap_Count
  3.         Local $hLabel_Handle, $hFont, $hDC, $oFont, $tSize = DllStructCreate("int X;int Y")
  4.         If Not IsString($sText) Then Return SetError(1, 1, 0)
  5.         If Not IsNumber($iSize) And $iSize <> Default Then Return SetError(1, 2, 0)
  6.         If Not IsInt($iWeight) And $iWeight <> Default Then Return SetError(1, 3, 0)
  7.         If Not IsInt($iAttrib) And $iAttrib <> Default Then Return SetError(1, 4, 0)
  8.         If Not IsString($sName) And $sName <> Default Then Return SetError(1, 5, 0)
  9.         If Not IsNumber($iWidth) Then Return SetError(1, 6, 0)
  10.         Local $hGUI = GUICreate("", 1200, 500, 10, 10)
  11.         If $hGUI = 0 Then Return SetError(2, 0, 0)
  12.         GUISetFont($iSize, $iWeight, $iAttrib, $sName)
  13.         $avSize_Info[0] = $sText
  14.         If StringInStr($sText, @CRLF) = 0 Then StringRegExpReplace($sText, "[\x0a|\x0d]", @CRLF)
  15.         Local $asLines = StringSplit($sText, @CRLF, 1)
  16.         Local $hText_Label = GUICtrlCreateLabel($sText, 10, 10)
  17.         Local $aiPos = ControlGetPos($hGUI, "", $hText_Label)
  18.         GUISetState(@SW_HIDE)
  19.         GUICtrlDelete($hText_Label)
  20.         $avSize_Info[1] = ($aiPos[3] - 8) / $asLines[0]
  21.         $avSize_Info[2] = $aiPos[2]
  22.         $avSize_Info[3] = $aiPos[3] - 4
  23.         If $aiPos[2] > $iWidth And $iWidth > 0 Then
  24.                 $avSize_Info[0] = ""
  25.                 $avSize_Info[2] = $iWidth
  26.                 Local $iLine_Count = 0
  27.                 For $j = 1 To $asLines[0]
  28.                         $hText_Label = GUICtrlCreateLabel($asLines[$j], 10, 10)
  29.                         $aiPos = ControlGetPos($hGUI, "", $hText_Label)
  30.                         GUICtrlDelete($hText_Label)
  31.                         If $aiPos[2] < $iWidth Then
  32.                                 $iLine_Count += 1
  33.                                 $avSize_Info[0] &= $asLines[$j] & @CRLF
  34.                         Else
  35.                                 $hText_Label = GUICtrlCreateLabel("", 0, 0)
  36.                                 $hLabel_Handle = ControlGetHandle($hGUI, "", $hText_Label)
  37.                                 $aRet = DllCall("User32.dll", "hwnd", "GetDC", "hwnd", $hLabel_Handle)
  38.                                 If @error Then _StringSize_Error(3, 1, $hLabel_Handle, 0, $hGUI)
  39.                                 $hDC = $aRet[0]
  40.                                 $aRet = DllCall("user32.dll", "lparam", "SendMessage", "hwnd", $hLabel_Handle, "int", 0x0031, "wparam", 0, "lparam", 0)
  41.                                 If @error Then _StringSize_Error(3, 2, $hLabel_Handle, $hDC, $hGUI)
  42.                                 $hFont = $aRet[0]
  43.                                 $aRet = DllCall("GDI32.dll", "hwnd", "SelectObject", "hwnd", $hDC, "hwnd", $hFont)
  44.                                 If @error Then _StringSize_Error(3, 3, $hLabel_Handle, $hDC, $hGUI)
  45.                                 $oFont = $aRet[0]
  46.                                 If $oFont = 0 Then _StringSize_Error(3, 4, $hLabel_Handle, $hDC, $hGUI)
  47.                                 $iWrap_Count = 0
  48.                                 While 1
  49.                                         $iLine_Width = 0
  50.                                         $iLast_Word = 0
  51.                                         For $i = 1 To StringLen($asLines[$j])
  52.                                                 If StringMid($asLines[$j], $i, 1) = " " Then $iLast_Word = $i - 1
  53.                                                 Local $sTest_Line = StringMid($asLines[$j], 1, $i)
  54.                                                 GUICtrlSetData($hText_Label, $sTest_Line)
  55.                                                 $iSize = StringLen($sTest_Line)
  56.                                                 DllCall("GDI32.dll", "int", "GetTextExtentPoint32", "hwnd", $hDC, "str", $sTest_Line, "int", $iSize, "ptr", DllStructGetPtr($tSize))
  57.                                                 If @error Then _StringSize_Error(3, 5, $hLabel_Handle, $hDC, $hGUI)
  58.                                                 $iLine_Width = DllStructGetData($tSize, "X")
  59.                                                 If $iLine_Width >= $iWidth - Int($iSize / 2) Then ExitLoop
  60.                                         Next
  61.                                         If $i > StringLen($asLines[$j]) Then
  62.                                                 $iWrap_Count += 1
  63.                                                 $avSize_Info[0] &= $sTest_Line & @CRLF
  64.                                                 ExitLoop
  65.                                         Else
  66.                                                 $iWrap_Count += 1
  67.                                                 If $iLast_Word = 0 Then
  68.                                                         _StringSize_Error(4, 0, $hLabel_Handle, $hDC, $hGUI)
  69.                                                 EndIf
  70.                                                 $avSize_Info[0] &= StringLeft($sTest_Line, $iLast_Word) & @CRLF
  71.                                                 $asLines[$j] = StringTrimLeft($asLines[$j], $iLast_Word)
  72.                                                 $asLines[$j] = StringStripWS($asLines[$j], 1)
  73.                                         EndIf
  74.                                 WEnd
  75.                                 $iLine_Count += $iWrap_Count
  76.                                 DllCall("User32.dll", "int", "ReleaseDC", "hwnd", $hLabel_Handle, "hwnd", $hDC)
  77.                                 If @error Then _StringSize_Error(3, 6, $hLabel_Handle, $hDC, $hGUI)
  78.                                 GUICtrlDelete($hText_Label)
  79.                         EndIf
  80.                 Next
  81.                 $avSize_Info[3] = ($iLine_Count * $avSize_Info[1]) + 4
  82.         EndIf
  83.         GUIDelete($hGUI)
  84.         Return $avSize_Info
  85. EndFunc   ;==>_StringSize
  86. Func _StringSize_Error($iError, $iExtended, $hLabel_Handle, $hDC, $hGUI)
  87.         DllCall("User32.dll", "int", "ReleaseDC", "hwnd", $hLabel_Handle, "hwnd", $hDC)
  88.         GUIDelete($hGUI)
  89.         Return SetError($iError, $iExtended, 0)
  90. EndFunc   ;==>_StringSize_Error
  91. Global $iDef_Toast_Font_Size = _Toast_GetDefFont(0)
  92. Global $sDef_Toast_Font_Name = _Toast_GetDefFont(1)
  93. Global $hToast_Handle = 0
  94. Global $hToast_Close_X = 9999
  95. Global $iToast_Move = 0
  96. Global $iToast_Style = 1
  97. Global $aRet = DllCall("User32.dll", "int", "GetSysColor", "int", 8)
  98. Global $iToast_Header_BkCol = $aRet[0]
  99. $aRet = DllCall("User32.dll", "int", "GetSysColor", "int", 5)
  100. Global $iToast_Header_Col = $aRet[0]
  101. Global $iToast_Message_BkCol = $iToast_Header_Col
  102. Global $iToast_Message_Col = $iToast_Header_BkCol
  103. Global $iToast_Font_Size = $iDef_Toast_Font_Size
  104. Global $sToast_Font_Name = $sDef_Toast_Font_Name
  105. Global $iToast_Timer = 0
  106. Global $iToast_Start = 0
  107. Global $fToast_Close = False
  108. Func _Toast_Set($vJust, $iHdr_BkCol = -1, $iHdr_Col = -1, $iMsg_BkCol = -1, $iMsg_Col = -1, $iFont_Size = -1, $sFont_Name = "")
  109.         Switch $vJust
  110.                 Case Default
  111.                         $iToast_Style = 1
  112.                         $aRet = DllCall("User32.dll", "int", "GetSysColor", "int", 8)
  113.                         $iToast_Header_BkCol = $aRet[0]
  114.                         $aRet = DllCall("User32.dll", "int", "GetSysColor", "int", 5)
  115.                         $iToast_Header_Col = $aRet[0]
  116.                         $iToast_Message_BkCol = $iToast_Header_Col
  117.                         $iToast_Message_Col = $iToast_Header_BkCol
  118.                         $sToast_Font_Name = $sDef_Toast_Font_Name
  119.                         $iToast_Font_Size = $iDef_Toast_Font_Size
  120.                         Return
  121.                 Case 0, 1, 2, 4, 5, 6
  122.                         $iToast_Style = $vJust
  123.                 Case -1
  124.                 Case Else
  125.                         Return SetError(1, 1, 0)
  126.         EndSwitch
  127.         Switch $iHdr_BkCol
  128.                 Case Default
  129.                         $aRet = DllCall("User32.dll", "int", "GetSysColor", "int", 8)
  130.                         $iToast_Header_BkCol = $aRet[0]
  131.                 Case 0 To 0xFFFFFF
  132.                         $iToast_Header_BkCol = Int($iHdr_BkCol)
  133.                 Case -1
  134.                 Case Else
  135.                         Return SetError(1, 2, 0)
  136.         EndSwitch
  137.         Switch $iHdr_Col
  138.                 Case Default
  139.                         $aRet = DllCall("User32.dll", "int", "GetSysColor", "int", 5)
  140.                         $iToast_Header_Col = $aRet[0]
  141.                 Case 0 To 0xFFFFFF
  142.                         $iToast_Header_Col = Int($iHdr_Col)
  143.                 Case -1
  144.                 Case Else
  145.                         Return SetError(1, 3, 0)
  146.         EndSwitch
  147.         Switch $iMsg_BkCol
  148.                 Case Default
  149.                         $aRet = DllCall("User32.dll", "int", "GetSysColor", "int", 8)
  150.                         $iToast_Message_BkCol = $aRet[0]
  151.                 Case 0 To 0xFFFFFF
  152.                         $iToast_Message_BkCol = Int($iMsg_BkCol)
  153.                 Case -1
  154.                 Case Else
  155.                         Return SetError(1, 4, 0)
  156.         EndSwitch
  157.         Switch $iMsg_Col
  158.                 Case Default
  159.                         $aRet = DllCall("User32.dll", "int", "GetSysColor", "int", 8)
  160.                         $iToast_Message_Col = $aRet[0]
  161.                 Case 0 To 0xFFFFFF
  162.                         $iToast_Message_Col = Int($iMsg_Col)
  163.                 Case -1
  164.                 Case Else
  165.                         Return SetError(1, 5, 0)
  166.         EndSwitch
  167.         Switch $iFont_Size
  168.                 Case Default
  169.                         $iToast_Font_Size = $iDef_Toast_Font_Size
  170.                 Case 8 To 72
  171.                         $iToast_Font_Size = Int($iFont_Size)
  172.                 Case -1
  173.                 Case Else
  174.                         Return SetError(1, 6, 0)
  175.         EndSwitch
  176.         Switch $sFont_Name
  177.                 Case Default
  178.                         $sToast_Font_Name = $sDef_Toast_Font_Name
  179.                 Case ""
  180.                 Case Else
  181.                         If IsString($sFont_Name) Then
  182.                                 $sToast_Font_Name = $sFont_Name
  183.                         Else
  184.                                 Return SetError(1, 7, 0)
  185.                         EndIf
  186.         EndSwitch
  187.         Return 1
  188. EndFunc   ;==>_Toast_Set
  189. Func _Toast_Show($sTitle, $sMessage, $iDelay = 0, $fWait = True)
  190.         Local $nOldOpt = Opt('GUIOnEventMode', 0)
  191.         If $hToast_Handle <> 0 Then _Toast_Hide()
  192.         $hToast_Close_X = 9999
  193.         Local $iToast_Width_max = 500
  194.         Local $iToast_Width_min = 150
  195.         Local $aLabel_Pos = _StringSize($sMessage, $iToast_Font_Size, Default, Default, $sToast_Font_Name, $iToast_Width_max - 20)
  196.         $sMessage = $aLabel_Pos[0]
  197.         Local $iLine_Height = $aLabel_Pos[1]
  198.         Local $iLabelwidth = $aLabel_Pos[2]
  199.         Local $iLabelheight = $aLabel_Pos[3]
  200.         Local $iToast_Width = $iLabelwidth + 20
  201.         If $iToast_Width < $iToast_Width_min Then
  202.                 $iToast_Width = $iToast_Width_min
  203.                 $iLabelwidth = $iToast_Width_min - 20
  204.         EndIf
  205.         Local $iTitle_Height = 0
  206.         If $sTitle = "" Then
  207.                 If $iDelay < 0 Then $iTitle_Height = 5
  208.         Else
  209.                 $iTitle_Height = $iLine_Height + 2
  210.                 If $iDelay < 0 Then
  211.                         If $iTitle_Height < 17 Then $iTitle_Height = 17
  212.                 EndIf
  213.         EndIf
  214.         Local $iToast_Height = $iLabelheight + $iTitle_Height + 20
  215.         Local $aToast_Data = _Toast_Locate($iToast_Width, $iToast_Height)
  216.         $hToast_Handle = GUICreate("", $iToast_Width, $iToast_Height, $aToast_Data[0], $aToast_Data[1], 0x80880000, BitOR(0x00000080, 0x00000008))
  217.         If @error Then
  218.                 $nOldOpt = Opt('GUIOnEventMode', $nOldOpt)
  219.                 Return SetError(1, 0, -1)
  220.         EndIf
  221.         GUISetFont($iToast_Font_Size, Default, Default, $sToast_Font_Name)
  222.         GUISetBkColor($iToast_Message_BkCol)
  223.         Local $iLabel_Style = 0
  224.         If BitAND($iToast_Style, 1) = 1 Then
  225.                 $iLabel_Style = 1
  226.         ElseIf BitAND($iToast_Style, 2) = 2 Then
  227.                 $iLabel_Style = 2
  228.         EndIf
  229.         If $sTitle <> "" Then
  230.                 GUICtrlCreateLabel("", 0, 0, $iToast_Width, $iTitle_Height)
  231.                 GUICtrlSetBkColor(-1, $iToast_Header_BkCol)
  232.                 GUICtrlSetState(-1, 128)
  233.                 Local $iTitle_Width = $iToast_Width - 10
  234.                 If $iDelay < 0 Then
  235.                         Local $iX_YCoord = Int(($iTitle_Height - 17) / 2)
  236.                         $hToast_Close_X = GUICtrlCreateLabel("T", $iToast_Width - 18, $iX_YCoord, 17, 17)
  237.                         GUICtrlSetFont(-1, 14, Default, Default, "Wingdings 2")
  238.                         GUICtrlSetBkColor(-1, -2)
  239.                         GUICtrlSetColor(-1, $iToast_Header_Col)
  240.                         $iTitle_Width -= 18
  241.                 EndIf
  242.                 GUICtrlCreateLabel($sTitle, 10, 0, $iTitle_Width, $iTitle_Height, 0x0200)
  243.                 GUICtrlSetBkColor(-1, $iToast_Header_BkCol)
  244.                 GUICtrlSetColor(-1, $iToast_Header_Col)
  245.                 If BitAND($iToast_Style, 4) = 4 Then GUICtrlSetFont(-1, $iToast_Font_Size, 600)
  246.         Else
  247.                 If $iDelay < 0 Then
  248.                         $hToast_Close_X = GUICtrlCreateLabel("T", $iToast_Width - 18, 0, 17, 17)
  249.                         GUICtrlSetFont(-1, 14, Default, Default, "Wingdings 2")
  250.                         GUICtrlSetBkColor(-1, -2)
  251.                         GUICtrlSetColor(-1, $iToast_Message_Col)
  252.                 EndIf
  253.         EndIf
  254.         GUICtrlCreateLabel($sMessage, 10, 10 + $iTitle_Height, $iLabelwidth, $iLabelheight)
  255.         GUICtrlSetStyle(-1, $iLabel_Style)
  256.         If $iToast_Message_Col <> Default Then GUICtrlSetColor(-1, $iToast_Message_Col)
  257.         DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $hToast_Handle, "int", 1000, "long", $aToast_Data[2])
  258.         GUISetState(@SW_SHOWNOACTIVATE, $hToast_Handle)
  259.         If $fWait = True Then
  260.                 Local $iTimeout_Begin = TimerInit()
  261.                 While 1
  262.                         If GUIGetMsg() = $hToast_Close_X Or TimerDiff($iTimeout_Begin) / 1000 >= Abs($iDelay) Then ExitLoop
  263.                 WEnd
  264.         ElseIf Abs($iDelay) > 0 Then
  265.                 $iToast_Timer = Abs($iDelay * 1000)
  266.                 $iToast_Start = TimerInit()
  267.                 AdlibRegister("_Toast_Timer_Check", 100)
  268.                 GUIRegisterMsg(0x0021, "_Toast_WM_EVENTS")
  269.         EndIf
  270.         $nOldOpt = Opt('GUIOnEventMode', $nOldOpt)
  271.         Local $aToast_Data[3] = [$iToast_Width, $iToast_Height, $iLine_Height]
  272.         Return $aToast_Data
  273. EndFunc   ;==>_Toast_Show
  274. Func _Toast_Hide()
  275.         If $hToast_Handle = 0 Then Return SetError(1, 0, -1)
  276.         DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $hToast_Handle, "int", 500, "long", $iToast_Move)
  277.         GUIDelete($hToast_Handle)
  278.         $hToast_Handle = 0
  279. EndFunc   ;==>_Toast_Hide
  280. Func _Toast_Locate($iToast_Width, $iToast_Height)
  281.         Local $aToast_Data[3]
  282.         Local $iPrevMode = Opt("WinTitleMatchMode", 4)
  283.         Local $aTray_Pos = WinGetPos("[CLASS:Shell_TrayWnd]")
  284.         Opt("WinTitleMatchMode", $iPrevMode)
  285.         If Not IsArray($aTray_Pos) Then Return SetError(2, 0, -1)
  286.         If $aTray_Pos[1] > 0 Then
  287.                 $iToast_Move = 0x00050004
  288.                 $aToast_Data[0] = @DesktopWidth - $iToast_Width - 10
  289.                 $aToast_Data[1] = $aTray_Pos[1] - $iToast_Height
  290.                 $aToast_Data[2] = 0x00040008
  291.         ElseIf $aTray_Pos[0] > 0 Then
  292.                 $iToast_Move = 0x00050001
  293.                 $aToast_Data[0] = $aTray_Pos[0] - $iToast_Width
  294.                 $aToast_Data[1] = @DesktopHeight - $iToast_Height - 10
  295.                 $aToast_Data[2] = 0x00040002
  296.         ElseIf $aTray_Pos[2] = @DesktopWidth Then
  297.                 $iToast_Move = 0x00050008
  298.                 $aToast_Data[0] = @DesktopWidth - $iToast_Width - 10
  299.                 $aToast_Data[1] = $aTray_Pos[1] + $aTray_Pos[3]
  300.                 $aToast_Data[2] = 0x00040004
  301.         ElseIf $aTray_Pos[3] = @DesktopHeight Then
  302.                 $iToast_Move = 0x00050002
  303.                 $aToast_Data[0] = $aTray_Pos[0] + $aTray_Pos[2]
  304.                 $aToast_Data[1] = @DesktopHeight - $iToast_Height - 10
  305.                 $aToast_Data[2] = 0x00040001
  306.         EndIf
  307.         Return $aToast_Data
  308. EndFunc   ;==>_Toast_Locate
  309. Func _Toast_Timer_Check()
  310.         If TimerDiff($iToast_Start) < $iToast_Timer And $fToast_Close = False Then Return
  311.         GUIRegisterMsg(0x0021, "")
  312.         AdlibUnRegister("_Toast_Timer_Check")
  313.         $fToast_Close = False
  314.         _Toast_Hide()
  315. EndFunc   ;==>_Toast_Timer_Check
  316. Func _Toast_WM_EVENTS($hWnd, $Msg, $wParam, $lParam)
  317.         #forceref $wParam, $lParam
  318.         If $hWnd = $hToast_Handle Then
  319.                 If $Msg = 0x0021 Then
  320.                         Local $aPos = GUIGetCursorInfo($hToast_Handle)
  321.                         If $aPos[4] = $hToast_Close_X Then $fToast_Close = True
  322.                 EndIf
  323.         EndIf
  324.         Return 'GUI_RUNDEFMSG'
  325. EndFunc   ;==>_Toast_WM_EVENTS
  326. Func _Toast_GetDefFont($iData)
  327.         Local $tNONCLIENTMETRICS = DllStructCreate("uint;int;int;int;int;int;byte[60];int;int;byte[60];int;int;byte[60];byte[60];byte[60]")
  328.         DllStructSetData($tNONCLIENTMETRICS, 1, DllStructGetSize($tNONCLIENTMETRICS))
  329.         DllCall("user32.dll", "int", "SystemParametersInfo", "int", 41, "int", DllStructGetSize($tNONCLIENTMETRICS), "ptr", DllStructGetPtr($tNONCLIENTMETRICS), "int", 0)
  330.         Local $tLOGFONT = DllStructCreate("long;long;long;long;long;byte;byte;byte;byte;byte;byte;byte;byte;char[32]", DllStructGetPtr($tNONCLIENTMETRICS, 15))
  331.         Switch $iData
  332.                 Case 0
  333.                         Return Int((Abs(DllStructGetData($tLOGFONT, 1)) + 1) * .75)
  334.                 Case 1
  335.                         Return DllStructGetData($tLOGFONT, 14)
  336.         EndSwitch
  337. EndFunc   ;==>_Toast_GetDefFont
  338. Local $sMsg, $hProgress, $aRet[3]
  339. $sMsg = "The message text goes in this area" & @CRLF & @CRLF
  340. $sMsg &= "This Toast uses the System colours and font"
  341. $aRet = _Toast_Show("The Title text goes here", $sMsg, 5)
  342. ConsoleWrite("Toast size: " & $aRet[0] & " x " & $aRet[1] & " - " & "Line height: " & $aRet[2] & @CRLF)
  343. _Toast_Hide()
  344. $sMsg = "This Toast uses colours and font defined in a _Toast_Set call." & @CRLF & @CRLF
  345. $sMsg &= "Subsequent Toasts will use these values until they are reset by another _Toast_Set call" & @CRLF & @CRLF
  346. $sMsg &= "The next Toast has a very small message to show the pre-set minimum size"
  347. _Toast_Set(5, 0xFF00FF, 0xFFFF00, 0x0000FF, 0xFFFFFF, 10, "Arial")
  348. $aRet = _Toast_Show("User-defined Colours and Bold Header", $sMsg, 10)
  349. ConsoleWrite("Toast size: " & $aRet[0] & " x " & $aRet[1] & " - " & "Line height: " & $aRet[2] & @CRLF)
  350. _Toast_Hide()
  351. $aRet = _Toast_Show("", "Tiny", 2)
  352. ConsoleWrite("Toast size: " & $aRet[0] & " x " & $aRet[1] & " - " & "Line height: " & $aRet[2] & @CRLF)
  353. _Toast_Hide()
  354. $sMsg = "These lines are of medium length" & @CRLF & @CRLF
  355. $sMsg &= "The width is set by the longest" & @CRLF & @CRLF
  356. $sMsg &= "No wrapping occurs here" & @CRLF & @CRLF
  357. $sMsg &= "Note increased font size"
  358. _Toast_Set(-1, -1, -1, -1, -1, 15)
  359. $aRet = _Toast_Show("Mid Width", $sMsg, 5)
  360. ConsoleWrite("Toast size: " & $aRet[0] & " x " & $aRet[1] & " - " & "Line height: " & $aRet[2] & @CRLF)
  361. _Toast_Hide()
  362. $sMsg = "This is a long message set to left justified and a much larger font using _Toast_Set" & @CRLF & @CRLF
  363. $sMsg &= "The Toast is automatically set to the maximum preset width and the message text "
  364. $sMsg &= "is wrapped as necessary to fit within the margins of the Toast" & @CRLF & @CRLF
  365. $sMsg &= "The Toast colours and weight have been changed by another _Toast_Set call" & @CRLF & @CRLF
  366. $sMsg &= "Note the closure [X] on the title bar.  This Toast will time out in 30 secs "
  367. $sMsg &= "but clicking the [X] will resume the script immediately"
  368. _Toast_Set(0, -1, 0xFFFF00, 0x00FF00, 0x000000, 15, "Courier New")
  369. $aRet = _Toast_Show("Max Width and Normal Header", $sMsg, -30)
  370. ConsoleWrite("Toast size: " & $aRet[0] & " x " & $aRet[1] & " - " & "Line height: " & $aRet[2] & @CRLF)
  371. _Toast_Hide()
  372. $sMsg = "Note how Toasts adjust automatically in height to display all of the message "
  373. $sMsg &= "regardless of whether there is a title bar to display, the font used, "
  374. $sMsg &= "the number of lines or whether wrapping occurs" & @CRLF & @CRLF
  375. $sMsg &= "This Toast will retract automatically when the next Toast is called "
  376. $sMsg &= "or when the [X] is clicked"
  377. _Toast_Set(5, 0xFF00FF, 0xFFFF00, 0x0000FF, 0xFFFFFF, 10, "Arial")
  378. $aRet = _Toast_Show("", $sMsg, -10)
  379. ConsoleWrite("Toast size: " & $aRet[0] & " x " & $aRet[1] & " - " & "Line height: " & $aRet[2] & @CRLF)
  380. $sMsg = "This Toast has several blank lines inserted. "
  381. $sMsg &= "This can be useful if you want to leave space to add other controls, "
  382. $sMsg &= "such as a progress bar, to the Toast once it is displayed" & @CRLF & @CRLF & @CRLF & @CRLF
  383. $sMsg &= "The Toast size and line height are returned by the function so you can easily calculate "
  384. $sMsg &= "where to place the other controls.  "
  385. $sMsg &= "This example script writes the size in the SciTE console" & @CRLF & @CRLF
  386. $sMsg &= "Note that Toast colours and font have been reset to Default"
  387. _Toast_Set(Default)
  388. $aRet = _Toast_Show("Progress Bar", $sMsg, 0)
  389. ConsoleWrite("Toast size: " & $aRet[0] & " x " & $aRet[1] & " - " & "Line height: " & $aRet[2] & @CRLF)
  390. $hProgress = GUICtrlCreateProgress(10, $aRet[2] * 5.5, $aRet[0] - 20, 20)
  391. For $i = 1 To 100
  392.         GUICtrlSetData($hProgress, $i)
  393.         Sleep(50)
  394. Next
  395. Sleep(5000)
  396. _Toast_Hide()
  397. $sMsg = "This Toast has the 'Wait' flag set to False. " & @CRLF & @CRLF
  398. $sMsg &= "That means that the script will continue while the Toast is displayed as "
  399. $sMsg &= "as you can see from this counter." & @CRLF & @CRLF & @CRLF
  400. $sMsg &= "Clicking the [X] will retract the Toast immediately but it will "
  401. $sMsg &= "automatically retract after 20 seconds in any event"
  402. _Toast_Set(5, 0xFF00FF, 0xFFFF00, 0x0000FF, 0xFFFFFF, 10)
  403. $aRet = _Toast_Show("Script Continuing", $sMsg, -20, False)
  404. ConsoleWrite("Toast size: " & $aRet[0] & " x " & $aRet[1] & " - " & "Line height: " & $aRet[2] & @CRLF)
  405. $hLabel = GUICtrlCreateLabel("", ($aRet[0] - 20) / 2, $aRet[2] * 6, 20, 20)
  406. GUICtrlSetBkColor(-1, -2)
  407. GUICtrlSetColor(-1, 0xFFFF00)
  408. GUICtrlSetFont(-1, 12)
  409. $iCount = 0
  410. Do
  411.         $iCount += 1
  412.         GUICtrlSetData($hLabel, $iCount)
  413.         Sleep(1000)
  414. Until $iCount = 60 Or $hToast_Handle = 0
  415. Exit
复制代码
已汉化部分:
  1. # ************************************* 第一界面 size: 286 x 74 - Line height: 12        160 x 74 - 行高: 12
  2. $sMsg = "信息本文在这个区域" & @CRLF & @CRLF
  3. $sMsg &= "界面使用系统颜色和字型"
  4. $aRet = _Toast_Show("这里是窗口标题", $sMsg, 5)
  5. ConsoleWrite("界面尺寸: " & $aRet[0] & " x " & $aRet[1] & " - " & "行高: " & $aRet[2] & @CRLF)
  6. _Toast_Hide()

  7. # ************************************* 第二界面 size: 500 x 138 - Line height: 16        486 x 122 - 行高: 16
  8. $sMsg = "这个界面是调用 _Toast_Set 定义的颜色和字型." & @CRLF & @CRLF
  9. $sMsg &= "后来界面将使用这些数值,直到调用另外一个 _Toast_Set 重新设定" & @CRLF & @CRLF
  10. $sMsg &= "下一界面有一个非常小的信息表示前固定的最小尺寸"
  11. _Toast_Set(5, 0xFF00FF, 0xFFFF00, 0x0000FF, 0xFFFFFF, 10, "Arial")
  12. $aRet = _Toast_Show("自定义颜色和粗体表头", $sMsg, 10)
  13. ConsoleWrite("界面尺寸: " & $aRet[0] & " x " & $aRet[1] & " - " & "行高: " & $aRet[2] & @CRLF)
  14. _Toast_Hide()

  15. # ************************************* 第三界面 size: 150 x 40 - Line height: 16        150 x 40 - 行高: 16
  16. $aRet = _Toast_Show("", "小界面", 2)
  17. ConsoleWrite("界面尺寸: " & $aRet[0] & " x " & $aRet[1] & " - " & "行高: " & $aRet[2] & @CRLF)
  18. _Toast_Hide()

  19. # ************************************* 第四界面 size: 317 x 210 - Line height: 23        268 x 210 - 行高: 23
  20. $sMsg = "这些行有不同的长度的" & @CRLF & @CRLF
  21. $sMsg &= "宽度按照最长的文本行设定" & @CRLF & @CRLF
  22. $sMsg &= "没有发生环绕" & @CRLF & @CRLF
  23. $sMsg &= "注意增加的字型大小"
  24. _Toast_Set(-1, -1, -1, -1, -1, 15)
  25. $aRet = _Toast_Show("Mid Width", $sMsg, 5)
  26. ConsoleWrite("界面尺寸: " & $aRet[0] & " x " & $aRet[1] & " - " & "行高: " & $aRet[2] & @CRLF)
  27. _Toast_Hide()

  28. # ************************************* 第五界面 size: 500 x 400 - Line height: 22        500 x 224 - 行高: 22
  29. $sMsg = "这是 _Toast_Set 设置的长文本信息,文本使用左对齐和大字体" & @CRLF & @CRLF
  30. $sMsg &= "界面自动设定为预设的最大宽度和消息文本 "
  31. $sMsg &= "是必要的,以适应包装内的界面边缘" & @CRLF & @CRLF
  32. $sMsg &= "调用另一个 _Toast_Set 改变界面的颜色和深浅" & @CRLF & @CRLF
  33. $sMsg &= "请注意在标题栏中的关闭 [X] 符号。这个界面将持续 30 秒时间 "
  34. $sMsg &= "但点击 [X] 脚本将立即继续下面的操作"
  35. _Toast_Set(0, -1, 0xFFFF00, 0x00FF00, 0x000000, 15, "Courier New")
  36. $aRet = _Toast_Show("最大宽度与正常头", $sMsg, -30)
  37. ConsoleWrite("界面尺寸: " & $aRet[0] & " x " & $aRet[1] & " - " & "行高: " & $aRet[2] & @CRLF)
  38. _Toast_Hide()

  39. # ************************************* 第六界面 size: 500 x 125 - Line height: 16        500 x 77 - 行高: 16
  40. $sMsg = "注意界面如何自动调整高度,以显示全部消息 "
  41. $sMsg &= "不论是否有标题栏显示, 使用的字体, "
  42. $sMsg &= "行数或是否出现环绕" & @CRLF & @CRLF
  43. $sMsg &= "当调用下一个界面时,这个界面将自动缩回  "
  44. $sMsg &= "或点击 [X] 按钮时"
  45. _Toast_Set(5, 0xFF00FF, 0xFFFF00, 0x0000FF, 0xFFFFFF, 10, "Arial")
  46. $aRet = _Toast_Show("", $sMsg, -10)
  47. ConsoleWrite("界面尺寸: " & $aRet[0] & " x " & $aRet[1] & " - " & "行高: " & $aRet[2] & @CRLF)

  48. # ************************************* 第七界面 size: 500 x 170 - Line height: 12        500 x 170 - 行高: 12
  49. $sMsg = "这个界面插入了几个空白行. "
  50. $sMsg &= "这是必要的,预留空间以方便你添加一些控件,  "
  51. $sMsg &= "例如一个进度条。 一旦界面显示" & @CRLF & @CRLF & @CRLF & @CRLF
  52. $sMsg &= "由函数返回的界面大小和行的高度, 你就可以很容易地计算出"; & @CRLF
  53. $sMsg &= "在什么地方放置其他控件.  "
  54. $sMsg &= "这个示例脚本将界面尺寸大小写入 SciTE 的控制台" & @CRLF & @CRLF
  55. $sMsg &= "请注意,界面的颜色和字体都被重置为默认值"
  56. _Toast_Set(Default)
  57. $aRet = _Toast_Show("Progress Bar", $sMsg, 0)
  58. ConsoleWrite("界面尺寸: " & $aRet[0] & " x " & $aRet[1] & " - " & "行高: " & $aRet[2] & @CRLF)
  59. $hProgress = GUICtrlCreateProgress(10, $aRet[2] * 5.5, $aRet[0] - 20, 20)
  60. For $i = 1 To 100
  61.         GUICtrlSetData($hProgress, $i)
  62.         Sleep(50)
  63. Next
  64. Sleep(5000)
  65. _Toast_Hide()

  66. # ************************************* 第八界面 size: 500 x 145 - Line height: 13        500 x 119 - 行高: 13
  67. $sMsg = "这个界面的 'Wait' 等待标志参数值被设为 False. " & @CRLF & @CRLF
  68. $sMsg &= "脚本在计时设定的时间内会连续显示这个界面,在计时装置完成之前, "
  69. $sMsg &= "你可以观察到计数装置从 1 增到 20." & @CRLF & @CRLF & @CRLF                  
  70. $sMsg &= "计时装置完成前,单击 [X] 符号按钮,界面将立即关闭 "
  71. $sMsg &= "但无论怎样,20 秒计时完成之后,界面会自动关闭的"
  72. _Toast_Set(5, 0xFF00FF, 0xFFFF00, 0x0000FF, 0xFFFFFF, 12)
  73. $aRet = _Toast_Show("脚本连续显示界面", $sMsg, -20, False)
  74. ConsoleWrite("界面尺寸: " & $aRet[0] & " x " & $aRet[1] & " - " & "行高: " & $aRet[2] & @CRLF)
  75. $hLabel = GUICtrlCreateLabel("", ($aRet[0] - 20) / 2, $aRet[2] * 6, 20, 20)
  76. GUICtrlSetBkColor(-1, -2)
  77. GUICtrlSetColor(-1, 0xFFFF00)
  78. GUICtrlSetFont(-1, 12)
  79. $iCount = 0
  80. Do
  81.         $iCount += 1
  82.         GUICtrlSetData($hLabel, $iCount)
  83.         Sleep(1000)
  84. Until $iCount = 60 Or $hToast_Handle = 0
  85. Exit
复制代码

评分

参与人数 2金钱 +90 贡献 +5 收起 理由
republican + 40
afan + 50 + 5

查看全部评分

发表于 2010-8-12 20:17:12 | 显示全部楼层
很简约,漂亮啊~~
 楼主| 发表于 2010-8-12 20:21:46 | 显示全部楼层
回复 2# afan

能找到汉化异常的原因吗?
发表于 2010-8-12 21:00:10 | 显示全部楼层
回复 3# 131738


    初步认为他没有考虑双字节的情况,造成获取字符串的宽度有问题,继而造成高度的不足。
代码太长了,没时间研究哦…

简单解决方法: 在$sMsg最后补适量的 & @CRLF 即可,如:
========第六界面=========
最后的 $sMsg &= "或点击 [X] 按钮时" & @CRLF

========第八界面=========
最后的 $sMsg &= "但无论怎样,20 秒计时完成之后,界面会自动关闭的" & @CRLF & @CRLF

本帖子中包含更多资源

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

x
 楼主| 发表于 2010-8-12 21:17:16 | 显示全部楼层
回复 4# afan

谢谢!!!!受教了。。。

另,谢谢加分。。。打扰了。。。。
发表于 2010-8-13 18:20:11 | 显示全部楼层
忘了很重要的一点,字母语言环境和方块文字环境断行的方式是不同的。
字母语言环境会以单词和空格的方式来判断,且Label不会自动调整换行显示,如果强制在范围内显示它会裁剪字符,使部分字符不会显示,因此,此脚本是用的将超出长度的字符串另外组织成另外的行,以保证每行文字都能完整显示。而这样每行的字符串长度相差可能都很大,所以它很多情况下都使用了水平居中显示的样式(8个例子中有7个是如此),以免居左显示时,右边会参差不齐,影响美观。
而方块文字环境则无此困扰,超过水平范围会自动换行,只要Label控件足够高则可完全显示。此脚本是针对字母语言环境的,所以它调整起来非常繁琐,如果按我们的文字习惯会简单很多,当然也就无法满足字母环境了。
发表于 2010-8-13 18:25:57 | 显示全部楼层
回复  afan

其实这个脚本有点意思的, 创建窗口宽度为 1200, 够大的了

但实际并没有显示出这么大的窗口,而是根据字符串的多少,来确定显示窗口的大小,

你的“认为他没有考虑双字节的情况,造成获取字符串的宽度有问题,继而造成高度的不足”判断肯定是正确的

发的代码中,有进度条的窗口我没有汉化,结果汉化后,显示进度条压住了紧随进度条下方的文本,

这就不是添加 @CRLF 能解决的,摸索半天,用空格充足源代码的字节数,这才使进度条不压文本了,

但文本显示就不整齐了,创建进度条,位置参数使用的是变量,且变量又不是常数,我再好好看看它是如何计算的。。。。。

GUICtrlCreateProgress(10, $aRet[2] * 5.5, $aRet[0] - 20, 20)
131738 发表于 2010-8-13 01:09


    在自动生成的界面中再添加控件,比如第七界面的进度条、第八界面的计时Label,其实并无自动的需求,它完全是根据已经规定的$sMsg字符串来定的,并非自动调整,比如原$sMsg英文字符串,你删除下面的行,仅保留两行,同样不会显示进度条。所以,这个是需要自行调整数值的,就像写Gui界面一样。比如我把进度条用在下面,同样可以
  1. #************************************* 第八界面 size: 500 x 145 - Line height: 13        500 x 119 - 行高: 13
  2. $sMsg = "这个界面的 'Wait' 等待标志参数值被设为 False. " & @CRLF & @CRLF
  3. $sMsg &= "脚本在计时设定的时间内会连续显示这个界面,在计时装置完成之前, "
  4. $sMsg &= "你可以观察到计数装置从 1 增到 20." & @CRLF & @CRLF & @CRLF & @CRLF                 
  5. $sMsg &= "计时装置完成前,单击 [X] 符号按钮,界面将立即关闭 "
  6. $sMsg &= "但无论怎样,20 秒计时完成之后,界面会自动关闭的" & @CRLF & @CRLF
  7. _Toast_Set(5, 0xFF00FF, 0xFFFF00, 0x0000FF, 0xFFFFFF, 12)
  8. $aRet = _Toast_Show("脚本连续显示界面", $sMsg, -20, False)
  9. ConsoleWrite("界面尺寸: " & $aRet[0] & " x " & $aRet[1] & " - " & "行高: " & $aRet[2] & @CRLF)
  10. $hLabel = GUICtrlCreateLabel("", ($aRet[0] - 20) / 2, $aRet[2] * 6, 20, 20)
  11. GUICtrlSetBkColor(-1, -2)
  12. GUICtrlSetColor(-1, 0xFFFF00)
  13. GUICtrlSetFont(-1, 12)
  14. $iCount = 0
  15. $hProgress = GUICtrlCreateProgress(10, 135, 480, 20)
  16. Do
  17.         $iCount += 1
  18.         GUICtrlSetData($hLabel, $iCount)
  19.         GUICtrlSetData($hProgress, $iCount / 20 * 100)
  20.         Sleep(1000)
  21. Until $hToast_Handle = 0
  22. Exit
复制代码
发表于 2010-8-13 18:31:53 | 显示全部楼层
修改了半天此脚本,终于要搞定了
 楼主| 发表于 2010-8-13 19:15:58 | 显示全部楼层
修改了半天此脚本,终于要搞定了
afan 发表于 2010-8-13 18:31


等待看你的修改结果,然后对照源码学习你的技巧!!!
 楼主| 发表于 2010-8-14 00:04:40 | 显示全部楼层
本帖最后由 131738 于 2010-8-14 20:09 编辑

回复 8# afan

又搜到一套脚本,是 1 楼脚本的改良,包含文件独立在外,且有参数描述发布于今年7月初:

http://www.autoitscript.com/foru ... =1&#entry764115

作者曾经帮助过这里写电脑硬件测温工具的那位网友

包含文件:Toast.au3
  1. #include-once

  2. ; #INDEX# ============================================================================================================
  3. ; Title .........: Toast
  4. ; AutoIt Version : 3.3.2.0 - uses AdlibRegister/Unregister
  5. ; Language ......: English
  6. ; Description ...: Show and hides slice messages from the systray in user defined colours and fonts
  7. ; Author(s) .....: Melba23.  Credit to GioVit (tray location)
  8. ; ====================================================================================================================

  9. ;#AutoIt3Wrapper_au3check_parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6

  10. ; #INCLUDES# =========================================================================================================
  11. #include "StringSize.au3"

  12. ; #GLOBAL VARIABLES# =================================================================================================
  13. Global $iDef_Toast_Font_Size   = _Toast_GetDefFont(0)
  14. Global $sDef_Toast_Font_Name   = _Toast_GetDefFont(1)

  15. Global $hToast_Handle        = 0
  16. Global $hToast_Close_X       = 9999
  17. Global $iToast_Move          = 0
  18. Global $iToast_Style         = 1 ; $SS_CENTER
  19. Global $aRet = DllCall("User32.dll", "int", "GetSysColor", "int", 8) ; $COLOR_WINDOWTEXT = 8
  20. Global $iToast_Header_BkCol  = $aRet[0]
  21. $aRet = DllCall("User32.dll", "int", "GetSysColor", "int", 5) ; $COLOR_WINDOW = 5
  22. Global $iToast_Header_Col    = $aRet[0]
  23. Global $iToast_Header_Bold   = 0
  24. Global $iToast_Message_BkCol = $iToast_Header_Col
  25. Global $iToast_Message_Col   = $iToast_Header_BkCol
  26. Global $iToast_Font_Size     = $iDef_Toast_Font_Size
  27. Global $sToast_Font_Name     = $sDef_Toast_Font_Name
  28. Global $iToast_Timer         = 0
  29. Global $iToast_Start         = 0
  30. Global $fToast_Close         = False

  31. ; #CURRENT# ==========================================================================================================
  32. ; _Toast_Set:  Sets text justification and optionally colours and font, for _Toast_Show function calls
  33. ; _Toast_Show: Shows a slice message from the systray
  34. ; _Toast_Hide: Hides a slice message from the systray
  35. ; ====================================================================================================================

  36. ; #INTERNAL_USE_ONLY#=================================================================================================
  37. ; _Toast_Locate:        Find Systray and determine Toast start position and movement direction
  38. ; _Toast_Timer_Check:   Checks whether Toast has timed out or closure [X] clicked
  39. ; _Toast_WM_EVENTS:     Message handler to check if closure [X] clicked
  40. ; _Toast_GetDefFont: Determine system default MsgBox font and size
  41. ; ====================================================================================================================

  42. ; #FUNCTION# =========================================================================================================
  43. ; Name...........: _Toast_Set
  44. ; Description ...: Sets text justification and optionally colours and font, for _Toast_Show function calls
  45. ; Syntax.........: _Toast_Set($vJust, [$iHdr_BkCol, [$iHdr_Col, [$iMsg_BkCol, [$iMsg_Col, [$sFont_Size, [$iFont_Name]]]]]])
  46. ; Parameters ....: $vJust     - 0 = Left justified, 1 = Centred (Default), 2 = Right justified
  47. ;                                Can use $SS_LEFT, $SS_CENTER, $SS_RIGHT
  48. ;                                + 4 = Header text in bold
  49. ;                       >>>>>    Setting this parameter to' Default' will reset ALL parameters to default values     <<<<<
  50. ;                       >>>>>    All optional parameters default to system MsgBox default values                     <<<<<
  51. ;                  $iHdr_BkCol - [Optional] The colour for the title bar background
  52. ;                  $iHdr_Col   - [Optional] The colour for the title bar text
  53. ;                  $iMsg_BkCol - [Optional] The colour for the message background
  54. ;                  $iMsg_Col   - [Optional] The colour for the message text
  55. ;                                Omitting a colour parameter or setting it to -1 leaves it unchanged
  56. ;                                Setting a colour parameter to Default resets the system colour
  57. ;                  $iFont_Size - [Optional] The font size in points to use for the Toast
  58. ;                  $sFont_Name - [Optional] The font to use for the Toast
  59. ;                       >>>>>    Omitting a font parameter, setting size to -1 or name to "" leaves it unchanged     <<<<<
  60. ;                       >>>>>    Setting a font parameter to Default resets the system message box font or size      <<<<<
  61. ; Requirement(s).: v3.3.2.0 or higher - AdlibRegister/Unregister used in _Toast_Show
  62. ; Return values .: Success - Returns 1
  63. ;                  Failure - Returns 0 and sets @error to 1 with @extended set to parameter index number
  64. ; Author ........: Melba23
  65. ; Example........; Yes
  66. ;=====================================================================================================================

  67. Func _Toast_Set($vJust, $iHdr_BkCol = -1, $iHdr_Col = -1, $iMsg_BkCol = -1, $iMsg_Col = -1, $iFont_Size = -1, $sFont_Name = "")

  68.         ; Set parameters
  69.         Switch $vJust
  70.                 Case Default
  71.                         $iToast_Style         = 1; $SS_CENTER
  72.                         $aRet = DllCall("User32.dll", "int", "GetSysColor", "int", 8) ; $COLOR_WINDOWTEXT = 8
  73.                         $iToast_Header_BkCol  = $aRet[0]
  74.                         $aRet = DllCall("User32.dll", "int", "GetSysColor", "int", 5) ; $COLOR_WINDOW = 5
  75.                         $iToast_Header_Col    = $aRet[0]
  76.                         $iToast_Message_BkCol = $iToast_Header_Col
  77.                         $iToast_Message_Col   = $iToast_Header_BkCol
  78.                         $sToast_Font_Name     = $sDef_Toast_Font_Name
  79.                         $iToast_Font_Size     = $iDef_Toast_Font_Size
  80.                         Return
  81.                 Case 0, 1, 2, 4, 5, 6
  82.                         $iToast_Style = $vJust
  83.                 Case -1
  84.                         ; Do nothing
  85.                 Case Else
  86.                         Return SetError(1, 1, 0)
  87.         EndSwitch

  88.         Switch $iHdr_BkCol
  89.                 Case Default
  90.                         $aRet = DllCall("User32.dll", "int", "GetSysColor", "int", 8) ; $COLOR_WINDOWTEXT = 8
  91.                         $iToast_Header_BkCol  = $aRet[0]
  92.                 Case 0 To 0xFFFFFF
  93.                         $iToast_Header_BkCol = Int($iHdr_BkCol)
  94.         Case -1
  95.                         ; Do nothing
  96.                 Case Else
  97.                         Return SetError(1, 2, 0)
  98.         EndSwitch

  99.         Switch $iHdr_Col
  100.                 Case Default
  101.                         $aRet = DllCall("User32.dll", "int", "GetSysColor", "int", 5) ; $COLOR_WINDOW = 5
  102.                         $iToast_Header_Col  = $aRet[0]
  103.                 Case 0 To 0xFFFFFF
  104.                         $iToast_Header_Col = Int($iHdr_Col)
  105.         Case -1
  106.                         ; Do nothing
  107.                 Case Else
  108.                         Return SetError(1, 3, 0)
  109.         EndSwitch

  110.         Switch $iMsg_BkCol
  111.                 Case Default
  112.                         $aRet = DllCall("User32.dll", "int", "GetSysColor", "int", 8) ; $COLOR_WINDOWTEXT = 8
  113.                         $iToast_Message_BkCol  = $aRet[0]
  114.                 Case 0 To 0xFFFFFF
  115.                         $iToast_Message_BkCol = Int($iMsg_BkCol)
  116.         Case -1
  117.                         ; Do nothing
  118.                 Case Else
  119.                         Return SetError(1, 4, 0)
  120.         EndSwitch

  121.         Switch $iMsg_Col
  122.                 Case Default
  123.                         $aRet = DllCall("User32.dll", "int", "GetSysColor", "int", 8) ; $COLOR_WINDOWTEXT = 8
  124.                         $iToast_Message_Col  = $aRet[0]
  125.                 Case 0 To 0xFFFFFF
  126.                         $iToast_Message_Col = Int($iMsg_Col)
  127.         Case -1
  128.                         ; Do nothing
  129.                 Case Else
  130.                         Return SetError(1, 5, 0)
  131.         EndSwitch

  132.         Switch $iFont_Size
  133.                 Case Default
  134.                         $iToast_Font_Size = $iDef_Toast_Font_Size
  135.                 Case 8 To 72
  136.                         $iToast_Font_Size = Int($iFont_Size)
  137.         Case -1
  138.                         ; Do nothing
  139.                 Case Else
  140.                         Return SetError(1, 6, 0)
  141.         EndSwitch

  142.         Switch $sFont_Name
  143.                 Case Default
  144.                         $sToast_Font_Name = $sDef_Toast_Font_Name
  145.                 Case ""
  146.                         ; Do nothing
  147.                 Case Else
  148.                         If IsString($sFont_Name) Then
  149.                                 $sToast_Font_Name = $sFont_Name
  150.                         Else
  151.                                 Return SetError(1, 7, 0)
  152.                         EndIf
  153.         EndSwitch

  154.         Return 1

  155. EndFunc ; => _Toast_Set

  156. ; #FUNCTION# =========================================================================================================
  157. ; Name...........: _Toast_Show
  158. ; Description ...: Shows a slice message from the systray
  159. ; Syntax.........: _Toast_Show($vIcon, $sTitle, $sMessage, [$iDelay [, $fWait [, $fRaw]]])
  160. ; Parameters ....: $vIcon    - 0 - No icon, 8 - UAC, 16 - Stop, 32 - Query, 48 - Exclamation, 64 - Information
  161. ;                              The $MB_ICON constant can also be used for the last 4 above
  162. ;                              If set to the name of an exe, the main icon of that exe will be displayed
  163. ;                              Any other value returns -1, error 1
  164. ;                  $sTitle   - Text to display on Title bar
  165. ;                  $sMessage - Text to display in Toast body
  166. ;                  $iDelay   - The delay in seconds before the Toast retracts or script continues (Default = 0)
  167. ;                              If negative, an [X] is added to the title bar. Clicking [X] retracts/continues immediately
  168. ;                  $fWait    - True  - Script waits for delay time before continuing and Toast remains visible
  169. ;                              False - Script continues and Toast retracts automatically after delay time
  170. ;                  $fRaw     - True  - Message is not wrapped and Toast expands to show full width
  171. ;                            - False - Message is wrapped if over max preset Toast width
  172. ; Requirement(s).: v3.3.1.5 or higher - AdlibRegister/Unregister used in _Toast_Show
  173. ; Return values .: Success: Returns 2-element array: [Toast width, Toast height]
  174. ;                  Failure:        Returns -1 and sets @error as follows:
  175. ;                           1 = Toast GUI creation failed
  176. ;                           2 = Taskbar not found
  177. ;                           4 = When using Raw, the Toast is too wide for the display
  178. ;                           3 = StringSize error
  179. ; Author ........: Melba23, based on some original code by GioVit for the Toast
  180. ; Notes .........; Any visible Toast is retracted by a subsequent _Toast_Hide or _Toast_Show, or clicking a visible [X]
  181. ; Example........; Yes
  182. ;=====================================================================================================================

  183. Func _Toast_Show($vIcon, $sTitle, $sMessage, $iDelay = 0, $fWait = True, $fRaw = False)

  184.         ; Store current GUI mode and set Message mode
  185.         Local $nOldOpt = Opt('GUIOnEventMode', 0)

  186.         ; Retract any Toast already in place
  187.         If $hToast_Handle <> 0 Then _Toast_Hide()

  188.         ; Reset non-reacting Close [X] ControlID
  189.         $hToast_Close_X = 9999

  190.         ; Set default auto-sizing Toast widths
  191.         Local $iToast_Width_max = 500
  192.         Local $iToast_Width_min = 150

  193.         ; Check for icon
  194.         Local $iIcon_Style = 0
  195.         Local $iIcon_Reduction = 50
  196.         Local $sDLL = "user32.dll"
  197.         If StringIsDigit($vIcon) Then
  198.                 Switch $vIcon
  199.                         Case 0
  200.                                 $iIcon_Reduction = 0
  201.                         Case 8
  202.                                 $sDLL = "imageres.dll"
  203.                                 $iIcon_Style = 78
  204.                         Case 16 ; Stop
  205.                                 $iIcon_Style = -4
  206.                         Case 32 ; Query
  207.                                 $iIcon_Style = -3
  208.                         Case 48 ; Exclam
  209.                                 $iIcon_Style = -2
  210.                         Case 64 ; Info
  211.                                 $iIcon_Style = -5
  212.                         Case Else
  213.                                 $nOldOpt = Opt('GUIOnEventMode', $nOldOpt)
  214.                                 Return SetError(1, 0, -1)
  215.                 EndSwitch
  216.         Else
  217.                 $sDLL = $vIcon
  218.                 $iIcon_Style = 0
  219.         EndIf

  220.         ; Determine max message width
  221.         Local $iMax_Label_Width = $iToast_Width_max - 20 - $iIcon_Reduction
  222.         If $fRaw = True Then $iMax_Label_Width = 0

  223.         ; Get message label size
  224.         Local $aLabel_Pos = _StringSize($sMessage, $iToast_Font_Size, Default, Default, $sToast_Font_Name, $iMax_Label_Width)
  225.         If @error Then
  226.                 $nOldOpt = Opt('GUIOnEventMode', $nOldOpt)
  227.                 Return SetError(3, 0, -1)
  228.         EndIf

  229.         ; Reset text to match rectangle
  230.         $sMessage = $aLabel_Pos[0]

  231.         ;Set line height for this font
  232.         Local $iLine_Height = $aLabel_Pos[1]

  233.         ; Set label size
  234.         Local $iLabelwidth  = $aLabel_Pos[2]
  235.         Local $iLabelheight = $aLabel_Pos[3]

  236.         ; Set Toast size
  237.         Local $iToast_Width = $iLabelwidth + 20 + $iIcon_Reduction
  238.         ; Check if Toast will fit on screen
  239.         If $iToast_Width > @DesktopWidth - 20 Then
  240.                 $nOldOpt = Opt('GUIOnEventMode', $nOldOpt)
  241.                 Return SetError(4, 0, -1)
  242.         EndIf
  243.         ; Increase if below min size
  244.         If $iToast_Width < $iToast_Width_min + $iIcon_Reduction Then
  245.                 $iToast_Width = $iToast_Width_min + $iIcon_Reduction
  246.                 $iLabelwidth  = $iToast_Width_min - 20
  247.         EndIf

  248.         ; Set title bar height - with minimum for [X]
  249.         Local $iTitle_Height = 0
  250.         If $sTitle = "" Then
  251.                 If $iDelay < 0 Then $iTitle_Height = 6
  252.         Else
  253.                 $iTitle_Height = $iLine_Height + 2
  254.                 If $iDelay < 0 Then
  255.                         If $iTitle_Height < 17 Then $iTitle_Height = 17
  256.                 EndIf
  257.         EndIf

  258.         ; Set Toast height as label height + title bar + bottom margin
  259.         Local $iToast_Height = $iLabelheight + $iTitle_Height + 20
  260.         ; Ensure enough room for icon if displayed
  261.         If $iIcon_Reduction Then
  262.                 If $iToast_Height < $iTitle_Height + 42 Then $iToast_Height = $iTitle_Height + 47
  263.         EndIf

  264.         ; Get Toast starting position and direction
  265.         Local $aToast_Data = _Toast_Locate($iToast_Width, $iToast_Height)

  266.         ; Create Toast slice with $WS_POPUPWINDOW, $WS_EX_TOOLWINDOW style and $WS_EX_TOPMOST extended style
  267.         $hToast_Handle = GUICreate("", $iToast_Width, $iToast_Height, $aToast_Data[0], $aToast_Data[1], 0x80880000, BitOr(0x00000080, 0x00000008))
  268.         If @error Then
  269.                 $nOldOpt = Opt('GUIOnEventMode', $nOldOpt)
  270.                 Return SetError(1, 0, -1)
  271.         EndIf
  272.                 GUISetFont($iToast_Font_Size, Default, Default, $sToast_Font_Name)
  273.                 GUISetBkColor($iToast_Message_BkCol)

  274.         ; Set centring parameter
  275.         Local $iLabel_Style = 0 ; $SS_LEFT
  276.         If BitAND($iToast_Style, 1) = 1 Then
  277.                 $iLabel_Style = 1 ; $SS_CENTER
  278.         ElseIf BitAND($iToast_Style, 2) = 2 Then
  279.                 $iLabel_Style = 2 ; $SS_RIGHT
  280.         EndIf

  281.         ; Check installed fonts
  282.         Local $sX_Font = "WingDings"
  283.         Local $sX_Char = "x"
  284.         Local $i = 1
  285.         While 1
  286.                 Local $sInstalled_Font = RegEnumVal("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts", $i)
  287.                 If @error Then ExitLoop
  288.                 If StringInStr($sInstalled_Font, "WingDings 2") Then
  289.                         $sX_Font = "WingDings 2"
  290.                         $sX_Char = "T"
  291.                 EndIf
  292.                 $i += 1
  293.         WEnd

  294.         ; Create title bar if required
  295.         If $sTitle <> "" Then

  296.                 ; Create disabled background strip
  297.                 GUICtrlCreateLabel("", 0, 0, $iToast_Width, $iTitle_Height)
  298.                         GUICtrlSetBkColor(-1, $iToast_Header_BkCol)
  299.                         GUICtrlSetState(-1, 128) ; $GUI_DISABLE

  300.                 ; Set title bar width to offset text
  301.                 Local $iTitle_Width = $iToast_Width - 10

  302.                 ; Create closure [X] if needed
  303.                 If $iDelay < 0 Then
  304.                         ; Create [X]
  305.                         Local $iX_YCoord = Int(($iTitle_Height - 17) / 2)
  306.                         $hToast_Close_X = GUICtrlCreateLabel($sX_Char, $iToast_Width - 18, $iX_YCoord, 17, 17)
  307.                                 GUICtrlSetFont(-1, 14, Default, Default, $sX_Font)
  308.                                 GUICtrlSetBkColor(-1, -2) ; $GUI_BKCOLOR_TRANSPARENT
  309.                                 GUICtrlSetColor(-1, $iToast_Header_Col)
  310.                         ; Reduce title bar width to allow [X] to activate
  311.                         $iTitle_Width -= 18
  312.                 EndIf

  313.                 ; Create Title label with bold text, centred vertically in case bar is higher than line
  314.                 GUICtrlCreateLabel($sTitle, 10, 0, $iTitle_Width, $iTitle_Height, 0x0200) ; $SS_CENTERIMAGE
  315.                         GUICtrlSetBkColor(-1,$iToast_Header_BkCol)
  316.                         GUICtrlSetColor(-1, $iToast_Header_Col)
  317.                         If BitAND($iToast_Style, 4) = 4 Then GUICtrlSetFont(-1, $iToast_Font_Size, 600)

  318.         Else

  319.                 If $iDelay < 0 Then
  320.                         ; Only need [X]
  321.                         $hToast_Close_X = GUICtrlCreateLabel($sX_Char, $iToast_Width - 18, 0, 17, 17)
  322.                                 GUICtrlSetFont(-1, 14, Default, Default, $sX_Font)
  323.                                 GUICtrlSetBkColor(-1, -2) ; $GUI_BKCOLOR_TRANSPARENT
  324.                                 GUICtrlSetColor(-1, $iToast_Message_Col)
  325.                 EndIf

  326.         EndIf

  327.         ; Create icon
  328.         If $iIcon_Reduction Then GUICtrlCreateIcon($sDLL, $iIcon_Style, 10, 10 + $iTitle_Height)

  329.         ; Create Message label
  330.         GUICtrlCreateLabel($sMessage, 10 + $iIcon_Reduction, 10 + $iTitle_Height, $iLabelwidth, $iLabelheight)
  331.                 GUICtrlSetStyle(-1, $iLabel_Style)
  332.                 If $iToast_Message_Col <> Default Then GUICtrlSetColor(-1, $iToast_Message_Col)

  333.         ; Slide Toast Slice into view from behind systray and activate
  334.         DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $hToast_Handle, "int", 1000, "long", $aToast_Data[2])

  335.         ; Activate Toast without stealing focus
  336.         GUISetState(@SW_SHOWNOACTIVATE, $hToast_Handle)

  337.         ; If script is to pause
  338.         If $fWait = True Then

  339.                 ; Begin timeout counter
  340.                 Local $iTimeout_Begin = TimerInit()

  341.                 ; Wait for timeout or closure
  342.                 While 1
  343.                         If GUIGetMsg() = $hToast_Close_X Or TimerDiff($iTimeout_Begin) / 1000 >= Abs($iDelay) Then ExitLoop
  344.                 WEnd

  345.         ; If script is to continue and delay has been set
  346.         ElseIf Abs($iDelay) > 0 Then

  347.                 ; Store timer info
  348.                 $iToast_Timer = Abs($iDelay * 1000)
  349.                 $iToast_Start = TimerInit()

  350.                 ; Register Adlib function to run timer
  351.                 AdlibRegister("_Toast_Timer_Check", 100)
  352.                 ; Register message handler to check for [X] click
  353.                 GUIRegisterMsg(0x0021, "_Toast_WM_EVENTS") ; $WM_MOUSEACTIVATE

  354.         EndIf

  355.         ; Reset original mode
  356.         $nOldOpt = Opt('GUIOnEventMode', $nOldOpt)

  357.         ; Create array to return Toast dimensions
  358.         Local $aToast_Data[3] = [$iToast_Width, $iToast_Height, $iLine_Height]

  359.         Return $aToast_Data

  360. EndFunc ; => _Toast_Show

  361. ; #FUNCTION# ========================================================================================================
  362. ; Name...........: _Toast_Hide
  363. ; Description ...: Hides a slice message from the systray
  364. ; Syntax.........: _Toast_Hide()
  365. ; Requirement(s).: v3.3.1.5 or higher - AdlibRegister used in _Toast_Show
  366. ; Return values .: Success: Returns 0
  367. ;                  Failure:        If Toast does not exist returns -1 and sets @error to 1
  368. ; Author ........: Melba23
  369. ; Example........; Yes
  370. ;=====================================================================================================================

  371. Func _Toast_Hide()

  372.         ; If no Toast to hide, return
  373.         If $hToast_Handle = 0 Then Return SetError(1, 0, -1)

  374.         ; Slide Toast back behind systray
  375.         DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $hToast_Handle, "int", 500, "long", $iToast_Move)

  376.         ; Delete Toast slice
  377.         GUIDelete($hToast_Handle)

  378.         ; Set flag for "no Toast"
  379.         $hToast_Handle = 0

  380. EndFunc ; => _Toast_Hide

  381. ; #INTERNAL_USE_ONLY#============================================================================================================
  382. ; Name...........: _Toast_Locate
  383. ; Description ...: Find Systray and determine Toast start position and movement direction
  384. ; Syntax ........: _Toast_Locate($iToast_Width, $iToast_Height)
  385. ; Parameters ....: $iToast_Width  - required width of slice
  386. ;                  $iToast_Height - required height of slice
  387. ; Author ........: Melba23, based on some original code by GioVit
  388. ; Modified.......:
  389. ; Remarks .......: This function is used internally by _Toast_Show
  390. ; ===============================================================================================================================
  391. Func _Toast_Locate($iToast_Width, $iToast_Height)

  392.         ; Define return array
  393.         Local $aToast_Data[3]

  394.         ; Find systray
  395.         Local $iPrevMode = Opt("WinTitleMatchMode", 4)
  396.     Local $aTray_Pos = WinGetPos("[CLASS:Shell_TrayWnd]")
  397.     Opt("WinTitleMatchMode", $iPrevMode)

  398.         ; If error in finding systray
  399.         If Not IsArray($aTray_Pos) Then Return SetError(2, 0, -1)

  400.         ; Determine direction of Toast motion and starting position
  401.         If $aTray_Pos[1] > 0 Then
  402.         $iToast_Move = 0x00050004 ; $AW_SLIDE_OUT_BOTTOM
  403.         $aToast_Data[0] = @DesktopWidth - $iToast_Width - 10
  404.         $aToast_Data[1] = $aTray_Pos[1] - $iToast_Height
  405.                 $aToast_Data[2] = 0x00040008 ; $AW_SLIDE_IN_BOTTOM
  406.     Elseif $aTray_Pos[0] > 0 Then
  407.         $iToast_Move = 0x00050001 ; $AW_SLIDE_OUT_RIGHT
  408.         $aToast_Data[0] = $aTray_Pos[0] - $iToast_Width
  409.         $aToast_Data[1] = @DesktopHeight - $iToast_Height - 10
  410.                 $aToast_Data[2] = 0x00040002 ; $AW_SLIDE_IN_RIGHT
  411.     ElseIf $aTray_Pos[2] = @DesktopWidth Then
  412.         $iToast_Move = 0x00050008 ; $AW_SLIDE_OUT_TOP
  413.         $aToast_Data[0] = @DesktopWidth - $iToast_Width - 10
  414.         $aToast_Data[1] = $aTray_Pos[1] + $aTray_Pos[3]
  415.                 $aToast_Data[2] = 0x00040004 ; $AW_SLIDE_IN_TOP
  416.     ElseIf $aTray_Pos[3] = @DesktopHeight Then
  417.         $iToast_Move = 0x00050002 ; $AW_SLIDE_OUT_LEFT
  418.         $aToast_Data[0] = $aTray_Pos[0] + $aTray_Pos[2]
  419.         $aToast_Data[1] = @DesktopHeight - $iToast_Height - 10
  420.                 $aToast_Data[2] = 0x00040001 ; $AW_SLIDE_IN_LEFT
  421.     EndIf

  422.         Return $aToast_Data

  423. EndFunc ; => _Toast_Locate

  424. ; #INTERNAL_USE_ONLY#============================================================================================================
  425. ; Name...........: _Toast_Timer_Check
  426. ; Description ...: Checks whether Toast has timed out or closure [X] clicked
  427. ; Syntax ........: _Toast_Locate($iToast_Width, $iToast_Height)
  428. ; Author ........: Melba23
  429. ; Modified.......:
  430. ; Remarks .......: This function is used internally by _Toast_Show if the Wait parameter is set to False
  431. ; ===============================================================================================================================
  432. Func _Toast_Timer_Check()

  433.         ; Return if timeout not elapsed and [X] not clicked
  434.         If TimerDiff($iToast_Start) < $iToast_Timer And $fToast_Close = False Then Return

  435.         ; Unregister message handler
  436.         GUIRegisterMsg(0x0021, "") ; $WM_MOUSEACTIVATE
  437.         ; Unregister this function
  438.         AdlibUnRegister("_Toast_Timer_Check")
  439.         ; Reset flag
  440.         $fToast_Close = False
  441.         ; Retract slice
  442.         _Toast_Hide()

  443. EndFunc; => _Toast_Timer_Check

  444. ; #INTERNAL_USE_ONLY#============================================================================================================
  445. ; Name...........: _Toast_WM_EVENTS
  446. ; Description ...: Message handler to check if closure [X] clicked
  447. ; Author ........: Melba23
  448. ; Modified.......:
  449. ; Remarks .......: This function is used internally by _Toast_Show if the Wait parameter is set to False
  450. ; ===============================================================================================================================
  451. Func _Toast_WM_EVENTS($hWnd, $Msg, $wParam, $lParam)

  452.         #forceref $wParam, $lParam
  453.     If $hWnd = $hToast_Handle Then
  454.                 If $Msg = 0x0021 Then ; $WM_MOUSEACTIVATE
  455.                         ; Check mouse position
  456.             Local $aPos = GUIGetCursorInfo($hToast_Handle)
  457.             If $aPos[4] = $hToast_Close_X Then $fToast_Close = True
  458.                 EndIf
  459.     EndIf
  460.     Return 'GUI_RUNDEFMSG'

  461. EndFunc; => _Toast_WM_EVENTS

  462. ; #INTERNAL_USE_ONLY#============================================================================================================
  463. ; Name...........: _Toast_GetDefFont
  464. ; Description ...: Determine system default MsgBox font and size
  465. ; Syntax ........: _Toast_GetDefFont($iData)
  466. ; Parameters ....: $iData - 0 = Font point size, 1 = Font name
  467. ; Author ........: Melba23
  468. ; Modified.......:
  469. ; Remarks .......: This function is used internally by _Toast functions
  470. ; ===============================================================================================================================
  471. Func _Toast_GetDefFont($iData)

  472.         ; Get default system font data
  473.         Local $tNONCLIENTMETRICS = DllStructCreate("uint;int;int;int;int;int;byte[60];int;int;byte[60];int;int;byte[60];byte[60];byte[60]")
  474.         DLLStructSetData($tNONCLIENTMETRICS, 1, DllStructGetSize($tNONCLIENTMETRICS))
  475.         DLLCall("user32.dll", "int", "SystemParametersInfo", "int", 41, "int", DllStructGetSize($tNONCLIENTMETRICS), "ptr", DllStructGetPtr($tNONCLIENTMETRICS), "int", 0)
  476.         ; Read font data for MsgBox font
  477.         Local $tLOGFONT = DllStructCreate("long;long;long;long;long;byte;byte;byte;byte;byte;byte;byte;byte;char[32]", DLLStructGetPtr($tNONCLIENTMETRICS, 15))
  478.         Switch $iData
  479.                 Case 0
  480.                         ; Font size as integer
  481.                         Return Int((Abs(DllStructGetData($tLOGFONT, 1)) + 1) * .75)
  482.                 Case 1
  483.                         ; Font name
  484.                         Return DllStructGetData($tLOGFONT, 14)
  485.         EndSwitch

  486. EndFunc ;=>_Toast_GetDefFont
复制代码
 楼主| 发表于 2010-8-14 00:10:11 | 显示全部楼层
回复 10# 131738

StringSize.au3
  1. #include-once

  2. ; #INDEX# ============================================================================================================
  3. ; Title .........: _StringSize
  4. ; AutoIt Version : v3.2.12.1 or higher
  5. ; Language ......: English
  6. ; Description ...: Returns size of rectangle required to display string - width can be chosen
  7. ; Remarks .......:
  8. ; Note ..........:
  9. ; Author(s) .....: Melba23
  10. ; ====================================================================================================================

  11. ;#AutoIt3Wrapper_au3check_parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6

  12. ; #CURRENT# ==========================================================================================================
  13. ; _StringSize: Returns size of rectangle required to display string - maximum permitted width can be chosen
  14. ; ====================================================================================================================

  15. ; #INTERNAL_USE_ONLY#=================================================================================================
  16. ; _StringSize_Error: Returns from error condition after DC and GUI clear up
  17. ; ====================================================================================================================

  18. ; #FUNCTION# =========================================================================================================
  19. ; Name...........: _StringSize
  20. ; Description ...: Returns size of rectangle required to display string - maximum permitted width can be chosen
  21. ; Syntax ........: _StringSize($sText[, $iSize[, $iWeight[, $iAttrib[, $sName[, $iWidth]]]]])
  22. ; Parameters ....: $sText   - String to display
  23. ;                  $iSize   - [optional] Font size in points - default AutoIt GUI default
  24. ;                  $iWeight - [optional] Font weight (400 = normal) - default AutoIt GUI default
  25. ;                  $iAttrib - [optional] Font attribute (0-Normal, 2-Italic, 4-Underline, 8 Strike - default AutoIt
  26. ;                  $sName   - [optional] Font name - default AutoIt GUI default
  27. ;                  $iWidth  - [optional] Width of rectangle - default is unwrapped width of string
  28. ; Requirement(s) : v3.2.12.1 or higher
  29. ; Return values .: Success - Returns array with details of rectangle required for text:
  30. ;                  |$array[0] = String formatted with @CRLF at required wrap points
  31. ;                  |$array[1] = Height of single line in selected font
  32. ;                  |$array[2] = Width of rectangle required to hold formatted string
  33. ;                  |$array[3] = Height of rectangle required to hold formatted string
  34. ;                  Failure - Returns 0 and sets @error:
  35. ;                  |1 - Incorrect parameter type (@extended = parameter index)
  36. ;                  |2 - Failure to create GUI to test label size
  37. ;                  |3 - DLL call error - extended set to indicate which
  38. ;                  |4 - Font too large for chosen width - longest word will not fit
  39. ; Author ........: Melba23
  40. ; Modified ......:
  41. ; Remarks .......:
  42. ; Related .......:
  43. ; Link ..........:
  44. ; Example .......: Yes
  45. ;=====================================================================================================================
  46. Func _StringSize($sText, $iSize = Default, $iWeight = Default, $iAttrib = Default, $sName = Default, $iWidth = 0)

  47.         Local $avSize_Info[4], $aRet, $iLine_Width = 0, $iLast_Word, $iWrap_Count
  48.         Local $hLabel_Handle, $hFont, $hDC, $oFont, $tSize = DllStructCreate("int X;int Y")

  49.         ; Check parameters are correct type
  50.         If Not IsString($sText) Then Return SetError(1, 1, 0)
  51.         If Not IsNumber($iSize) And $iSize <> Default   Then Return SetError(1, 2, 0)
  52.         If Not IsInt($iWeight)  And $iWeight <> Default Then Return SetError(1, 3, 0)
  53.         If Not IsInt($iAttrib)  And $iAttrib <> Default Then Return SetError(1, 4, 0)
  54.         If Not IsString($sName) And $sName <> Default   Then Return SetError(1, 5, 0)
  55.         If Not IsNumber($iWidth) Then Return SetError(1, 6, 0)

  56.         ; Create GUI to contain test labels, set to required font parameters
  57.         Local $hGUI = GUICreate("", 1200, 500, 10, 10)
  58.                 If $hGUI = 0 Then Return SetError(2, 0, 0)
  59.                 GUISetFont($iSize, $iWeight, $iAttrib, $sName)

  60.         ; Store unwrapped text
  61.         $avSize_Info[0] = $sText

  62.         ; Ensure EoL is @CRLF and break text into lines
  63.         If StringInStr($sText, @CRLF) = 0 Then StringRegExpReplace($sText, "[\x0a|\x0d]", @CRLF)
  64.         Local $asLines = StringSplit($sText, @CRLF, 1)

  65.         ; Draw label with unwrapped lines to check on max width
  66.         Local $hText_Label = GUICtrlCreateLabel($sText, 10, 10)
  67.         Local $aiPos = ControlGetPos($hGUI, "", $hText_Label)

  68.         GUISetState(@SW_HIDE)

  69.         GUICtrlDelete($hText_Label)

  70.         ; Store line height for this font size after removing label padding (always 8)
  71.         $avSize_Info[1] = ($aiPos[3] - 8)/ $asLines[0]
  72.         ; Store width and height of this label
  73.         $avSize_Info[2] = $aiPos[2]
  74.         $avSize_Info[3] = $aiPos[3] - 4 ; Reduce margin

  75.         ; Check if wrapping is required
  76.         If $aiPos[2] > $iWidth And $iWidth > 0 Then

  77.                 ; Set returned text element to null
  78.                 $avSize_Info[0] = ""

  79.                 ; Set width element to max allowed
  80.                 $avSize_Info[2] = $iWidth

  81.                 ; Set line count to zero
  82.                 Local $iLine_Count = 0

  83.                 ; Take each line in turn
  84.                 For $j = 1 To $asLines[0]

  85.                         ; Size this line unwrapped
  86.                         $hText_Label = GUICtrlCreateLabel($asLines[$j], 10, 10)
  87.                         $aiPos = ControlGetPos($hGUI, "", $hText_Label)
  88.                         GUICtrlDelete($hText_Label)

  89.                         ; Check wrap status
  90.                         If $aiPos[2] < $iWidth Then
  91.                                 ; No wrap needed so count line and store
  92.                                 $iLine_Count += 1
  93.                                 $avSize_Info[0] &= $asLines[$j] & @CRLF
  94.                         Else
  95.                                 ; Wrap needed so need to count wrapped lines

  96.                                 ; Create label to hold line as it grows
  97.                                 $hText_Label = GUICtrlCreateLabel("", 0, 0)
  98.                                 ; Initialise Point32 method
  99.                                 $hLabel_Handle = ControlGetHandle($hGui, "", $hText_Label)
  100.                                 ; Get DC with selected font
  101.                                 $aRet = DllCall("User32.dll", "hwnd", "GetDC", "hwnd", $hLabel_Handle)
  102.                                 If @error Then _StringSize_Error(3, 1, $hLabel_Handle, 0, $hGUI)
  103.                                 $hDC = $aRet[0]
  104.                                 $aRet = DllCall("user32.dll", "lparam", "SendMessage", "hwnd", $hLabel_Handle, "int", 0x0031, "wparam", 0, "lparam", 0) ; $WM_GetFont
  105.                                 If @error Then _StringSize_Error(3, 2, $hLabel_Handle, $hDC, $hGUI)
  106.                                 $hFont = $aRet[0]
  107.                                 $aRet = DllCall("GDI32.dll", "hwnd", "SelectObject", "hwnd", $hDC, "hwnd", $hFont)
  108.                                 If @error Then _StringSize_Error(3, 3, $hLabel_Handle, $hDC, $hGUI)
  109.                                 $oFont = $aRet[0]
  110.                                 If $oFont = 0 Then _StringSize_Error(3, 4, $hLabel_Handle, $hDC, $hGUI)

  111.                                 ; Zero counter
  112.                                 $iWrap_Count = 0

  113.                                 While 1

  114.                                         ; Set line width to 0
  115.                                         $iLine_Width = 0
  116.                                         ; Initialise pointer for end of word
  117.                                         $iLast_Word = 0

  118.                                         For $i = 1 To StringLen($asLines[$j])

  119.                                                 ; Is this just past a word ending?
  120.                                                 If StringMid($asLines[$j], $i, 1) = " " Then $iLast_Word = $i - 1
  121.                                                 ; Increase line by one character
  122.                                                 Local $sTest_Line = StringMid($asLines[$j], 1, $i)
  123.                                                 ; Place line in label
  124.                                                 GUICtrlSetData($hText_Label, $sTest_Line)

  125.                                                 ; Get line length into size structure
  126.                                                 $iSize = StringLen($sTest_Line)
  127.                                                 DllCall("GDI32.dll", "int", "GetTextExtentPoint32", "hwnd", $hDC, "str", $sTest_Line, "int", $iSize, "ptr", DllStructGetPtr($tSize))
  128.                                                 If @error Then _StringSize_Error(3, 5, $hLabel_Handle, $hDC, $hGUI)
  129.                                                 $iLine_Width = DllStructGetData($tSize, "X")

  130.                                                 ; If too long exit the loop
  131.                                                 If $iLine_Width >= $iWidth - Int($iSize / 2) Then ExitLoop
  132.                                         Next

  133.                                         ; End of the line of text?
  134.                                         If $i > StringLen($asLines[$j]) Then
  135.                                                 ; Yes, so add final line to count
  136.                                                 $iWrap_Count += 1
  137.                                                 ; Store line
  138.                                                 $avSize_Info[0] &= $sTest_Line & @CRLF
  139.                                                 ExitLoop
  140.                                         Else
  141.                                                 ; No, but add line just completed to count
  142.                                                 $iWrap_Count += 1
  143.                                                 ; Check at least 1 word completed or return error
  144.                                                 If $iLast_Word = 0 Then
  145.                                                         _StringSize_Error(4, 0, $hLabel_Handle, $hDC, $hGUI)
  146.                                                 EndIf
  147.                                                 ; Store line up to end of last word
  148.                                                 $avSize_Info[0] &= StringLeft($sTest_Line, $iLast_Word) & @CRLF
  149.                                                 ; Strip string to point reached
  150.                                                 $asLines[$j] = StringTrimLeft($asLines[$j], $iLast_Word)
  151.                                                 ; Trim leading whitespace
  152.                                                 $asLines[$j] = StringStripWS($asLines[$j], 1)
  153.                                                 ; Repeat with remaining characters in line
  154.                                         EndIf

  155.                                 WEnd

  156.                                 ; Add the number of wrapped lines to the count
  157.                                 $iLine_Count += $iWrap_Count

  158.                                 ; Clean up
  159.                                 DllCall("User32.dll", "int", "ReleaseDC", "hwnd", $hLabel_Handle, "hwnd", $hDC)
  160.                                 If @error Then _StringSize_Error(3, 6, $hLabel_Handle, $hDC, $hGUI)
  161.                                 GUICtrlDelete($hText_Label)

  162.                         EndIf

  163.                 Next

  164.                 ; Convert lines to pixels and add reduced margin
  165.                 $avSize_Info[3] = ($iLine_Count * $avSize_Info[1]) + 4

  166.         EndIf

  167.         ; Clean up
  168.         GUIDelete($hGUI)

  169.         ; Return array
  170.         Return $avSize_Info

  171. EndFunc ; => _StringSize

  172. ; #INTERNAL_USE_ONLY#============================================================================================================
  173. ; Name...........: _StringSize_Error
  174. ; Description ...: Returns from error condition after DC and GUI clear up
  175. ; Syntax ........: _StringSize_Error($iError, $iExtended, $hLabel_Handle, $hDC, $hGUI)
  176. ; Parameters ....: $iError  - required error value to return
  177. ;                  $iExtended - required extended value to return
  178. ;                  $hLabel_Handle, $hDC, $hGUI - variables as set in _StringSize function
  179. ; Author ........: Melba23
  180. ; Modified.......:
  181. ; Remarks .......: This function is used internally by _StringSize
  182. ; ===============================================================================================================================
  183. Func _StringSize_Error($iError, $iExtended, $hLabel_Handle, $hDC, $hGUI)

  184.         ; Release DC if created
  185.         DllCall("User32.dll", "int", "ReleaseDC", "hwnd", $hLabel_Handle, "hwnd", $hDC)
  186.         ; Delete GUI
  187.         GUIDelete($hGUI)
  188.         ; Return with extended set
  189.         Return SetError($iError, $iExtended, 0)

  190. EndFunc ; => _StringSize_Error
复制代码
 楼主| 发表于 2010-8-14 00:13:06 | 显示全部楼层
本帖最后由 131738 于 2010-8-14 00:56 编辑

回复 11# 131738

示例文件:Toast_Example.au3
  1. ;Example Toast

  2. #include "Toast.au3"

  3. Local $sMsg, $hProgress, $aRet[2]

  4. $sMsg  = "The message text goes in this area" & @CRLF & @CRLF
  5. $sMsg &= "This Toast uses the System colours and font"

  6. $aRet = _Toast_Show(0, "The Title text goes here", $sMsg, 5)
  7. ConsoleWrite("Toast size: " & $aRet[0] & " x " & $aRet[1] & @CRLF)
  8. _Toast_Hide()

  9. $sMsg  = "This Toast uses colours and font defined in a _Toast_Set call." & @CRLF & @CRLF
  10. $sMsg &= "Subsequent Toasts will use these values until they are reset by another _Toast_Set call" & @CRLF & @CRLF
  11. $sMsg &= "You can also display a standard icon - or one from an exe as here" & @CRLF & @CRLF
  12. $sMsg &= "The next Toast has a very small message to show the pre-set minimum size"

  13. _Toast_Set(5, 0xFF00FF, 0xFFFF00, 0x0000FF, 0xFFFFFF, 10, "Arial")
  14. $aRet = _Toast_Show(@AutoItExe, "User-defined Colours and Bold Header", $sMsg, 10)
  15. ConsoleWrite("Toast size: " & $aRet[0] & " x " & $aRet[1] & @CRLF)
  16. _Toast_Hide()

  17. $aRet = _Toast_Show(0, "", "Tiny", 2)
  18. ConsoleWrite("Toast size: " & $aRet[0] & " x " & $aRet[1] & @CRLF)
  19. _Toast_Hide()

  20. $sMsg  = "These lines are of medium length" & @CRLF & @CRLF
  21. $sMsg &= "The width is set by the longest" & @CRLF & @CRLF
  22. $sMsg &= "No wrapping occurs here" & @CRLF & @CRLF
  23. $sMsg &= "Note increased font size"

  24. _Toast_Set(-1, -1, -1, -1, -1, 15)
  25. $aRet = _Toast_Show(0, "Mid Width", $sMsg, 5)
  26. ConsoleWrite("Toast size: " & $aRet[0] & " x " & $aRet[1] & @CRLF)
  27. _Toast_Hide()

  28. $sMsg  = "This is a long message set to left justified and a much larger font using _Toast_Set" & @CRLF & @CRLF
  29. $sMsg &= "The Toast is automatically set to the maximum preset width and the message text "
  30. $sMsg &= "is wrapped as necessary to fit within the margins of the Toast" & @CRLF & @CRLF
  31. $sMsg &= "The Toast colours and weight have been changed by another _Toast_Set call" & @CRLF & @CRLF
  32. $sMsg &= "Note the closure [X] on the title bar.  This Toast will time out in 30 secs "
  33. $sMsg &= "but clicking the [X] will resume the script immediately"

  34. _Toast_Set(0, -1, 0xFFFF00, 0x00FF00, 0x000000, 15, "Courier New")
  35. $aRet = _Toast_Show(64, "Max Width and Normal Header", $sMsg, -30)
  36. ConsoleWrite("Toast size: " & $aRet[0] & " x " & $aRet[1] & @CRLF)
  37. _Toast_Hide()

  38. $sMsg  = "This line is very long to show that you can override the pre-set maximum width with the 'Raw' parameter. "
  39. $sMsg &= "You have to add a few more parameters to the _Toast_Show call but that is a small price to pay"
  40. $sMsg &= @CRLF & @CRLF & "However, the Toast will not display if it does not fit on the screen!"

  41. _Toast_Set(5, 0xFF00FF, 0xFFFF00, 0x0000FF, 0xFFFFFF, 10, "Arial")
  42. $aRet = _Toast_Show(0, "Unwrapped Toast", $sMsg, -20, True, True)
  43. ConsoleWrite("Toast size: " & $aRet[0] & " x " & $aRet[1] & @CRLF)
  44. _Toast_Hide()

  45. $sMsg  = "Note how Toasts adjust automatically in height to display all of the message "
  46. $sMsg &= "regardless of whether there is a title bar to display, the font used, "
  47. $sMsg &= "the number of lines or whether wrapping occurs" & @CRLF & @CRLF
  48. $sMsg &= "This Toast will retract automatically when the next Toast is called "
  49. $sMsg &= "or when the [X] is clicked"

  50. $aRet = _Toast_Show(0, "", $sMsg, -10)
  51. ConsoleWrite("Toast size: " & $aRet[0] & " x " & $aRet[1] & @CRLF)

  52. $sMsg  = "This Toast has several blank lines inserted. "
  53. $sMsg &= "This can be useful if you want to leave space to add other controls, "
  54. $sMsg &= "such as a progress bar, to the Toast once it is displayed" & @CRLF & @CRLF & @CRLF & @CRLF
  55. $sMsg &= "The Toast size is returned by the function so you can calculate "
  56. $sMsg &= "where to place the other controls.  "
  57. $sMsg &= "This example script writes the size in the SciTE console" & @CRLF & @CRLF
  58. $sMsg &= "Note that Toast colours and font have been reset to Default"

  59. _Toast_Set(Default)
  60. $aRet = _Toast_Show(0, "Progress Bar", $sMsg, 0) ; No delay or progress bar will not display immediately
  61. ConsoleWrite("Toast size: " & $aRet[0] & " x " & $aRet[1] & @CRLF)
  62. $hProgress = GUICtrlCreateProgress(10, 65, $aRet[0] - 20, 20)
  63. For $i = 1 To 100
  64.         GUICtrlSetData($hProgress, $i)
  65.         Sleep(50)
  66. Next
  67. Sleep(5000)
  68. _Toast_Hide()

  69. $sMsg  = "This Toast has the 'Wait' flag set to False. " & @CRLF & @CRLF
  70. $sMsg &= "That means that the script will continue while the Toast is displayed as "
  71. $sMsg &= "as you can see from this counter." & @CRLF & @CRLF
  72. $sMsg &= "Clicking the [X] will retract the Toast immediately but it will "
  73. $sMsg &= "automatically retract after 20 seconds in any event"

  74. _Toast_Set(5, 0xFF00FF, 0xFFFF00, 0x0000FF, 0xFFFFFF, 10)
  75. $aRet = _Toast_Show(32, "Script Continuing", $sMsg, -20, False) ; Delay can be set here because script continues
  76. ConsoleWrite("Toast size: " & $aRet[0] & " x " & $aRet[1] & @CRLF)
  77. $hLabel = GUICtrlCreateLabel("", 267, 98, 15, 15)
  78. GUICtrlSetBkColor(-1, 0xFFFF00)
  79. $iCount = 0
  80. Do
  81.         $iCount += 1
  82.         GUICtrlSetData($hLabel, StringFormat("%2s", $iCount))
  83.         Sleep(1000)
  84. Until $iCount = 60 Or $hToast_Handle = 0 ; Toast will retract automatically before $iCount = 60

  85. Exit
复制代码
1 楼的可能是早期代码,这是本年7月的改良脚本。。。。
发表于 2010-8-14 13:17:08 | 显示全部楼层
这是昨天修改的,也是将例子分开了。
修改了_StringSize() ,在其最后增加了一个参数 $Lang ,为1时使用汉字环境(默认),为0时使用英文环境。
同时 _Toast_Show() 也同时增加了此参数。因为_StringSize() 是使用 _Toast_Show() 调用的

本帖子中包含更多资源

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

x

评分

参与人数 1贡献 +15 收起 理由
xyhqqaa + 15 好玩。。。。看看Afan哥。。学习ing

查看全部评分

发表于 2010-8-14 16:33:49 | 显示全部楼层
谢谢各位大侠
 楼主| 发表于 2010-8-14 18:57:50 | 显示全部楼层
回复 13# afan

幸苦了。。。。谢谢!!!!!!!!!!!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2021-5-7 17:25 , Processed in 0.171875 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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