Jump to content

Color the 2e text in a label


Go to solution Solved by Kovacic,

Recommended Posts

Posted

i want to color the error red in the label. is there a easy way for it without make 3 different labels?

GUICtrlCreateLabel("File 1 Success!" & @CRLF & "File 2 Error!" & @CRLF & "File 3 Success!")

output:

File 1 Success!

File 2 Error!

File 3 Success!

 

  • Solution
Posted

Not that I have ever seen. When you set a style, it sets for GUICtrlCreateLabel. The only other way is if you create RTF in an edit box or HTML, and embed the HTML.

Is it possible? Yes. Is it easier than making 3 labels? not really, no.

C0d3 is P0etry( ͡° ͜ʖ ͡°)

Posted (edited)

Here is a loose example of embedding an HTML file in autoit.. Using this, just use the color tags as needed:

; R E P O R T I N G     T O O L
#include <windowsConstants.au3>
#include <IE.au3>
#include <file.au3>
#include <Date.au3>

global $File = @ScriptDir & "\" & "test1.htm"
If FileExists($File) then filedelete($File)
FileWrite("test1.htm", '<!-- SWAT Generated Report -->'  & @CRLF & @CRLF & @CRLF & '<html><head><meta http-equiv="refresh" content="1"><body bgcolor="#C0C0C0"><style> p.arial { font-family: Arial, Helvetica, sans-serif;}</style></head><body>')
; Log file Header
FileWrite("test1.htm", '<p class="arial"><table border="1" style="width:1200px"><h2>Job Report created by ' & @COMPUTERNAME & '</h2> Started on ' & _DateTimeFormat(_NowCalc(), 1) & ' at ' & _DateTimeFormat(_NowCalc(), 3) & '<br><hr><br>' & @CRLF)
; Table Header
FileWrite("test1.htm", '<!-- Autoit Generated Code. This will be used to parse the file, yet remain invisible to those viewing the log.-->' & @CRLF & '<tr><td>Command Name</td><td>Job#</td><td>Command String</td><td>Start</td><td>Stop</td><td>Elapsed</td></tr> ' & @CRLF)
$oIE = _IECreateEmbedded()
$GUI = GUICreate("Report", (@DesktopWidth), (@DesktopHeight - 100),-1,-1, $WS_OVERLAPPEDWINDOW + $WS_VISIBLE + $WS_CLIPSIBLINGS)
$GUIActiveX = GUICtrlCreateObj($oIE, 10, 40, 1400, 600)
GUISetState() ;Show GUI
_IENavigate($oIE, $File)
; Table Entry
for $i = 1 to 10
FileWrite("test1.htm", '<tr><td>' & 'A whole bunch of words' & '</td><td>' & Random(1000, 9999, 1) & '</td><td>' & 'My Command' & '</td><td>' &  _DateTimeFormat(_NowCalc(), 1) & ' at ' & _DateTimeFormat(_NowCalc(), 3) & '</td><td>'  & _DateTimeFormat(_NowCalc(), 1) & ' at ' & _DateTimeFormat(_NowCalc(), 3) &  '</td><td>' & Random(1, 99, 1) & ' minutes' & '</td></tr>' & @CRLF)
sleep(2000)
next
; End Table
FileWrite("test1.htm", '</table></p><BR><BR><h2>Report Complete</H2>' & @CRLF)
$szText = FileRead($File,FileGetSize($File))
$szText = StringReplace($szText, '<meta http-equiv="refresh" content="1">', "<!--Refresh_Off-->")
FileDelete($File)
FileWrite($File,$szText)
sleep(10000)

I made this testing another function , so ignore the rest i guess.

Edited by Kovacic

C0d3 is P0etry( ͡° ͜ʖ ͡°)

Posted (edited)

 Do the old labels have to persist (is a more apt question than the pre-edit retarded one)?   I like using my bastardization of Melbas ExtMsgBox to notify the user in color.

#include "Extmsgbox_colored.au3"


_msgdisplay("This is an error")
_msgdisplay("This is a success")
_msgdisplay("This is a party")



Func _msgdisplay($sstring)

If stringinstr($sstring , "error") Then

_ExtMsgBox(0, 0, "This is an error", $sstring , 5, -1, 100, 0xFF0000, 0xFF0000)

ElseIf stringinstr($sstring , "success") Then

_ExtMsgBox(0, 0, "This is a success", $sstring , 5, -1, 100, 0x00FF00, 0x00FF00)

ElseIf stringinstr($sstring , "party") Then

_ExtMsgBox(0, 0, "This is a party", $sstring , 5, -1, 100, 0xFFFFFF, 0xFFFFFF)


EndIf

EndFunc

ExtMsgBox_colored.au3 

;;;;; NO RAINBOW TEXT, Perfect response from OK and X

#include-once

; #INDEX# ============================================================================================================
; Title .........: ExtMsgBox
; AutoIt Version : v3.2.12.1 or higher
; Language ......: English
; Description ...: Generates user defined message boxes centred on an owner, on screen or at defined coordinates
; Remarks .......:
; Note ..........:
; Author(s) .....: Melba23, based on some original code by photonbuddy & YellowLab, and KaFu (default font data)
; ====================================================================================================================

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

; #INCLUDES# =========================================================================================================
#include <StringSize.au3>
#include <Array.au3>

; #GLOBAL CONSTANTS# =================================================================================================
;~ Global Const $MB_IConstop = 16 ; Stop-sign icon
Global Const $MB_ICONQUERY = 32 ; Question-mark icon
Global Const $MB_ICONEXCLAM = 48 ; Exclamation-point icon
Global Const $MB_ICONINFO = 64 ; Icon consisting of an 'i' in a circle

; #GLOBAL VARIABLES# =================================================================================================
; Default settings
Global $aEMB_FontData = _GetDefaultEMBFont()
Global $iDef_EMB_Font_Size = $aEMB_FontData[0]
Global $sDef_EMB_Font_Name = $aEMB_FontData[1]
$aEMB_FontData = 0
Global $iDef_EMB_BkCol = DllCall("User32.dll", "int", "GetSysColor", "int", 15) ; $COLOR_3DFACE = 15
$iDef_EMB_BkCol = $iDef_EMB_BkCol[0]
Global $iDef_EMB_Col = DllCall("User32.dll", "int", "GetSysColor", "int", 8) ; $COLOR_WINDOWTEXT = 8
$iDef_EMB_Col = $iDef_EMB_Col[0]
; Current settings
Global $iEMB_Style = 0
Global $iEMB_Just = 0
Global $iEMB_BkCol = $iDef_EMB_BkCol
Global $iEMB_Col = $iDef_EMB_Col
Global $sEMB_Font_Name = $sDef_EMB_Font_Name
Global $iEMB_Font_Size = $iDef_EMB_Font_Size

Global $hEMB_Word, $iRippleNumber, $iRippleMax, $aRippleText , $WordColor , $LabelColor , $Wcolor ,$fCountdown

; #CURRENT# ==========================================================================================================
; _ExtMsgBoxSet: Sets the GUI style, justification, colours and font for subsequent _ExtMsgBox function calls
; _ExtMsgBox: Generates user defined message boxes centred on an owner, on screen or at defined coordinates
; ====================================================================================================================

; #INTERNAL_USE_ONLY#=================================================================================================
; _GetDefaultEMBFont: Determines Windows default MsgBox font size and name
; ====================================================================================================================

; #FUNCTION# =========================================================================================================
; Name...........: _ExtMsgBoxSet
; Description ...: Sets the GUI style, justification, colours and font for subsequent _ExtMsgBox function calls
; Syntax.........: _ExtMsgBoxSet($iStyle, $iJust, [$iBkCol, [$iCol, [$sFont_Size, [$iFont_Name]]]])
; Parameters ....: $iStyle -> 0 (Default) - Button on TaskBar, TOPMOST style set, button use selected font.
; Combine following to change:
; 1 = Button does not appear on TaskBar
; 2 = TOPMOST Style not set
; 4 = Buttons use default font
; >>>>>>>>>> Setting this parameter to 'Default' will reset ALL parameters to default values <<<<
; $iJust -> 0 = Left justified (Default), 1 = Centred , 2 = Right justified
; + 4 = Centred single button. Note: multiple buttons are always centred
; ($SS_LEFT, $SS_CENTER, $SS_RIGHT can also be used)
; $iBkCol -> The colour for the message box background. Default = system colour
; $iCol -> The colour for the message box text. Default = system colour
; Omitting a colour parameter or setting -1 leaves it unchanged
; Setting a colour parameter to Default resets the system message box colour
; $iFont_Size -> The font size in points to use for the message box. Default = system font size
; $sFont_Name -> The font to use for the message box. Default = system font
; Omitting a font parameter or setting font size to -1 or font name to "" = unchanged
; Setting a font parameter to Default resets the system message box font and size
; Requirement(s).: v3.2.12.1 or higher
; Return values .: Success - Returns 1
; Failure - Returns 0 and sets @error to 1 with @extended set to parameter index number
; Remarks .......;
; Author ........: Melba23
; Example........; Yes
;=====================================================================================================================

Func _ExtMsgBoxSet($iStyle = 0, $iJust = 0, $iBkCol = -1, $iCol = -1, $iFont_Size = -1, $sFont_Name = "")

; Set global EMB variables to required values
Switch $iStyle
Case Default
$iEMB_Style = 0 ; Button on TaskBar and $WS_EX_TOPMOST
$iEMB_Just = 0 ; $SS_LEFT
$iEMB_BkCol = $iDef_EMB_BkCol
$iEMB_Col = $iDef_EMB_Col
$sEMB_Font_Name = $sDef_EMB_Font_Name
$iEMB_Font_Size = $iDef_EMB_Font_Size
Return
Case 0 To 7
$iEMB_Style = $iStyle
Case Else
Return SetError(1, 1, 0)
EndSwitch

Switch $iJust
Case 0, 1, 2, 4, 5, 6
$iEMB_Just = $iJust
Case Else
Return SetError(1, 2, 0)
EndSwitch

Switch $iBkCol
Case Default
$iEMB_BkCol = $iDef_EMB_BkCol
Case -1
; Do nothing
Case 0 To 0xFFFFFF
$iEMB_BkCol = $iDef_EMB_BkCol
Case Else
Return SetError(1, 3, 0)
EndSwitch

Switch $iCol
Case Default
$iEMB_Col = $iDef_EMB_Col
Case -1
; Do nothing
Case 0 To 0xFFFFFF
$iEMB_Col = $iDef_EMB_Col
Case Else
Return SetError(1, 4, 0)
EndSwitch

Switch $iFont_Size
Case Default
$iEMB_Font_Size = $iDef_EMB_Font_Size
Case 8 To 72
$iEMB_Font_Size = Int($iFont_Size)
Case -1
; Do nothing
Case Else
Return SetError(1, 5, 0)
EndSwitch

Switch $sFont_Name
Case Default
$sEMB_Font_Name = $sDef_EMB_Font_Name
Case ""
; Do nothing
Case Else
If IsString($sFont_Name) Then
$sEMB_Font_Name = $sFont_Name
Else
Return SetError(1, 6, 0)
EndIf
EndSwitch

Return 1

EndFunc ;==>_ExtMsgBoxSet

; #FUNCTION# =========================================================================================================
; Name...........: _ExtMsgBox
; Description ...: Generates user defined message boxes centred on an owner, on screen or at defined coordinates
; Syntax.........: _ExtMsgBox ($vIcon, $vButton, $sTitle, $sText, [$iTimeout, [$hWin, [$iVPos]]])
; Parameters ....: $vIcon -> The icon to use: 0 - No icon, 8 - UAC, or a $MB_ICON constant as follows
; 16 - Stop, 32 - Query, 48 - Exclamation, 64 - Information
; 128 - Countdown if $iTimeout set
; Any other numeric value returns -1, error 1
; If set to the name of an exe, the main icon of that exe will be displayed
; If set to the name of an icon, the icon will be displayed
; $vButton -> Button text separated with "|" character.
; An ampersand (&) before the text indicates the default button.
; Two focus ampersands returns -1, error 2. A single button is always default
; Pressing Enter or Space fires default button
; Can also use $MB_ button numeric constants: 0 = "OK", 1 = "&OK|Cancel",
; 2 = "&Abort|Retry|Ignore", 3 = "&Yes|No|Cancel", 4 = "&Yes|No", 5 = "&Retry|Cancel",
; 6 = "&Cancel|Try Again|Continue". Other values return -1, error 3
; Default max width of 370 gives 1-4 buttons @ width 80, 5 @ width 60, 6 @ width 50
; Min button width set at 50, so unless default changed 7 buttons returns -1, error 4
; $sTitle -> The title of the message box
; $sText -> The text to be displayed. Long lines will wrap. The box depth is adjusted to fit
; The preset max width can increase to a preset absolute value if required
; $iTimeout -> Timeout delay before EMB closes. 0 = no timeout (Default)
; $hWin -> Handle of the window in which EMB is centred
; If window is hidden or no handle passed EMB centred in display (Default)
; If parameter does not hold valid window handle, it is interpreted as horizontal
; coordinate for EMB location
; $iVPos -> Vertical coordinate for EMB location, only if $hWin parameter is
; interpreted as horizontal coordinate. (Default = 0)
; $LabelColor -> Color of the CountDown Number. 0xFFFFFF (White) = Random , Default is 0 (Black).
; $WordColor -> Color of the Text in the box. 0xFFFFFF (White) = Random , Default is 0 (Black).
; Requirement(s).: v3.2.12.1 or higher
; Return values .: Success: Returns 1-based index of the button pressed, counting from the LEFT.
; Returns 0 if closed by a "CloseGUI" event (i.e. click [X] or press Escape)
; Returns 9 if timed out
; Failure: Returns -1 and sets @error as follows:
; 1 - Icon error
; 2 - Multiple default button error
; 3 - Button constant error
; 4 - Too many buttons to fit max GUI size
; 5 - StringSize error
; 6 - GUI creation error
; Remarks .......; EMB position automatically adjusted to appear on screen
; Author ........: Melba23, based on some original code by photonbuddy & YellowLab
; Example........; Yes
;=====================================================================================================================

Func _ExtMsgBox($vIcon, $vButton, $sTitle, $sText, $iTimeout = 0, $hWin = "", $iVPos = 0, $LabelColor = 0, $WordColor = 0)

Global $wColor = $WordColor

Local $iParent_Win = 0

Local $nOldOpt = Opt('GUIOnEventMode', 0)

; Set default sizes for message box
Local $iMsg_Width_max = 370, $iMsg_Width_min = 150, $iMsg_Width_abs = 500
Local $iMsg_Height_min = 100
Local $iButton_Width_max = 80, $iButton_Width_min = 50

; Declare local variables
Local $iButton_Width_Req, $iButton_Width, $iButton_Xpos, $iRet_Value, $iHpos

;; Check for icon
Local $iIcon_Style = 0
Local $iIcon_Reduction = 50
Local $sDLL = "user32.dll"
If StringIsDigit($vIcon) Then
Switch $vIcon
Case 0
$iIcon_Reduction = 0
Case 8
$sDLL = "imageres.dll"
$iIcon_Style = 78
Case 16 ; Stop
$iIcon_Style = -4
Case 32 ; Query
$iIcon_Style = -3
Case 48 ; Exclam
$iIcon_Style = -2
Case 64 ; Info
$iIcon_Style = -5
Case 128 ; Countdown
If $iTimeout > 0 Then
$fCountdown = True
Else
ContinueCase
EndIf
Case Else
$nOldOpt = Opt('GUIOnEventMode', $nOldOpt)
Return SetError(1, 0, -1)
EndSwitch
Else
$sDLL = $vIcon
$iIcon_Style = 0
EndIf

; Check if two buttons are seeking focus
StringRegExpReplace($vButton, "((?<!&)&)(?!&)", "*")
If @extended > 1 Then
$nOldOpt = Opt('GUIOnEventMode', $nOldOpt)
Return SetError(2, 0, -1)
EndIf

; Check if using constants or text
If IsNumber($vButton) Then
Switch $vButton
Case 0
$vButton = "OK"
Case 1
$vButton = "&OK|Cancel"
Case 2
$vButton = "&Abort|Retry|Ignore"
Case 3
$vButton = "&Yes|No|Cancel"
Case 4
$vButton = "&Yes|No"
Case 5
$vButton = "&Retry|Cancel"
Case 6
$vButton = "&Cancel|Try Again|Continue"
Case Else
$nOldOpt = Opt('GUIOnEventMode', $nOldOpt)
Return SetError(3, 0, -1)
EndSwitch
EndIf

; Get message label size
While 1
Local $aLabel_Pos = _StringSize($sText, $iEMB_Font_Size, Default, Default, $sEMB_Font_Name, $iMsg_Width_max - 20 - $iIcon_Reduction)
If @error Then
If $iMsg_Width_max = $iMsg_Width_abs Then
$nOldOpt = Opt('GUIOnEventMode', $nOldOpt)
Return SetError(5, 0, -1)
Else
$iMsg_Width_max += 10
EndIf
Else
ExitLoop
EndIf
WEnd

; Reset text to wrapped version
$sText = $aLabel_Pos[0]

; Get individual button text
Local $aButtons = StringSplit($vButton, "|")
; Get minimum GUI width needed for buttons
Local $iMsg_Width_Button = ($iButton_Width_max + 10) * $aButtons[0] + 10
; If shorter than min width
If $iMsg_Width_Button < $iMsg_Width_min Then
; Set buttons to max size and leave box min width unchanged
$iButton_Width = $iButton_Width_max
Else
; Check button width needed to fit within max box width
$iButton_Width_Req = ($iMsg_Width_max - (($aButtons[0] + 1) * 10)) / $aButtons[0]
; Button width less than min button width permitted
If $iButton_Width_Req < $iButton_Width_min Then
$nOldOpt = Opt('GUIOnEventMode', $nOldOpt)
Return SetError(4, 0, -1)
; Buttons only need resizing to fit
ElseIf $iButton_Width_Req < $iButton_Width_max Then
; Set box to max width and set button size as required
$iMsg_Width_Button = $iMsg_Width_max
$iButton_Width = $iButton_Width_Req
; Buttons can be max size
Else
; Set box min width to fit buttons
$iButton_Width = $iButton_Width_max
$iMsg_Width_min = $iMsg_Width_Button
EndIf
EndIf
; Determine final button width required
$iButton_Width_Req = Int((($iButton_Width + 10) * $aButtons[0]) + 10)

; Set label size
Local $iLabel_Width = $aLabel_Pos[2]
Local $iLabel_Height = $aLabel_Pos[3]
; Set GUI size
Local $iMsg_Width = $iLabel_Width + 20 + $iIcon_Reduction
; Increase width to fit buttons if needed
If $iButton_Width_Req > $iMsg_Width Then $iMsg_Width = $iButton_Width_Req
If $iMsg_Width < $iMsg_Width_min Then
$iMsg_Width = $iMsg_Width_min
$iLabel_Width = $iMsg_Width_min - 20
EndIf
Local $iMsg_Height = $iLabel_Height + 65
If $iMsg_Height < $iMsg_Height_min Then $iMsg_Height = $iMsg_Height_min

; If only single line, lower label to to centre text on icon
Local $iLabel_Vert = 20
If StringInStr($sText, @CRLF) = 0 Then $iLabel_Vert = 27

; Check for taskbar button style required
If Mod($iEMB_Style, 2) = 1 Then ; Hide taskbar button so create as child
If IsHWnd($hWin) Then
$iParent_Win = $hWin ; Make child of that window
Else
$iParent_Win = WinGetHandle(AutoItWinGetTitle()) ; Make child of AutoIt window
EndIf
EndIf

; Determine EMB location
If $hWin = "" Then
; No handle or position passed so centre on screen
$iHpos = (@DesktopWidth - $iMsg_Width) / 2
$iVPos = (@DesktopHeight - $iMsg_Height) / 2
Else
If IsHWnd($hWin) Then
; Get parent GUI pos if visible
If BitAND(WinGetState($hWin), 2) Then
; Set EMB to centre on parent
Local $aPos = WinGetPos($hWin)
$iHpos = ($aPos[2] - $iMsg_Width) / 2 + $aPos[0] - 3
$iVPos = ($aPos[3] - $iMsg_Height) / 2 + $aPos[1] - 20
Else
; Set EMB to centre om screen
$iHpos = (@DesktopWidth - $iMsg_Width) / 2
$iVPos = (@DesktopHeight - $iMsg_Height) / 2
EndIf
Else
; Assume parameter is horizontal coord
$iHpos = $hWin ; $iVpos already set
EndIf
EndIf

; Now check to make sure GUI is visible on screen
; First horizontally
If $iHpos < 10 Then $iHpos = 10
If $iHpos + $iMsg_Width > @DesktopWidth - 20 Then $iHpos = @DesktopWidth - 20 - $iMsg_Width
; Then vertically
If $iVPos < 10 Then $iVPos = 10
If $iVPos + $iMsg_Height > @DesktopHeight - 60 Then $iVPos = @DesktopHeight - 60 - $iMsg_Height

; Remove TOPMOST extended style if required
Local $iExtStyle = 0x00000008 ; $WS_TOPMOST
If BitAND($iEMB_Style, 2) Then $iExtStyle = -1

; Create GUI with $WS_POPUPWINDOW, $WS_CAPTION style and required extended style
Local $hMsgGUI = GUICreate($sTitle, $iMsg_Width, $iMsg_Height, $iHpos, $iVPos, BitOR(0x80880000, 0x00C00000), $iExtStyle, $iParent_Win)
If @error Then
$nOldOpt = Opt('GUIOnEventMode', $nOldOpt)
Return SetError(6, 0, -1)
EndIf
If $iEMB_BkCol <> Default Then $iEMB_BkCol = $iDef_EMB_BkCol

; Set centring parameter
Local $iLabel_Style = 0 ; $SS_LEFT
If BitAND($iEMB_Just, 1) = 1 Then
$iLabel_Style = 1 ; $SS_CENTER
ElseIf BitAND($iEMB_Just, 2) = 2 Then
$iLabel_Style = 2 ; $SS_RIGHT
EndIf

; Create label
$aRippleText = StringSplit($sText, '', 2)
Dim $Btext = $aRippleText
;~ _ArrayDisplay($aRippleText)
;~ _ArrayDisplay($Btext)
For $n = 1 To UBound($aRippleText) - 1
$Spaces = ""
For $x = 1 To $n
$Spaces &= $Btext[$x - 1]
Next
$aRippleText[$n] = $Spaces & $aRippleText[$n]
;~ _ArrayDisplay($aRippleText)
Next

$hEMB_Word = GUICtrlCreateLabel($sText, 10 + $iIcon_Reduction, $iLabel_Vert, $iLabel_Width, $iLabel_Height, $iLabel_Style)

GUICtrlSetFont(-1, $iEMB_Font_Size, Default, Default, $sEMB_Font_Name)
If $iEMB_Col <> Default Then
If $WordColor = 0xFFFFFF Then
GUICtrlSetColor(-1, Random(0, $WordColor))
Else
GUICtrlSetColor(-1, $WordColor)
EndIf
EndIf
; Create icon or countdown timer
If $fCountdown = True Then
Local $hCountdown_Label = GUICtrlCreateLabel(StringFormat("%2s", $iTimeout), 10, 20, 32, 32)
GUICtrlSetFont(-1, 18, Default, Default, $sEMB_Font_Name)
If $LabelColor = 0xFFFFFF Then
GUICtrlSetColor(-1, Random(0, $LabelColor))
Else
GUICtrlSetColor(-1, $LabelColor)
EndIf
Else
If $iIcon_Reduction Then GUICtrlCreateIcon($sDLL, $iIcon_Style, 10, 20)
EndIf

; Create dummy control for Accel key
Local $hAccel_Key = GUICtrlCreateDummy()
; Set Space key as Accel key
Local $aAccel_Key[1][2] = [["{SPACE}", $hAccel_Key]]
GUISetAccelerators($aAccel_Key)

; Create buttons
; Calculate button horizontal start
If $aButtons[0] = 1 Then
If BitAND($iEMB_Just, 4) = 4 Then
; Single centred button
$iButton_Xpos = ($iMsg_Width - $iButton_Width) / 2
Else
; Single offset button
$iButton_Xpos = $iMsg_Width - $iButton_Width - 10
EndIf
Else
; Multiple centred buttons
$iButton_Xpos = 10 + ($iMsg_Width - $iMsg_Width_Button) / 2
EndIf
; Set default button code
Local $iDefButton_Code = 1
; Set default button style
Local $iDef_Button_Style = 0
; Work through button list
For $i = 0 To $aButtons[0] - 1
Local $iButton_Text = $aButtons[$i + 1]
; Set default button
If $aButtons[0] = 1 Then ; Only 1 button
$iDef_Button_Style = 0x0001
ElseIf StringLeft($iButton_Text, 1) = "&" Then ; Look for &
$iDef_Button_Style = 0x0001
$aButtons[$i + 1] = StringTrimLeft($iButton_Text, 1)
; Set default button code for Accel key return
$iDefButton_Code = $i + 1
EndIf
; Draw button
GUICtrlCreateButton($aButtons[$i + 1], $iButton_Xpos + ($i * ($iButton_Width + 10)), $iMsg_Height - 35, $iButton_Width, 25, $iDef_Button_Style)
; Set font if required
If Not BitAND($iEMB_Style, 4) Then GUICtrlSetFont(-1, $iEMB_Font_Size, 400, 0, $sEMB_Font_Name)
; Reset default style parameter
$iDef_Button_Style = 0
Next

; Show GUI
GUISetState(@SW_SHOW, $hMsgGUI)

; Begin timeout counter
Local $iTimeout_Begin = TimerInit()
Local $iCounter = 0

; Set colour depending on random setting
If $WordColor = 0xFFFFFF Then
GUICtrlSetColor($hEMB_Word, Random(0x000000, 0xFFFFFF))
Else
GUICtrlSetColor($hEMB_Word, $WordColor)
EndIf
; Start colour ripple function
$iRippleNumber = 0
$iRippleMax = UBound($aRippleText) - 1
AdlibRegister("Ripple", 75)

; Much faster to declare GUIGetMsg return array here and not in loop
Local $aMsg

While 1
$aMsg = GUIGetMsg(1)

If $aMsg[1] = $hMsgGUI Then
Select
Case $aMsg[0] = -3 ; $GUI_EVENT_CLOSE
$iRet_Value = 0
ExitLoop
Case $aMsg[0] = $hAccel_Key
; Accel key pressed so return default button code
$iRet_Value = $iDefButton_Code
ExitLoop
Case $aMsg[0] > $hAccel_Key
; Button handle minus Accel key handle will give button index
$iRet_Value = $aMsg[0] - $hAccel_Key
ExitLoop
EndSelect
EndIf

; Timeout if required
If TimerDiff($iTimeout_Begin) / 1000 >= $iTimeout And $iTimeout > 0 Then
$iRet_Value = 9
ExitLoop
EndIf

; Show countdown if required
If $fCountdown = True Then
Local $iTimeRun = Int(TimerDiff($iTimeout_Begin) / 1000)
If $iTimeRun <> $iCounter Then
$iCounter = $iTimeRun
GUICtrlSetData($hCountdown_Label, StringFormat("%2s", $iTimeout - $iCounter))
If $LabelColor = 0xFFFFFF Then
GUICtrlSetColor($hCountdown_Label, Random(0, $LabelColor))
Else
GUICtrlSetColor($hCountdown_Label, $LabelColor)
EndIf

If $WordColor = 0xFFFFFF Then
GUICtrlSetColor($hEMB_Word, Random(0x000000, 0xFFFFFF))
Else
GUICtrlSetColor($hEMB_Word, $WordColor)
EndIf
EndIf
EndIf

WEnd

; Stop ripple function
AdlibUnRegister("Ripple")

$nOldOpt = Opt('GUIOnEventMode', $nOldOpt)

GUIDelete($hMsgGUI)

Return $iRet_Value

EndFunc ;==>_ExtMsgBox

Func Ripple()

$iRippleNumber += 1
If $iRippleNumber > $iRippleMax Then $iRippleNumber = 0
GUICtrlSetData($hEMB_Word, $aRippleText[$iRippleNumber])
;~ msgbox (0, '' , $wColor)
If $WColor = 0xFFFFFF Then GUICtrlSetColor($hEMB_Word, Random(0x000000, 0xFFFFFF))
EndFunc

; #INTERNAL_USE_ONLY#============================================================================================================
; Name...........: _GetDefaultEMBFont
; Description ...: Determines Windows default MsgBox font size and name
; Syntax.........: _GetDefaultEMBFont()
; Return values .: Success - Array holding determined font data
; : Failure - Array holding default values
; Array elements - [0] = Size, [1] = Weight, [2] = Style, [3] = Name, [4] = Quality
; Author ........: KaFu
; Remarks .......: Used internally by ExtMsgBox UDF
; ===============================================================================================================================
Func _GetDefaultEMBFont()

; Fill array with standard default data
Local $aDefFontData[2] = [9, "Tahoma"]

; Get AutoIt GUI handle
Local $hWnd = WinGetHandle(AutoItWinGetTitle())
; Open Theme DLL
Local $hThemeDLL = DllOpen("uxtheme.dll")
; Get default theme handle
Local $hTheme = DllCall($hThemeDLL, 'ptr', 'OpenThemeData', 'hwnd', $hWnd, 'wstr', "Static")
If @error Then Return $aDefFontData
$hTheme = $hTheme[0]
; Create LOGFONT structure
Local $tFont = DllStructCreate("long;long;long;long;long;byte;byte;byte;byte;byte;byte;byte;byte;wchar[32]")
Local $pFont = DllStructGetPtr($tFont)
; Get MsgBox font from theme
DllCall($hThemeDLL, 'long', 'GetThemeSysFont', 'HANDLE', $hTheme, 'int', 805, 'ptr', $pFont) ; TMT_MSGBOXFONT
If @error Then Return $aDefFontData
; Get default DC
Local $hDC = DllCall("user32.dll", "handle", "GetDC", "hwnd", $hWnd)
If @error Then Return $aDefFontData
$hDC = $hDC[0]
; Get font vertical size
Local $iPixel_Y = DllCall("gdi32.dll", "int", "GetDeviceCaps", "handle", $hDC, "int", 90) ; LOGPIXELSY
If Not @error Then
$iPixel_Y = $iPixel_Y[0]
; Calculate point size
$aDefFontData[0] = -Round(((1 * DllStructGetData($tFont, 1)) * 72 / $iPixel_Y), 1)
EndIf
; Close DC
DllCall("user32.dll", "int", "ReleaseDC", "hwnd", $hWnd, "handle", $hDC)
; Extract font data from LOGFONT structure
$aDefFontData[1] = DllStructGetData($tFont, 14)

Return $aDefFontData

EndFunc ;==>_GetDefaultEMBFont 

 

StringSize.au3

 

#include-once

; #INDEX# ============================================================================================================
; Title .........: _StringSize
; AutoIt Version : v3.2.12.1 or higher
; Language ......: English
; Description ...: Returns size of rectangle required to display string - maximum width can be chosen
; Remarks .......:
; Note ..........:
; Author(s) .....:  Melba23 - thanks to trancexx for the default DC code
; ====================================================================================================================

;#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6

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

; #INTERNAL_USE_ONLY#=================================================================================================
; _StringSize_Error_Close: Releases DC and deletes font object after error
; _StringSize_DefaultFontName: Determines Windows default font
; ====================================================================================================================

; #FUNCTION# =========================================================================================================
; Name...........: _StringSize
; Description ...: Returns size of rectangle required to display string - maximum permitted width can be chosen
; Syntax ........: _StringSize($sText[, $iSize[, $iWeight[, $iAttrib[, $sName[, $iWidth[, $hWnd]]]]]])
; Parameters ....: $sText   - String to display
;                  $iSize   - [optional] Font size in points - (default = 8.5)
;                  $iWeight - [optional] Font weight - (default = 400 = normal)
;                  $iAttrib - [optional] Font attribute (0-Normal (default), 2-Italic, 4-Underline, 8 Strike)
;                             + 1 if tabs are to be expanded before sizing
;                  $sName   - [optional] Font name - (default = Tahoma)
;                  $iWidth  - [optional] Max width for rectangle - (default = 0 => width of original string)
;                  $hWnd    - [optional] GUI in which string will be displayed - (default 0 => normally not required)
; Requirement(s) : v3.2.12.1 or higher
; Return values .: Success - Returns 4-element array: ($iWidth set // $iWidth not set)
;                  |$array[0] = String reformatted with additonal @CRLF // Original string
;                  |$array[1] = Height of single line in selected font // idem
;                  |$array[2] = Width of rectangle required for reformatted // original string
;                  |$array[3] = Height of rectangle required for reformatted // original string
;                  Failure - Returns 0 and sets @error:
;                  |1 - Incorrect parameter type (@extended = parameter index)
;                  |2 - DLL call error - extended set as follows:
;                       |1 - GetDC failure
;                       |2 - SendMessage failure
;                       |3 - GetDeviceCaps failure
;                       |4 - CreateFont failure
;                       |5 - SelectObject failure
;                       |6 - GetTextExtentPoint32 failure
;                  |3 - Font too large for chosen max width - a word will not fit
; Author ........: Melba23 - thanks to trancexx for the default DC code
; Modified ......:
; Remarks .......: The use of the $hWnd parameter is not normally necessary - it is only required if the UDF does not
;                   return correct dimensions without it.
; Related .......:
; Link ..........:
; Example .......: Yes
;=====================================================================================================================
Func _StringSize($sText, $iSize = 8.5, $iWeight = 400, $iAttrib = 0, $sName = "", $iMaxWidth = 0, $hWnd = 0)

    ; Set parameters passed as Default
    If $iSize = Default Then $iSize = 8.5
    If $iWeight = Default Then $iWeight = 400
    If $iAttrib = Default Then $iAttrib = 0
    If $sName = "" Or $sName = Default Then $sName = _StringSize_DefaultFontName()

    ; Check parameters are correct type
    If Not IsString($sText) Then Return SetError(1, 1, 0)
    If Not IsNumber($iSize) Then Return SetError(1, 2, 0)
    If Not IsInt($iWeight) Then Return SetError(1, 3, 0)
    If Not IsInt($iAttrib) Then Return SetError(1, 4, 0)
    If Not IsString($sName) Then Return SetError(1, 5, 0)
    If Not IsNumber($iMaxWidth) Then Return SetError(1, 6, 0)
    If Not IsHwnd($hWnd) And $hWnd <> 0 Then Return SetError(1, 7, 0)

    Local $aRet, $hDC, $hFont, $hLabel = 0, $hLabel_Handle

    ; Check for tab expansion flag
    Local $iExpTab = BitAnd($iAttrib, 1)
    ; Remove possible tab expansion flag from font attribute value
    $iAttrib = BitAnd($iAttrib, BitNot(1))

    ; If GUI handle was passed
    If IsHWnd($hWnd) Then
        ; Create label outside GUI borders
        $hLabel = GUICtrlCreateLabel("", -10, -10, 10, 10)
        $hLabel_Handle = GUICtrlGetHandle(-1)
        GUICtrlSetFont(-1, $iSize, $iWeight, $iAttrib, $sName)
        ; Create DC
        $aRet = DllCall("user32.dll", "handle", "GetDC", "hwnd", $hLabel_Handle)
        If @error Or $aRet[0] = 0 Then
            GUICtrlDelete($hLabel)
            Return SetError(2, 1, 0)
        EndIf
        $hDC = $aRet[0]
        $aRet = DllCall("user32.dll", "lparam", "SendMessage", "hwnd", $hLabel_Handle, "int", 0x0031, "wparam", 0, "lparam", 0) ; $WM_GetFont
        If @error Or $aRet[0] = 0 Then
            GUICtrlDelete($hLabel)
            Return SetError(2, _StringSize_Error_Close(2, $hDC), 0)
        EndIf
        $hFont = $aRet[0]
    Else
        ; Get default DC
        $aRet = DllCall("user32.dll", "handle", "GetDC", "hwnd", $hWnd)
        If @error Or $aRet[0] = 0 Then Return SetError(2, 1, 0)
        $hDC = $aRet[0]
        ; Create required font
        $aRet = DllCall("gdi32.dll", "int", "GetDeviceCaps", "handle", $hDC, "int", 90) ; $LOGPIXELSY
        If @error Or $aRet[0] = 0 Then Return SetError(2, _StringSize_Error_Close(3, $hDC), 0)
        Local $iInfo = $aRet[0]
        $aRet = DllCall("gdi32.dll", "handle", "CreateFontW", "int", -$iInfo * $iSize / 72, "int", 0, "int", 0, "int", 0, _
            "int", $iWeight, "dword", BitAND($iAttrib, 2), "dword", BitAND($iAttrib, 4), "dword", BitAND($iAttrib, 8), "dword", 0, "dword", 0, _
            "dword", 0, "dword", 5, "dword", 0, "wstr", $sName)
        If @error Or $aRet[0] = 0 Then Return SetError(2, _StringSize_Error_Close(4, $hDC), 0)
        $hFont = $aRet[0]
    EndIf

    ; Select font and store previous font
    $aRet = DllCall("gdi32.dll", "handle", "SelectObject", "handle", $hDC, "handle", $hFont)
    If @error Or $aRet[0] = 0 Then Return SetError(2, _StringSize_Error_Close(5, $hDC, $hFont, $hLabel), 0)
    Local $hPrevFont = $aRet[0]

    ; Declare variables
    Local $avSize_Info[4], $iLine_Length, $iLine_Height = 0, $iLine_Count = 0, $iLine_Width = 0, $iWrap_Count, $iLast_Word, $sTest_Line
    ; Declare and fill Size structure
    Local $tSize = DllStructCreate("int X;int Y")
    DllStructSetData($tSize, "X", 0)
    DllStructSetData($tSize, "Y", 0)

    ; Ensure EoL is @CRLF and break text into lines
    $sText = StringRegExpReplace($sText, "((?<!\x0d)\x0a|\x0d(?!\x0a))", @CRLF)
    Local $asLines = StringSplit($sText, @CRLF, 1)

    ; For each line
    For $i = 1 To $asLines[0]
        ; Expand tabs if required
        If $iExpTab Then
            $asLines[$i] = StringReplace($asLines[$i], @TAB, " XXXXXXXX")
        EndIf
        ; Size line
        $iLine_Length = StringLen($asLines[$i])
        DllCall("gdi32.dll", "bool", "GetTextExtentPoint32W", "handle", $hDC, "wstr", $asLines[$i], "int", $iLine_Length, "ptr", DllStructGetPtr($tSize))
        If @error Then Return SetError(2, _StringSize_Error_Close(6, $hDC, $hFont, $hLabel), 0)
        If DllStructGetData($tSize, "X") > $iLine_Width Then $iLine_Width = DllStructGetData($tSize, "X")
        If DllStructGetData($tSize, "Y") > $iLine_Height Then $iLine_Height = DllStructGetData($tSize, "Y")
    Next

    ; Check if $iMaxWidth has been both set and exceeded
    If $iMaxWidth <> 0 And $iLine_Width > $iMaxWidth Then ; Wrapping required
        ; For each Line
        For $j = 1 To $asLines[0]
            ; Size line unwrapped
            $iLine_Length = StringLen($asLines[$j])
            DllCall("gdi32.dll", "bool", "GetTextExtentPoint32W", "handle", $hDC, "wstr", $asLines[$j], "int", $iLine_Length, "ptr", DllStructGetPtr($tSize))
            If @error Then Return SetError(2, _StringSize_Error_Close(6, $hDC, $hFont, $hLabel), 0)
            ; Check wrap status
            If DllStructGetData($tSize, "X") < $iMaxWidth - 4 Then
                ; No wrap needed so count line and store
                $iLine_Count += 1
                $avSize_Info[0] &= $asLines[$j] & @CRLF
            Else
                ; Wrap needed so zero counter for wrapped lines
                $iWrap_Count = 0
                ; Build line to max width
                While 1
                    ; Zero line width
                    $iLine_Width = 0
                    ; Initialise pointer for end of word
                    $iLast_Word = 0
                    ; Add characters until EOL or maximum width reached
                    For $i = 1 To StringLen($asLines[$j])
                        ; Is this just past a word ending?
                        If StringMid($asLines[$j], $i, 1) = " " Then $iLast_Word = $i - 1
                        ; Increase line by one character
                        $sTest_Line = StringMid($asLines[$j], 1, $i)
                        ; Get line length
                        $iLine_Length = StringLen($sTest_Line)
                        DllCall("gdi32.dll", "bool", "GetTextExtentPoint32W", "handle", $hDC, "wstr", $sTest_Line, "int", $iLine_Length, "ptr", DllStructGetPtr($tSize))
                        If @error Then Return SetError(2, _StringSize_Error_Close(6, $hDC, $hFont, $hLabel), 0)
                        $iLine_Width = DllStructGetData($tSize, "X")
                        ; If too long exit the loop
                        If $iLine_Width >= $iMaxWidth - 4 Then ExitLoop
                    Next
                    ; End of the line of text?
                    If $i > StringLen($asLines[$j]) Then
                        ; Yes, so add final line to count
                        $iWrap_Count += 1
                        ; Store line
                        $avSize_Info[0] &= $sTest_Line & @CRLF
                        ExitLoop
                    Else
                        ; No, but add line just completed to count
                        $iWrap_Count += 1
                        ; Check at least 1 word completed or return error
                        If $iLast_Word = 0 Then Return SetError(3, _StringSize_Error_Close(0, $hDC, $hFont, $hLabel), 0)
                        ; Store line up to end of last word
                        $avSize_Info[0] &= StringLeft($sTest_Line, $iLast_Word) & @CRLF
                        ; Strip string to point reached
                        $asLines[$j] = StringTrimLeft($asLines[$j], $iLast_Word)
                        ; Trim leading whitespace
                        $asLines[$j] = StringStripWS($asLines[$j], 1)
                        ; Repeat with remaining characters in line
                    EndIf
                WEnd
                ; Add the number of wrapped lines to the count
                $iLine_Count += $iWrap_Count
            EndIf
        Next
        ; Reset any tab expansions
        If $iExpTab Then
            $avSize_Info[0] = StringRegExpReplace($avSize_Info[0], "\x20?XXXXXXXX", @TAB)
        EndIf
        ; Complete return array
        $avSize_Info[1] = $iLine_Height
        $avSize_Info[2] = $iMaxWidth
        ; Convert lines to pixels and add drop margin
        $avSize_Info[3] = ($iLine_Count * $iLine_Height) + 4
    Else ; No wrapping required
        ; Create return array (add drop margin to height)
        Local $avSize_Info[4] = [$sText, $iLine_Height, $iLine_Width, ($asLines[0] * $iLine_Height) + 4]
    EndIf

    ; Clear up
    DllCall("gdi32.dll", "handle", "SelectObject", "handle", $hDC, "handle", $hPrevFont)
    DllCall("gdi32.dll", "bool", "DeleteObject", "handle", $hFont)
    DllCall("user32.dll", "int", "ReleaseDC", "hwnd", 0, "handle", $hDC)
    If $hLabel Then GUICtrlDelete($hLabel)

    Return $avSize_Info

EndFunc ;==>_StringSize

; #INTERNAL_USE_ONLY#============================================================================================================
; Name...........: _StringSize_Error_Close
; Description ...: Releases DC and deleted font object if required after error
; Syntax ........: _StringSize_Error_Close ($iExtCode, $hDC, $hGUI)
; Parameters ....: $iExtCode   - code to return
;                  $hDC, $hGUI - handles as set in _StringSize function
; Return value ..: $iExtCode as passed
; Author ........: Melba23
; Modified.......:
; Remarks .......: This function is used internally by _StringSize
; ===============================================================================================================================
Func _StringSize_Error_Close($iExtCode, $hDC = 0, $hFont = 0, $hLabel = 0)

    If $hFont <> 0 Then DllCall("gdi32.dll", "bool", "DeleteObject", "handle", $hFont)
    If $hDC <> 0 Then DllCall("user32.dll", "int", "ReleaseDC", "hwnd", 0, "handle", $hDC)
    If $hLabel Then GUICtrlDelete($hLabel)

    Return $iExtCode

EndFunc ;=>_StringSize_Error_Close

; #INTERNAL_USE_ONLY#============================================================================================================
; Name...........: _StringSize_DefaultFontName
; Description ...: Determines Windows default font
; Syntax ........: _StringSize_DefaultFontName()
; Parameters ....: None
; Return values .: Success - Returns name of system default font
;                  Failure - Returns "Tahoma"
; Author ........: Melba23, based on some original code by Larrydalooza
; Modified.......:
; Remarks .......: This function is used internally by _StringSize
; ===============================================================================================================================
Func _StringSize_DefaultFontName()

    ; Get default system font data
    Local $tNONCLIENTMETRICS = DllStructCreate("uint;int;int;int;int;int;byte[60];int;int;byte[60];int;int;byte[60];byte[60];byte[60]")
    DLLStructSetData($tNONCLIENTMETRICS, 1, DllStructGetSize($tNONCLIENTMETRICS))
    DLLCall("user32.dll", "int", "SystemParametersInfo", "int", 41, "int", DllStructGetSize($tNONCLIENTMETRICS), "ptr", DllStructGetPtr($tNONCLIENTMETRICS), "int", 0)
    Local $tLOGFONT = DllStructCreate("long;long;long;long;long;byte;byte;byte;byte;byte;byte;byte;byte;char[32]", DLLStructGetPtr($tNONCLIENTMETRICS, 13))
    If IsString(DllStructGetData($tLOGFONT, 14)) Then
        Return DllStructGetData($tLOGFONT, 14)
    Else
        Return "Tahoma"
    EndIf

EndFunc ;=>_StringSize_DefaultFontName

Edited by boththose

,-. .--. ________ .-. .-. ,---. ,-. .-. .-. .-.
|(| / /\ \ |\ /| |__ __||| | | || .-' | |/ / \ \_/ )/
(_) / /__\ \ |(\ / | )| | | `-' | | `-. | | / __ \ (_)
| | | __ | (_)\/ | (_) | | .-. | | .-' | | \ |__| ) (
| | | | |)| | \ / | | | | | |)| | `--. | |) \ | |
`-' |_| (_) | |\/| | `-' /( (_)/( __.' |((_)-' /(_|
'-' '-' (__) (__) (_) (__)

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...