• Earn real money by being active: Hello Guest, earn real money by simply being active on the forum — post quality content, get reactions, and help the community. Once you reach the minimum credit amount, you’ll be able to withdraw your balance directly. Learn how it works.

AutoIT Toast UDF

Status
Not open for further replies.

DDoSer

The Real DDoSer
User
Joined
Oct 9, 2013
Messages
352
Reputation
0
Reaction score
4,578
Points
243
Credits
0
‎11 Years of Service‎
51%
[HIDE-THANKS]Toast.au3

Code:
>#include-once

; #INDEX# ============================================================================================================
; Title .........: Toast
; AutoIt Version : 3.3.2.0 - uses AdlibRegister/Unregister
; Language ......: English
; Description ...: Show and hides slice messages from the systray in user defined colours and fonts
; Author(s) .....: Melba23 - using some code from guinness and MilesAhead in _Toast_Locate
; ====================================================================================================================

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

; #INCLUDES# =========================================================================================================
#include 
#include 

; #GLOBAL VARIABLES# =================================================================================================
Global $iDef_Toast_Font_Size = _Toast_GetDefFont(0)
Global $sDef_Toast_Font_Name = _Toast_GetDefFont(1)

Global $hToast_Handle = 0
Global $hToast_Close_X = 9999
Global $iToast_Move = 0
Global $iToast_Style = 1 ; $SS_CENTER
Global $aRet = DllCall("User32.dll", "int", "GetSysColor", "int", 8) ; $COLOR_WINDOWTEXT = 8
Global $iToast_Header_BkCol = $aRet[0]
$aRet = DllCall("User32.dll", "int", "GetSysColor", "int", 5) ; $COLOR_WINDOW = 5
Global $iToast_Header_Col = $aRet[0]
Global $iToast_Header_Bold = 0
Global $iToast_Message_BkCol = $iToast_Header_Col
Global $iToast_Message_Col = $iToast_Header_BkCol
Global $iToast_Font_Size = $iDef_Toast_Font_Size
Global $sToast_Font_Name = $sDef_Toast_Font_Name
Global $iToast_Timer = 0
Global $iToast_Start = 0
Global $fToast_Close = False

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

; #INTERNAL_USE_ONLY#=================================================================================================
; _Toast_Locate:          Find Systray and determine Toast start position and movement direction
; _Toast_Timer_Check:     Checks whether Toast has timed out or closure [X] clicked
; _Toast_WM_EVENTS:       Message handler to check if closure [X] clicked
; _Toast_GetDefFont:      Determine system default MsgBox font and size
; _Toast_ShowPNG:         Set PNG as image
; _Toast_BitmapCreateDIB: Create bitmap
; ====================================================================================================================

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

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

; Set parameters
Switch $vJust
	Case Default
		$iToast_Style = 1; $SS_CENTER
		$aRet = DllCall("User32.dll", "int", "GetSysColor", "int", 8) ; $COLOR_WINDOWTEXT = 8
		$iToast_Header_BkCol = $aRet[0]
		$aRet = DllCall("User32.dll", "int", "GetSysColor", "int", 5) ; $COLOR_WINDOW = 5
		$iToast_Header_Col = $aRet[0]
		$iToast_Message_BkCol = $iToast_Header_Col
		$iToast_Message_Col = $iToast_Header_BkCol
		$sToast_Font_Name = $sDef_Toast_Font_Name
		$iToast_Font_Size = $iDef_Toast_Font_Size
		Return
	Case 0, 1, 2, 4, 5, 6
		$iToast_Style = $vJust
	Case -1
		; Do nothing
	Case Else
		Return SetError(1, 1, 0)
EndSwitch

Switch $iHdr_BkCol
	Case Default
		$aRet = DllCall("User32.dll", "int", "GetSysColor", "int", 8) ; $COLOR_WINDOWTEXT = 8
		$iToast_Header_BkCol = $aRet[0]
	Case 0 To 0xFFFFFF
		$iToast_Header_BkCol = Int($iHdr_BkCol)
	Case -1
		; Do nothing
	Case Else
		Return SetError(1, 2, 0)
EndSwitch

Switch $iHdr_Col
	Case Default
		$aRet = DllCall("User32.dll", "int", "GetSysColor", "int", 5) ; $COLOR_WINDOW = 5
		$iToast_Header_Col = $aRet[0]
	Case 0 To 0xFFFFFF
		$iToast_Header_Col = Int($iHdr_Col)
	Case -1
		; Do nothing
	Case Else
		Return SetError(1, 3, 0)
EndSwitch

Switch $iMsg_BkCol
	Case Default
		$aRet = DllCall("User32.dll", "int", "GetSysColor", "int", 5) ; $COLOR_WINDOW = 5
		$iToast_Message_BkCol = $aRet[0]
	Case 0 To 0xFFFFFF
		$iToast_Message_BkCol = Int($iMsg_BkCol)
	Case -1
		; Do nothing
	Case Else
		Return SetError(1, 4, 0)
EndSwitch

Switch $iMsg_Col
	Case Default
		$aRet = DllCall("User32.dll", "int", "GetSysColor", "int", 8) ; $COLOR_WINDOWTEXT = 8
		$iToast_Message_Col = $aRet[0]
	Case 0 To 0xFFFFFF
		$iToast_Message_Col = Int($iMsg_Col)
	Case -1
		; Do nothing
	Case Else
		Return SetError(1, 5, 0)
EndSwitch

Switch $iFont_Size
	Case Default
		$iToast_Font_Size = $iDef_Toast_Font_Size
	Case 8 To 72
		$iToast_Font_Size = Int($iFont_Size)
	Case -1
		; Do nothing
	Case Else
		Return SetError(1, 6, 0)
EndSwitch

Switch $sFont_Name
	Case Default
		$sToast_Font_Name = $sDef_Toast_Font_Name
	Case ""
		; Do nothing
	Case Else
		If IsString($sFont_Name) Then
			$sToast_Font_Name = $sFont_Name
		Else
			Return SetError(1, 7, 0)
		EndIf
EndSwitch

Return 1

EndFunc   ;==>_Toast_Set

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

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

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

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

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

; Set default auto-sizing Toast widths
Local $iToast_Width_max = 500
Local $iToast_Width_min = 150

; Check for icon
Local $iIcon_Style = 0
Local $iIcon_Reduction = 36
Local $sDLL = "user32.dll"
Local $sImg = ""
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 Else
			Return SetError(1, 0, -1)
	EndSwitch
Else
	Switch StringLower(StringRight($vIcon, 3))
		Case "exe", "ico"
			$sDLL = $vIcon
			$iIcon_Style = 0
		Case "bmp", "jpg", "gif", "png"
			$sImg = $vIcon
	EndSwitch
EndIf

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

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

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

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

; Set label size
Local $iLabelwidth = $aLabel_Pos[2]
Local $iLabelheight = $aLabel_Pos[3]

; Set Toast size
Local $iToast_Width = $iLabelwidth + 20 + $iIcon_Reduction
; Check if Toast will fit on screen
If $iToast_Width > @DesktopWidth - 20 Then
	$nOldOpt = Opt('GUIOnEventMode', $nOldOpt)
	Return SetError(4, 0, -1)
EndIf
; Increase if below min size
If $iToast_Width < $iToast_Width_min + $iIcon_Reduction Then
	$iToast_Width = $iToast_Width_min + $iIcon_Reduction
	$iLabelwidth = $iToast_Width_min - 20
EndIf

; Set title bar height - with minimum for [X]
Local $iTitle_Height = 0
If $sTitle = "" Then
	If $iDelay < 0 Then $iTitle_Height = 6
Else
	$iTitle_Height = $iLine_Height + 2
	If $iDelay < 0 Then
		If $iTitle_Height < 17 Then $iTitle_Height = 17
	EndIf
EndIf

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

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

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

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

; Check installed fonts
Local $sX_Font = "WingDings"
Local $sX_Char = "x"
Local $i = 1
While 1
	Local $sInstalled_Font = RegEnumVal("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts", $i)
	If @error Then ExitLoop
	If StringInStr($sInstalled_Font, "WingDings 2") Then
		$sX_Font = "WingDings 2"
		$sX_Char = "T"
	EndIf
	$i += 1
WEnd

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

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

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

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

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

Else

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

EndIf

; Create icon
If $iIcon_Reduction Then
	Switch StringLower(StringRight($sImg, 3))
		Case "bmp", "jpg", "gif"
			GUICtrlCreatePic($sImg, 10, 10 + $iTitle_Height, 32, 32)
		Case "png"
			_Toast_ShowPNG($sImg, $iTitle_Height)
		Case Else
			GUICtrlCreateIcon($sDLL, $iIcon_Style, 10, 10 + $iTitle_Height)
	EndSwitch
EndIf

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

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

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

; If script is to pause
If $fWait = True Then

	; Clear message queue
	Do
	Until GUIGetMsg() = 0

	; Begin timeout counter
	Local $iTimeout_Begin = TimerInit()

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

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

	; Store timer info
	$iToast_Timer = Abs($iDelay * 1000)
	$iToast_Start = TimerInit()

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

EndIf

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

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

Return $aToast_Data

EndFunc   ;==>_Toast_Show

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

Func _Toast_Hide()

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

; Slide Toast back behind systray
DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $hToast_Handle, "int", 500, "long", $iToast_Move)
; Delete Toast slice
GUIDelete($hToast_Handle)
; Set flag for "no Toast"
$hToast_Handle = 0
; Unregister a possible message handler
GUIRegisterMsg(0x0021, "") ; $WM_MOUSEACTIVATE
; Unregister a possible Adlib function
AdlibUnRegister("_Toast_Timer_Check")
; Clear possible flag
$fToast_Close = False

EndFunc   ;==>_Toast_Hide

; #INTERNAL_USE_ONLY#============================================================================================================
; Name...........: _Toast_Locate
; Description ...: Find Systray and determine Toast start position and movement direction
; Syntax ........: _Toast_Locate($iToast_Width, $iToast_Height)
; Parameters ....: $iToast_Width  - required width of slice
;                  $iToast_Height - required height of slice
; Author ........: Melba23 - using some code from guinness and MilesAhead
; Modified.......:
; Remarks .......: This function is used internally by _Toast_Show
; ===============================================================================================================================
Func _Toast_Locate($iToast_Width, $iToast_Height)

Local $tWorkArea

; Define return array
Local $aToast_Data[3]
; Determine which struct syntax to use to use
If @AutoItVersion < "3.3.8.0" Then
	$tWorkArea = DllStructCreate("long Left;long Top;long Right;long Bottom")
Else
	$tWorkArea = DllStructCreate("struct;long Left;long Top;long Right;long Bottom;endstruct")
EndIf

; Check if Taskbar is hidden
Local $aRet = DllCall("shell32.dll", "uint", "SHAppBarMessage", "dword", 0x00000004, "ptr*", 0) ; $ABM_GETSTATE
If BitAND($aRet[0], 0x01) Then

	; Find hidden taskbar
	Local $iPrevMode = Opt("WinTitleMatchMode", 4)
	Local $aTray_Pos = WinGetPos("[CLASS:Shell_TrayWnd]")
	Opt("WinTitleMatchMode", $iPrevMode)
	; If error in finding systray
	If Not IsArray($aTray_Pos) Then Return SetError(2, 0, -1)

	; Determine direction of Toast motion and starting position
	If $aTray_Pos[1] > 0 Then
		$iToast_Move = 0x00050004 ; $AW_SLIDE_OUT_BOTTOM
		$aToast_Data[0] = @DesktopWidth - $iToast_Width - 10
		$aToast_Data[1] = $aTray_Pos[1] - $iToast_Height - 2
		$aToast_Data[2] = 0x00040008 ; $AW_SLIDE_IN_BOTTOM
	ElseIf $aTray_Pos[0] > 0 Then
		$iToast_Move = 0x00050001 ; $AW_SLIDE_OUT_RIGHT
		$aToast_Data[0] = $aTray_Pos[0] - $iToast_Width - 2
		$aToast_Data[1] = @DesktopHeight - $iToast_Height - 10
		$aToast_Data[2] = 0x00040002 ; $AW_SLIDE_IN_RIGHT
	ElseIf $aTray_Pos[2] > @DesktopWidth - 70 Then
		$iToast_Move = 0x00050008 ; $AW_SLIDE_OUT_TOP
		$aToast_Data[0] = @DesktopWidth - $iToast_Width - 10
		$aToast_Data[1] = $aTray_Pos[1] + $aTray_Pos[3]
		$aToast_Data[2] = 0x00040004 ; $AW_SLIDE_IN_TOP
	ElseIf $aTray_Pos[3] >= @DesktopHeight Then
		$iToast_Move = 0x00050002 ; $AW_SLIDE_OUT_LEFT
		$aToast_Data[0] = $aTray_Pos[0] + $aTray_Pos[2]
		$aToast_Data[1] = @DesktopHeight - $iToast_Height - 10
		$aToast_Data[2] = 0x00040001 ; $AW_SLIDE_IN_LEFT
	EndIf

Else

	; Determine available work area ; $SPI_GETWORKAREA = 48
	DllCall("user32.dll", "bool", "SystemParametersInfoW", "uint", 48, "uint", 0, "ptr", DllStructGetPtr($tWorkArea), "uint", 0)
	If @error Then Return SetError(2, 0, -1)
	Local $aWorkArea[4] = [DllStructGetData($tWorkArea, "Left"), DllStructGetData($tWorkArea, "Top"), _
			DllStructGetData($tWorkArea, "Right"), DllStructGetData($tWorkArea, "Bottom")]

	; Determine direction of Toast motion and starting position
	If $aWorkArea[3] <> @DesktopHeight Then
		$iToast_Move = 0x00050004 ; $AW_SLIDE_OUT_BOTTOM
		$aToast_Data[0] = @DesktopWidth - $iToast_Width - 10
		$aToast_Data[1] = $aWorkArea[3] - $iToast_Height - 2
		$aToast_Data[2] = 0x00040008 ; $AW_SLIDE_IN_BOTTOM
	ElseIf $aWorkArea[2] <> @DesktopWidth Then
		$iToast_Move = 0x00050001 ; $AW_SLIDE_OUT_RIGHT
		$aToast_Data[0] = $aWorkArea[2] - $iToast_Width - 2
		$aToast_Data[1] = @DesktopHeight - $iToast_Height - 10
		$aToast_Data[2] = 0x00040002 ; $AW_SLIDE_IN_RIGHT
	ElseIf $aWorkArea[1] <> 0 Then
		$iToast_Move = 0x00050008 ; $AW_SLIDE_OUT_TOP
		$aToast_Data[0] = @DesktopWidth - $iToast_Width - 10
		$aToast_Data[1] = $aWorkArea[1]
		$aToast_Data[2] = 0x00040004 ; $AW_SLIDE_IN_TOP
	ElseIf $aWorkArea[0] <> 0 Then
		$iToast_Move = 0x00050002 ; $AW_SLIDE_OUT_LEFT
		$aToast_Data[0] = $aWorkArea[0]
		$aToast_Data[1] = @DesktopHeight - $iToast_Height - 10
		$aToast_Data[2] = 0x00040001 ; $AW_SLIDE_IN_LEFT
	EndIf

EndIf

Return $aToast_Data

EndFunc   ;==>_Toast_Locate

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

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

; Retract slice
_Toast_Hide()

EndFunc   ;==>_Toast_Timer_Check

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

#forceref $wParam, $lParam
If $hWnd = $hToast_Handle Then
	If $Msg = 0x0021 Then ; $WM_MOUSEACTIVATE
		; Check mouse position
		Local $aPos = GUIGetCursorInfo($hToast_Handle)
		If $aPos[4] = $hToast_Close_X Then $fToast_Close = True
	EndIf
EndIf
Return 'GUI_RUNDEFMSG'

EndFunc   ;==>_Toast_WM_EVENTS

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

; 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)
; Read font data for MsgBox font
Local $tLOGFONT = DllStructCreate("long;long;long;long;long;byte;byte;byte;byte;byte;byte;byte;byte;char[32]", DllStructGetPtr($tNONCLIENTMETRICS, 15))
Switch $iData
	Case 0
		; Font size as integer
		Return Int((Abs(DllStructGetData($tLOGFONT, 1)) + 1) * .75)
	Case 1
		; Font name
		Return DllStructGetData($tLOGFONT, 14)
EndSwitch

EndFunc   ;==>_Toast_GetDefFont

; #INTERNAL_USE_ONLY#============================================================================================================
; Name...........: _Toast_ShowPNG
; Description ...: Set PNG as image
; Syntax ........: _Toast_ShowPNG($sImg)
; Parameters ....: $sImg - Path of image file
; Author ........: UEZ
; Modified.......: Melba23
; Remarks .......:
; ===============================================================================================================================
Func _Toast_ShowPNG($sImg, $iTitle_Height)

_GDIPlus_Startup()
Local $hPic = GUICtrlCreatePic("", 10, 10 + $iTitle_Height, 32, 32)
Local $hBitmap = _GDIPlus_BitmapCreateFromFile($sImg)
Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", 32, "int", 32, "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0)
Local $hBitmap_Resized = $aResult[6]
Local $hBMP_Ctxt = _GDIPlus_ImageGetGraphicsContext($hBitmap_Resized)
DllCall($ghGDIPDll, "uint", "GdipSetInterpolationMode", "handle", $hBMP_Ctxt, "int", 7)
_GDIPlus_GraphicsDrawImageRect($hBMP_Ctxt, $hBitmap, 0, 0, 32, 32)
Local $hHBitmap = _Toast_BitmapCreateDIB($hBitmap_Resized)
_WinAPI_DeleteObject(GUICtrlSendMsg($hPic, 0x0172, 0, $hHBitmap))
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_BitmapDispose($hBitmap_Resized)
_GDIPlus_GraphicsDispose($hBMP_Ctxt)
_WinAPI_DeleteObject($hHBitmap)
_GDIPlus_Shutdown()

EndFunc   ;==>_Toast_ShowPNG

; #INTERNAL_USE_ONLY#============================================================================================================
; Name...........: _Toast_BitmapCreateDIB
; Description ...: Create bitmap
; Syntax ........: _Toast_BitmapCreateDIB($hBitmap)
; Parameters ....: $hBitmap - Handle of bitmap
; Author ........: UEZ
; Modified.......:
; Remarks .......:
; ===============================================================================================================================
Func _Toast_BitmapCreateDIB($hBitmap)

Local $hRet = 0

Local $aRet1 = DllCall($ghGDIPDll, "uint", "GdipGetImageDimension", "ptr", $hBitmap, "float*", 0, "float*", 0)
If (@error) Or ($aRet1[0]) Then Return 0
Local $tData = _GDIPlus_BitmapLockBits($hBitmap, 0, 0, $aRet1[2], $aRet1[3], $GDIP_ILMREAD, $GDIP_PXF32ARGB)
Local $pBits = DllStructGetData($tData, "Scan0")
If Not $pBits Then Return 0
Local $tBIHDR = DllStructCreate("dword;long;long;ushort;ushort;dword;dword;long;long;dword;dword")
DllStructSetData($tBIHDR, 1, DllStructGetSize($tBIHDR))
DllStructSetData($tBIHDR, 2, $aRet1[2])
DllStructSetData($tBIHDR, 3, $aRet1[3])
DllStructSetData($tBIHDR, 4, 1)
DllStructSetData($tBIHDR, 5, 32)
DllStructSetData($tBIHDR, 6, 0)
Local $aRet2 = DllCall("gdi32.dll", "ptr", "CreateDIBSection", "hwnd", 0, "ptr", DllStructGetPtr($tBIHDR), "uint", 0, "ptr*", 0, "ptr", 0, "dword", 0)
If (Not @error) And ($aRet2[0]) Then
	DllCall("gdi32.dll", "dword", "SetBitmapBits", "ptr", $aRet2[0], "dword", $aRet1[2] * $aRet1[3] * 4, "ptr", DllStructGetData($tData, "Scan0"))
	$hRet = $aRet2[0]
EndIf
_GDIPlus_BitmapUnlockBits($hBitmap, $tData)
Return $hRet
EndFunc   ;==>_Toast_BitmapCreateDIB
Example

Code:
>
;Example Toast

#include "Toast.au3"

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

Local $sAutoIt_Path = StringRegExpReplace(@AutoItExe, "(^.*\\)(.*)", "\1")

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

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

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

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

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

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

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

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

_Toast_Set(0, -1, 0xFFFF00, 0x00FF00, 0x000000, 15, "Courier New")
$aRet = _Toast_Show($sAutoIt_Path & "Examples\GUI\Torus.png", "Max Width and Normal Header", $sMsg, -30)
ConsoleWrite("Toast size: " & $aRet[0] & " x " & $aRet[1] & @CRLF)
_Toast_Hide()

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

_Toast_Set(5, 0xFF00FF, 0xFFFF00, 0x0000FF, 0xFFFFFF, 10, "Arial")
$aRet = _Toast_Show(0, "Unwrapped Toast", $sMsg, -20, True, True)
If IsArray($aRet) Then
ConsoleWrite("Toast size: " & $aRet[0] & " x " & $aRet[1] & @CRLF)
_Toast_Hide()
Else
MsgBox(0, "Error", "Raw Toast too wide for your screen!")
EndIf


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

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

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

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

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

_Toast_Set(5, 0xFF00FF, 0xFFFF00, 0x0000FF, 0xFFFFFF, 10)
$aRet = _Toast_Show(32, "Script Continuing", $sMsg, -20, False) ; Delay can be set here because script continues
ConsoleWrite("Toast size: " & $aRet[0] & " x " & $aRet[1] & @CRLF)
$hLabel = GUICtrlCreateLabel("", 267, 98, 15, 15, BitOR(0x1, 0x0200)) ; $SS_CENTER, $SS_CENTERIMAGE
GUICtrlSetBkColor(-1, 0xFFFF00)
$iCount = 0
Do
$iCount += 1
GUICtrlSetData($hLabel, StringFormat("%2s", $iCount))
Sleep(1000)
Until $iCount = 60 Or $hToast_Handle = 0 ; Toast will retract automatically before $iCount = 60

Exit
[/HIDE-THANKS]

 
Status
Not open for further replies.
Back
Top