Jump to content



Photo

How to make Toast - New version 20 May 13


195 replies to this topic

#41 Reaper HGN

Reaper HGN

    Wayfarer

  • Active Members
  • Pip
  • 93 posts

Posted 23 January 2010 - 07:51 PM

Awesome script. I like this one over another I found in these forums a while back for its "cleanness". I will definitely look at using this on future projects. I looked and did not see any options that set the transparency of the toast message itself. Assuming I didnt miss that somewhere in the UDF, would that be hard to do having both a title bar and a message body for the toast?


Thanks again for the great work!





#42 Melba23

Melba23

    Yes, me!

  • Moderators
  • 15,309 posts

Posted 23 January 2010 - 08:49 PM

Reaper HGN,

Thanks for the compliments. :D

If you want to change the transparency, you need to add a line like this:
; 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) ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< WinSetTrans($hToast_Handle, "", 100) ; New line (see WinSetTrans in the Help file for details) ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; Slide Toast Slice into view from behind systray and activate DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $hToast_Handle, "int", 1000, "long", $aToast_Data[2])

I leave it to you to add another option to _Toast_Set if you so desire - the current version gives you lots of clues on how to do it! :huggles:

M23
StringSize - Automatically size controls to fit text - ExtMsgBox - A user customisable replacement for MsgBox

Toast - Small GUIs which pop out of the Systray - Marquee - Scrolling tickertape GUIs

Scrollbars - Automatically sized scrollbars with a single command - GUIFrame - Subdivide GUIs into many adjustable frames

GUIExtender - Extend and retract multiple sections within a GUI - NoFocusLines - Remove the dotted focus lines from buttons, sliders, radios and checkboxes

ChooseFileFolder - Single and multiple selections from specified path tree structure - - Notify - Small notifications on the edge of the display

RecFileListToArray - An alternative to _FileListToArray with user-defined include/exclude masks, maximum recursion level, sorting and displayed path options

GUIListViewEx - Insert, delete, move, drag and sort ListView items


#43 guinness

guinness

    guinness

  • MVPs
  • 10,273 posts

Posted 23 January 2010 - 11:51 PM

I think this is the initial post http://www.autoitscript.com/forum/index.php?showtopic=86298

Example List: _AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_DesktopDimensions()_DisplayPassword()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUISetIcon()_Icon_Clear()/_Icon_Set()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringIsValid()_StringReplaceWholeWord()_StringStripChar()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()AutoIt SearchAutoIt3 PortableAutoItWinGetTitle()/AutoItWinSetTitle()CodingFileInstallrGeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIGetBkColor()LockFile()PasteBinSciTE JumpSignature CreatorWM_COPYDATAMore Examples...Updated: 11/04/2013


#44 Mat

Mat

    43 38 48 31 30 4E 34 4F 32

  • MVPs
  • 4,040 posts

Posted 23 January 2010 - 11:59 PM

I think this is the initial post http://www.autoitscript.com/forum/index.php?showtopic=86298


Is it just me or is something wrong with that post about half way down... It stops being indented :D

I don't know where I'm going, but I'm on my way.


#45 Melba23

Melba23

    Yes, me!

  • Moderators
  • 15,309 posts

Posted 24 January 2010 - 11:15 AM

I think this is the initial post http://www.autoitscript.com/forum/index.php?showtopic=86298

Congratulations on your searching skills! But if you look at the date you will see that post relates to a much earlier version of the UDF from over a year ago.

Please use the version in this thread if you decide to make some Toast yourself on this fine Sunday morning! :D

M23
StringSize - Automatically size controls to fit text - ExtMsgBox - A user customisable replacement for MsgBox

Toast - Small GUIs which pop out of the Systray - Marquee - Scrolling tickertape GUIs

Scrollbars - Automatically sized scrollbars with a single command - GUIFrame - Subdivide GUIs into many adjustable frames

GUIExtender - Extend and retract multiple sections within a GUI - NoFocusLines - Remove the dotted focus lines from buttons, sliders, radios and checkboxes

ChooseFileFolder - Single and multiple selections from specified path tree structure - - Notify - Small notifications on the edge of the display

RecFileListToArray - An alternative to _FileListToArray with user-defined include/exclude masks, maximum recursion level, sorting and displayed path options

GUIListViewEx - Insert, delete, move, drag and sort ListView items


#46 GEOSoft

GEOSoft

    Sure I'm senile. What's your excuse?

  • MVPs
  • 10,563 posts

Posted 24 January 2010 - 01:01 PM

@M23
Do I have to start training you all over again?
This thread should have been titled
"How to make Melba Toast"
GeorgeQuestion about decompiling code? Read the decompiling FAQ and don't bother posting the question in the forums.Be sure to read and follow the forum rules. -AKA the AutoIt Reading and Comprehension Skills test.*** The PCRE (Regular Expression) ToolKit for AutoIT - (Updated Oct 20, 2011 ver:3.0.1.13) - Please update your current version before filing any bug reports. The installer now includes both 32 and 64 bit versions. No change in version number.Visit my Blog .. currently not active but it will soon be resplendent with news and views. Also please remove any links you may have to my website. it is soon to be closed and replaced with something else."Old age and treachery will always overcome youth and skill!"

#47 Melba23

Melba23

    Yes, me!

  • Moderators
  • 15,309 posts

Posted 24 January 2010 - 02:36 PM

George,

Thank you for that - but I prefer it thick and toasted on both sides! :D

M23
StringSize - Automatically size controls to fit text - ExtMsgBox - A user customisable replacement for MsgBox

Toast - Small GUIs which pop out of the Systray - Marquee - Scrolling tickertape GUIs

Scrollbars - Automatically sized scrollbars with a single command - GUIFrame - Subdivide GUIs into many adjustable frames

GUIExtender - Extend and retract multiple sections within a GUI - NoFocusLines - Remove the dotted focus lines from buttons, sliders, radios and checkboxes

ChooseFileFolder - Single and multiple selections from specified path tree structure - - Notify - Small notifications on the edge of the display

RecFileListToArray - An alternative to _FileListToArray with user-defined include/exclude masks, maximum recursion level, sorting and displayed path options

GUIListViewEx - Insert, delete, move, drag and sort ListView items


#48 guinness

guinness

    guinness

  • MVPs
  • 10,273 posts

Posted 24 January 2010 - 05:16 PM

A recent forum query about the small pop-ups that some apps produce from the systray made me realise that I had not posted my version of how this can be done.

In the function _Toast_Show() I changed $iDelay < 0 to $iDelay <= 0 in the sections that add the [X] but for some reason it will display but doesn't register that I have clicked on it. Surely this should work?

; 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

; 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

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

Example List: _AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_DesktopDimensions()_DisplayPassword()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUISetIcon()_Icon_Clear()/_Icon_Set()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringIsValid()_StringReplaceWholeWord()_StringStripChar()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()AutoIt SearchAutoIt3 PortableAutoItWinGetTitle()/AutoItWinSetTitle()CodingFileInstallrGeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIGetBkColor()LockFile()PasteBinSciTE JumpSignature CreatorWM_COPYDATAMore Examples...Updated: 11/04/2013


#49 Melba23

Melba23

    Yes, me!

  • Moderators
  • 15,309 posts

Posted 24 January 2010 - 05:25 PM

guinness,

In the UDF I posted the logic for $iDelay works like this:

$iDelay = 0 (default) - the script continues immediately, the Toast remains visible uniil a _Toast_Hide or another _Toast_Show.

$iDelay > 0 - the script waits $iDelay seconds before continuing, the Toast behaves as above

$iDelay < 0 - the script continues immediately, the Toast will retract automatically after $iDelay seconds or if the [X] is clicked.

As you are mixing up 2 of the states, I am not very surprised that it is not working as you want. But.......................

If you alter the code, you can debug it! :D

M23
StringSize - Automatically size controls to fit text - ExtMsgBox - A user customisable replacement for MsgBox

Toast - Small GUIs which pop out of the Systray - Marquee - Scrolling tickertape GUIs

Scrollbars - Automatically sized scrollbars with a single command - GUIFrame - Subdivide GUIs into many adjustable frames

GUIExtender - Extend and retract multiple sections within a GUI - NoFocusLines - Remove the dotted focus lines from buttons, sliders, radios and checkboxes

ChooseFileFolder - Single and multiple selections from specified path tree structure - - Notify - Small notifications on the edge of the display

RecFileListToArray - An alternative to _FileListToArray with user-defined include/exclude masks, maximum recursion level, sorting and displayed path options

GUIListViewEx - Insert, delete, move, drag and sort ListView items


#50 Melba23

Melba23

    Yes, me!

  • Moderators
  • 15,309 posts

Posted 26 January 2010 - 04:53 PM

Hi,

After having received literally hundreds of requests (well, one actually - from dmob) I have added a new parameter to the _Toast_Show function. This allows the user to override the normal maximum width setting of the Toast (500 pixels) to display wider messages if their formatting requires it. However, the Toast will not display if the result is wider than the display.

The new version (and a new example script as well before anyone asks! :D ) is in the first post.

M23
StringSize - Automatically size controls to fit text - ExtMsgBox - A user customisable replacement for MsgBox

Toast - Small GUIs which pop out of the Systray - Marquee - Scrolling tickertape GUIs

Scrollbars - Automatically sized scrollbars with a single command - GUIFrame - Subdivide GUIs into many adjustable frames

GUIExtender - Extend and retract multiple sections within a GUI - NoFocusLines - Remove the dotted focus lines from buttons, sliders, radios and checkboxes

ChooseFileFolder - Single and multiple selections from specified path tree structure - - Notify - Small notifications on the edge of the display

RecFileListToArray - An alternative to _FileListToArray with user-defined include/exclude masks, maximum recursion level, sorting and displayed path options

GUIListViewEx - Insert, delete, move, drag and sort ListView items


#51 James

James

    jbrooksuk

  • MVPs
  • 9,468 posts

Posted 26 January 2010 - 06:25 PM

Melba,
How could this be edited to add gradients to the title bar? I'm sure you've done some gradient work before?

James

#52 Melba23

Melba23

    Yes, me!

  • Moderators
  • 15,309 posts

Posted 27 January 2010 - 10:47 AM

James,

Here is a version which can display gradients in the title bar. If you enter a single value for the $vHdr_BkCol parameter in _Toast_Set you get a solid bar - if you enter a 2-element array you get a gradient:
AutoIt         
#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.  Credit to GioVit (tray location) ; ==================================================================================================================== ;#AutoIt3Wrapper_au3check_parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 ; #INCLUDES# ========================================================================================================= #include <StringSize.au3> #include <WinAPIEx.au3> ; #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 $vToast_Header_BkCol[2]  = [$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   = $vToast_Header_BkCol[01] 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_Title_Gradient Fills the Title bar with a user-defined 2 colour gradient ; ==================================================================================================================== ; #FUNCTION# ========================================================================================================= ; Name...........: _Toast_Set ; Description ...: Sets text justification and optionally colours and font, for _Toast_Show function calls ; Syntax.........: _Toast_Set($vJust, [$vHdr_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                     <<<<< ;                  $vHdr_BkCol - [Optional] The colour for the title bar background ;                                - If a single colour then the title bar is set to that colour ;                                - If a 2-element array, the title bar is set to a L-R gradient between the 2 colours ;                  $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, $vHdr_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             $vToast_Header_BkCol[0]  = $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   = $vToast_Header_BkCol[0]             $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     If IsArray($vHdr_BkCol) Then         If UBound($vHdr_BkCol) <> 2 Then Return SetError(1, 2, 0)         For $i = 0 To 1             Switch $vHdr_BkCol[$i]                 Case 0 To 0xFFFFFF                     ; Valid                 Case Else                     Return SetError(1, 2, 0)             EndSwitch         Next         ; Must be valid array         $vToast_Header_BkCol = $vHdr_BkCol     Else         Switch $vHdr_BkCol             Case Default                 $aRet = DllCall("User32.dll", "int", "GetSysColor", "int", 8) ; $COLOR_WINDOWTEXT = 8                 $vToast_Header_BkCol[0]  = $aRet[0]             Case 0 To 0xFFFFFF                 $vToast_Header_BkCol[0] = Int($vHdr_BkCol)             Case -1                 ; Do nothing             Case Else                 Return SetError(1, 2, 0)         EndSwitch         ; Set the second element to "" as a flag         $vToast_Header_BkCol[1]  = ""     EndIf     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", 8) ; $COLOR_WINDOWTEXT = 8             $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 ;                              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 (default) ;                              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 ;                           3 = StringSize error ;                           4 = When using Raw, the Toast is too wide for the display ; 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 minimum Toast widths     Local $iToast_Width_max = 500     Local $iToast_Width_min = 150     ; 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 Else                 $nOldOpt = Opt('GUIOnEventMode', $nOldOpt)                 Return SetError(1, 0, -1)         EndSwitch     Else         $sDLL = $vIcon         $iIcon_Style = 0     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     ; Set 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     If $iToast_Width < $iToast_Width_min + $iIcon_Reduction Then         ; Increase if below min size         $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         If $vToast_Header_BkCol[1] = "" Then             ; Want solid             GUICtrlCreateLabel("", 0, 0, $iToast_Width, $iTitle_Height)                 GUICtrlSetBkColor(-1, $vToast_Header_BkCol[0])                     GUICtrlSetState(-1, 128) ; $GUI_DISABLE         Else             ; Want gradient             Local $hPic = GUICtrlCreatePic("", 0, 0, $iToast_Width, $iTitle_Height)                 GUICtrlSetState(-1, 128) ; $GUI_DISABLE                 _Toast_Title_Gradient(GUICtrlGetHandle($hPic), $iToast_Width, $iTitle_Height)         EndIf         ; 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, -2) ; $GUI_BKCOLOR_TRANSPARENT             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 GUICtrlCreateIcon($sDLL, $iIcon_Style, 10, 10 + $iTitle_Height)     ; 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         ; 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 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, based on some original code by GioVit ; Modified.......: ; Remarks .......: This function is used internally by _Toast_Show ; =============================================================================================================================== Func _Toast_Locate($iToast_Width, $iToast_Height)     ; Define return array     Local $aToast_Data[3]     ; Find systray     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         $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         $aToast_Data[1] = @DesktopHeight - $iToast_Height - 10         $aToast_Data[2] = 0x00040002 ; $AW_SLIDE_IN_RIGHT     ElseIf $aTray_Pos[2] = @DesktopWidth 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     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     ; Unregister message handler     GUIRegisterMsg(0x0021, "") ; $WM_MOUSEACTIVATE     ; Unregister this function     AdlibUnRegister("_Toast_Timer_Check")     ; Reset flag     $fToast_Close = False     ; 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_Title_Gradient ; Description ...: Fills the Title bar with a user-defined 2 colour gradient ; Syntax ........: _Toast_Title_Gradient($hWnd, $iX, $iY) ; Parameters ....: $hWnd - The Pic control to colour ;                  $iX   - The width of the Title bar ;                  $iY   - The height of the Title bar ; Author ........: Melba23, based on Yashied's WinAPIEx functions ; Modified.......: ; Remarks .......: This function is used internally by _Toast_Show when a gradient is required ; =============================================================================================================================== Func _Toast_Title_Gradient($hWnd, $iX, $iY)     Local $aVertex [2][3] = [[0, 0, $vToast_Header_BkCol[0]], [$iX, $iY, $vToast_Header_BkCol[1]]]     ; Create gradient     $hDC = _WinAPI_GetDC($hWnd)     $hDestDC = _WinAPI_CreateCompatibleDC($hDC)     $hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $iX, $iY)     $hDestSv = _WinAPI_SelectObject($hDestDC, $hBitmap)     _WinAPI_GradientFill($hDestDC, $aVertex, 0, 1, True)     _WinAPI_ReleaseDC($hWnd, $hDC)     _WinAPI_SelectObject($hDestDC, $hDestSv)     _WinAPI_DeleteDC($hDestDC)     ; Set gradient to control     _SendMessage($hWnd, 0x0172, 0, $hBitmap) ; $STM_SETIMAGE     $hObj = _SendMessage($hWnd, 0x0173) ; $STM_GETIMAGE     If $hObj <> $hBitmap Then         _WinAPI_DeleteObject($hBitmap)     EndIf EndFunc

And a short example script:
AutoIt         
#include "Toast.au3" Local $sMsg, $aRet[2] $sMsg  = "This Toast has a solid title bar." & @CRLF & @CRLF $sMsg &= "It is easy to choose the colours for the bar and the text to " $sMsg &= "ensure you can see both the text and the closure [X]" _Toast_Set(0, 0xFF0000, 0xFFFF00, 0x0000FF, 0xFFFFFF, 10, "Arial") $aRet = _Toast_Show(0, "Gradient Title Bar", $sMsg, -10) ConsoleWrite("Toast size: " & $aRet[0] & " x " & $aRet[1] & @CRLF) $sMsg  = "This Toast has a gradient filled title bar." & @CRLF & @CRLF $sMsg &= "But you must choose the colours for the bar and the text carefully " $sMsg &= "or you may have difficulty seeing both the text and the closure [X] " $sMsg &= "as in this example" Global $aColours[2] = [0xFF0000, 0x00FFFF] _Toast_Set(5, $aColours, 0xFFFF00, 0x0000FF, 0xFFFFFF, 10, "Arial") $aRet = _Toast_Show(0, "Gradient Title Bar", $sMsg, -10) ConsoleWrite("Toast size: " & $aRet[0] & " x " & $aRet[1] & @CRLF) _Toast_Hide() $sMsg  = "And back to solid again" _Toast_Set(0, 0xFF0000, 0xFFFF00, 0x0000FF, 0xFFFFFF, 10, "Arial") $aRet = _Toast_Show(0, "Solid Title Bar", $sMsg, -10) ConsoleWrite("Toast size: " & $aRet[0] & " x " & $aRet[1] & @CRLF)

I am not going to put this as a formal release because it relies on Yashied's WinAPIEx functions for the gradient and so that file needs to be included, which goes against my wish to reduce the includes to a minimum. I realise that it would be relatively trivial to extract the relevant functions from WinAPIEx and have them as #INTERNAL_USE_ONLY# functions within this UDF, but I am not overly keen on doing that. It seems a bit disrespectful to to the original authors. Besides, it gives you something to do if you find yourself at a loose end! :D

M23

Edit: Altered _WinAPI_FreeObject to _WinAPI_DeleteObject following Yashied's change to the WinAPIEx library. Thanks to 4ggr35510n for pointing it out. :huggles:

Edited by Melba23, 17 February 2011 - 01:00 PM.

StringSize - Automatically size controls to fit text - ExtMsgBox - A user customisable replacement for MsgBox

Toast - Small GUIs which pop out of the Systray - Marquee - Scrolling tickertape GUIs

Scrollbars - Automatically sized scrollbars with a single command - GUIFrame - Subdivide GUIs into many adjustable frames

GUIExtender - Extend and retract multiple sections within a GUI - NoFocusLines - Remove the dotted focus lines from buttons, sliders, radios and checkboxes

ChooseFileFolder - Single and multiple selections from specified path tree structure - - Notify - Small notifications on the edge of the display

RecFileListToArray - An alternative to _FileListToArray with user-defined include/exclude masks, maximum recursion level, sorting and displayed path options

GUIListViewEx - Insert, delete, move, drag and sort ListView items


#53 James

James

    jbrooksuk

  • MVPs
  • 9,468 posts

Posted 27 January 2010 - 10:52 AM

Melba,

That is awesome! I tried going about it myself but never thought about WinAPIEx. I just couldn't get the right sizing. Brilliant!

James

#54 James

James

    jbrooksuk

  • MVPs
  • 9,468 posts

Posted 27 January 2010 - 12:10 PM

Melba,

I hope you don't mind me doing this, but I added an optional parameter on the _Toast_Set() function to control which way the gradient flows.
AutoIt         
#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.  Credit to GioVit (tray location) ; ==================================================================================================================== ;#AutoIt3Wrapper_au3check_parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 ; #INCLUDES# ========================================================================================================= #include "StringSize.au3" #include <WinAPIEx.au3> ; #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 $vToast_Header_BkCol[2]  = [$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   = $vToast_Header_BkCol[01] Global $iToast_Grad_Style    = 0 ; Added by JamesBrooks 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_Title_Gradient Fills the Title bar with a user-defined 2 colour gradient ; ==================================================================================================================== ; #FUNCTION# ========================================================================================================= ; Name...........: _Toast_Set ; Description ...: Sets text justification and optionally colours and font, for _Toast_Show function calls ; Syntax.........: _Toast_Set($vJust, [$vHdr_BkCol, [$iHdr_Col, [$iMsg_BkCol, [$iMsg_Col, [$sFont_Size, [$iFont_Name [, $fGrad]]]]]]]) ; 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                     <<<<< ;                  $vHdr_BkCol - [Optional] The colour for the title bar background ;                                - If a single colour then the title bar is set to that colour ;                                - If a 2-element array, the title bar is set to a L-R gradient between the 2 colours ;                  $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      <<<<< ;                  $sFont_Name - [Optional] The direction to set the background gradient ;                              - True, set the direction to left and right ;                              - False, set the direction to top to bottom ; 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 ; Modified ......; JamesBrooks, added $fGrad to control gradient direction ; Example........; Yes ;===================================================================================================================== Func _Toast_Set($vJust, $vHdr_BkCol = -1, $iHdr_Col = -1, $iMsg_BkCol = -1, $iMsg_Col = -1, $iFont_Size = -1, $sFont_Name = "", $fGrad = False)     ; Set parameters     Switch $vJust         Case Default             $iToast_Style         = 1; $SS_CENTER             $aRet = DllCall("User32.dll", "int", "GetSysColor", "int", 8) ; $COLOR_WINDOWTEXT = 8             $vToast_Header_BkCol[0]  = $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   = $vToast_Header_BkCol[0]             $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     If IsArray($vHdr_BkCol) Then         If UBound($vHdr_BkCol) <> 2 Then Return SetError(1, 2, 0)         For $i = 0 To 1             Switch $vHdr_BkCol[$i]                 Case 0 To 0xFFFFFF                     ; Valid                 Case Else                     Return SetError(1, 2, 0)             EndSwitch         Next         ; Must be valid array         $vToast_Header_BkCol = $vHdr_BkCol     Else         Switch $vHdr_BkCol             Case Default                 $aRet = DllCall("User32.dll", "int", "GetSysColor", "int", 8) ; $COLOR_WINDOWTEXT = 8                 $vToast_Header_BkCol[0]  = $aRet[0]             Case 0 To 0xFFFFFF                 $vToast_Header_BkCol[0] = Int($vHdr_BkCol)             Case -1                 ; Do nothing             Case Else                 Return SetError(1, 2, 0)         EndSwitch         ; Set the second element to "" as a flag         $vToast_Header_BkCol[1]  = ""     EndIf     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", 8) ; $COLOR_WINDOWTEXT = 8             $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     Switch $fGrad         Case Default             $iToast_Grad_Style = False         Case True             $iGrad_Type = True ; Left to right         Case False             $iGrad_Type = False ; Top to bottom         Case Else             Return SetError(1, 8, 0)     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 ;                              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 (default) ;                            - 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 ;                           3 = StringSize error ;                           4 = When using Raw, the Toast is too wide for the display ; 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 minimum Toast widths     Local $iToast_Width_max = 500     Local $iToast_Width_min = 150     ; 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 Else                 $nOldOpt = Opt('GUIOnEventMode', $nOldOpt)                 Return SetError(1, 0, -1)         EndSwitch     Else         $sDLL = $vIcon         $iIcon_Style = 0     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     ; Set 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     If $iToast_Width < $iToast_Width_min + $iIcon_Reduction Then         ; Increase if below min size         $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         If $vToast_Header_BkCol[1] = "" Then             ; Want solid             GUICtrlCreateLabel("", 0, 0, $iToast_Width, $iTitle_Height)                 GUICtrlSetBkColor(-1, $vToast_Header_BkCol[0])                     GUICtrlSetState(-1, 128) ; $GUI_DISABLE         Else             ; Want gradient             Local $hPic = GUICtrlCreatePic("", 0, 0, $iToast_Width, $iTitle_Height)                 GUICtrlSetState(-1, 128) ; $GUI_DISABLE                 _Toast_Title_Gradient(GUICtrlGetHandle($hPic), $iToast_Width, $iTitle_Height)         EndIf         ; 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, -2) ; $GUI_BKCOLOR_TRANSPARENT             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 GUICtrlCreateIcon($sDLL, $iIcon_Style, 10, 10 + $iTitle_Height)     ; 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         ; 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 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, based on some original code by GioVit ; Modified.......: ; Remarks .......: This function is used internally by _Toast_Show ; =============================================================================================================================== Func _Toast_Locate($iToast_Width, $iToast_Height)     ; Define return array     Local $aToast_Data[3]     ; Find systray     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         $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         $aToast_Data[1] = @DesktopHeight - $iToast_Height - 10         $aToast_Data[2] = 0x00040002 ; $AW_SLIDE_IN_RIGHT     ElseIf $aTray_Pos[2] = @DesktopWidth 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     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     ; Unregister message handler     GUIRegisterMsg(0x0021, "") ; $WM_MOUSEACTIVATE     ; Unregister this function     AdlibUnRegister("_Toast_Timer_Check")     ; Reset flag     $fToast_Close = False     ; 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_Title_Gradient ; Description ...: Fills the Title bar with a user-defined 2 colour gradient ; Syntax ........: _Toast_Title_Gradient($hWnd, $iX, $iY, $iStyle) ; Parameters ....: $hWnd   - The Pic control to colour ;                  $iX     - The width of the Title bar ;                  $iY     - The height of the Title bar ;                  $iStyle - The direction of the gradient ; Author ........: Melba23, based on Yashied's WinAPIEx functions ; Modified.......: JamesBrooks, added direction ; Remarks .......: This function is used internally by _Toast_Show when a gradient is required ; =============================================================================================================================== Func _Toast_Title_Gradient($hWnd, $iX, $iY)     Local $aVertex [2][3] = [[0, 0, $vToast_Header_BkCol[0]], [$iX, $iY, $vToast_Header_BkCol[1]]]     ; Create gradient     $hDC = _WinAPI_GetDC($hWnd)     $hDestDC = _WinAPI_CreateCompatibleDC($hDC)     $hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $iX, $iY)     $hDestSv = _WinAPI_SelectObject($hDestDC, $hBitmap)     _WinAPI_GradientFill($hDestDC, $aVertex, 0, 1, $iToast_Grad_Style)     _WinAPI_ReleaseDC($hWnd, $hDC)     _WinAPI_SelectObject($hDestDC, $hDestSv)     _WinAPI_DeleteDC($hDestDC)     ; Set gradient to control     _SendMessage($hWnd, 0x0172, 0, $hBitmap) ; $STM_SETIMAGE     $hObj = _SendMessage($hWnd, 0x0173) ; $STM_GETIMAGE     If $hObj <> $hBitmap Then         _WinAPI_FreeObject($hBitmap)     EndIf EndFunc
The two modified functions are:
  • _Toast_Set()
The new parameters for _Toast_Set() are outlined as:
_Toast_Set($vJust, [$vHdr_BkCol, [$iHdr_Col, [$iMsg_BkCol, [$iMsg_Col, [$sFont_Size, [$iFont_Name [, $fGrad]]]]]]])

Thinking about it, I may have put the option in the wrong place... Perhaps it should have been on the _Toast_Set() function along with the colours. I changed it around. It now works on _Toast_Set().

James

Edited by JamesBrooks, 27 January 2010 - 12:22 PM.


#55 Melba23

Melba23

    Yes, me!

  • Moderators
  • 15,309 posts

Posted 27 January 2010 - 01:34 PM

James,

Feel free to modify the UDF as much as you like - that is why I posted it. :D

However, rather than add yet another parameter to _Toast_Set, I would have added a third element to the array needed to define the colours - then when you define the colours for the gradient, you can define the direction at the same time. Something like this:
AutoIt         
#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.  Credit to GioVit (tray location) ; ==================================================================================================================== ;#AutoIt3Wrapper_au3check_parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 ; #INCLUDES# ========================================================================================================= #include <StringSize.au3> #include <WinAPIEx.au3> ; #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 $vToast_Header_BkCol[3]  = [$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   = $vToast_Header_BkCol[01] 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_Title_Gradient Fills the Title bar with a user-defined 2 colour gradient ; ==================================================================================================================== ; #FUNCTION# ========================================================================================================= ; Name...........: _Toast_Set ; Description ...: Sets text justification and optionally colours and font, for _Toast_Show function calls ; Syntax.........: _Toast_Set($vJust, [$vHdr_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                     <<<<< ;                  $vHdr_BkCol - [Optional] The colour for the title bar background ;                                - If a single colour then the title bar is set to that colour ;                                - If a 3-element array, the title bar is set to a gradient between the 2 colours ;                                  - Elements 0 and 1 = colours, element 2 = Gradient direction (True (L-R) or False (Top-Down)) ;                  $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, $vHdr_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             $vToast_Header_BkCol[0]  = $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   = $vToast_Header_BkCol[0]             $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     If IsArray($vHdr_BkCol) Then         If UBound($vHdr_BkCol) <> 3 Then Return SetError(1, 2, 0)         For $i = 0 To 1             Switch $vHdr_BkCol[$i]                 Case 0 To 0xFFFFFF                     ; Valid                 Case Else                     Return SetError(1, 2, 0)             EndSwitch             $vToast_Header_BkCol[2] = True             If $vHdr_BkCol[2] = False Then $vToast_Header_BkCol[2] = False         Next         ; Must be valid array         $vToast_Header_BkCol = $vHdr_BkCol     Else         Switch $vHdr_BkCol             Case Default                 $aRet = DllCall("User32.dll", "int", "GetSysColor", "int", 8) ; $COLOR_WINDOWTEXT = 8                 $vToast_Header_BkCol[0]  = $aRet[0]             Case 0 To 0xFFFFFF                 $vToast_Header_BkCol[0] = Int($vHdr_BkCol)             Case -1                 ; Do nothing             Case Else                 Return SetError(1, 2, 0)         EndSwitch         ; Set the second element to "" as a flag         $vToast_Header_BkCol[1]  = ""     EndIf     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", 8) ; $COLOR_WINDOWTEXT = 8             $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 ;                              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 (default) ;                              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 ;                           3 = StringSize error ;                           4 = When using Raw, the Toast is too wide for the display ; 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 minimum Toast widths     Local $iToast_Width_max = 500     Local $iToast_Width_min = 150     ; 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 Else                 $nOldOpt = Opt('GUIOnEventMode', $nOldOpt)                 Return SetError(1, 0, -1)         EndSwitch     Else         $sDLL = $vIcon         $iIcon_Style = 0     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     ; Set 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     If $iToast_Width < $iToast_Width_min + $iIcon_Reduction Then         ; Increase if below min size         $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         If $vToast_Header_BkCol[1] = "" Then             ; Want solid             GUICtrlCreateLabel("", 0, 0, $iToast_Width, $iTitle_Height)                 GUICtrlSetBkColor(-1, $vToast_Header_BkCol[0])                     GUICtrlSetState(-1, 128) ; $GUI_DISABLE         Else             ; Want gradient             Local $hPic = GUICtrlCreatePic("", 0, 0, $iToast_Width, $iTitle_Height)                 GUICtrlSetState(-1, 128) ; $GUI_DISABLE                 _Toast_Title_Gradient(GUICtrlGetHandle($hPic), $iToast_Width, $iTitle_Height)         EndIf         ; 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, -2) ; $GUI_BKCOLOR_TRANSPARENT             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 GUICtrlCreateIcon($sDLL, $iIcon_Style, 10, 10 + $iTitle_Height)     ; 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         ; 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 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, based on some original code by GioVit ; Modified.......: ; Remarks .......: This function is used internally by _Toast_Show ; =============================================================================================================================== Func _Toast_Locate($iToast_Width, $iToast_Height)     ; Define return array     Local $aToast_Data[3]     ; Find systray     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         $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         $aToast_Data[1] = @DesktopHeight - $iToast_Height - 10         $aToast_Data[2] = 0x00040002 ; $AW_SLIDE_IN_RIGHT     ElseIf $aTray_Pos[2] = @DesktopWidth 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     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     ; Unregister message handler     GUIRegisterMsg(0x0021, "") ; $WM_MOUSEACTIVATE     ; Unregister this function     AdlibUnRegister("_Toast_Timer_Check")     ; Reset flag     $fToast_Close = False     ; 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_Title_Gradient ; Description ...: Fills the Title bar with a user-defined 2 colour gradient ; Syntax ........: _Toast_Title_Gradient($hWnd, $iX, $iY) ; Parameters ....: $hWnd - The Pic control to colour ;                  $iX   - The width of the Title bar ;                  $iY   - The height of the Title bar ; Author ........: Melba23, based on Yashied's WinAPIEx functions ; Modified.......: ; Remarks .......: This function is used internally by _Toast_Show when a gradient is required ; =============================================================================================================================== Func _Toast_Title_Gradient($hWnd, $iX, $iY)     Local $aVertex [2][3] = [[0, 0, $vToast_Header_BkCol[0]], [$iX, $iY, $vToast_Header_BkCol[1]]]     ; Create gradient     $hDC = _WinAPI_GetDC($hWnd)     $hDestDC = _WinAPI_CreateCompatibleDC($hDC)     $hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $iX, $iY)     $hDestSv = _WinAPI_SelectObject($hDestDC, $hBitmap)     _WinAPI_GradientFill($hDestDC, $aVertex, 0, 1, $vToast_Header_BkCol[2])     _WinAPI_ReleaseDC($hWnd, $hDC)     _WinAPI_SelectObject($hDestDC, $hDestSv)     _WinAPI_DeleteDC($hDestDC)     ; Set gradient to control     _SendMessage($hWnd, 0x0172, 0, $hBitmap) ; $STM_SETIMAGE     $hObj = _SendMessage($hWnd, 0x0173) ; $STM_GETIMAGE     If $hObj <> $hBitmap Then         _WinAPI_FreeObject($hBitmap)     EndIf EndFunc

And an amended example script:
AutoIt         
#include "Toast_Gradient.au3" Local $sMsg, $hProgress, $aRet[2] $sMsg  = "This Toast has a solid title bar." & @CRLF & @CRLF $sMsg &= "It is easy to choose the colours for the bar and the text to " $sMsg &= "ensure you can see both the text and the closure [X]" _Toast_Set(0, 0xFF0000, 0xFFFF00, 0x0000FF, 0xFFFFFF, 10, "Arial") $aRet = _Toast_Show(0, "Gradient Title Bar", $sMsg, -10) ConsoleWrite("Toast size: " & $aRet[0] & " x " & $aRet[1] & @CRLF) $sMsg  = "This Toast has a gradient filled title bar." & @CRLF & @CRLF $sMsg &= "But you must choose the colours for the bar and the text carefully " $sMsg &= "or you may have difficulty seeing both the text and the closure [X] " $sMsg &= "as in this example" Global $aColours[3] = [0xFF0000, 0x00FFFF, True] _Toast_Set(5, $aColours, 0xFFFF00, 0x0000FF, 0xFFFFFF, 10, "Arial") $aRet = _Toast_Show(0, "Gradient Title Bar", $sMsg, -10) ConsoleWrite("Toast size: " & $aRet[0] & " x " & $aRet[1] & @CRLF) Global $aColours[3] = [0xFF0000, 0x00FFFF, False] _Toast_Set(5, $aColours, 0xFFFF00, 0x0000FF, 0xFFFFFF, 10, "Arial") $aRet = _Toast_Show(0, "Gradient Title Bar", $sMsg, -10) ConsoleWrite("Toast size: " & $aRet[0] & " x " & $aRet[1] & @CRLF) $sMsg  = "And back to solid again" _Toast_Set(0, 0xFF0000, 0xFFFF00, 0x0000FF, 0xFFFFFF, 10, "Arial") $aRet = _Toast_Show(0, "Solid Title Bar", $sMsg, -10) ConsoleWrite("Toast size: " & $aRet[0] & " x " & $aRet[1] & @CRLF) _Toast_Hide()

M23
StringSize - Automatically size controls to fit text - ExtMsgBox - A user customisable replacement for MsgBox

Toast - Small GUIs which pop out of the Systray - Marquee - Scrolling tickertape GUIs

Scrollbars - Automatically sized scrollbars with a single command - GUIFrame - Subdivide GUIs into many adjustable frames

GUIExtender - Extend and retract multiple sections within a GUI - NoFocusLines - Remove the dotted focus lines from buttons, sliders, radios and checkboxes

ChooseFileFolder - Single and multiple selections from specified path tree structure - - Notify - Small notifications on the edge of the display

RecFileListToArray - An alternative to _FileListToArray with user-defined include/exclude masks, maximum recursion level, sorting and displayed path options

GUIListViewEx - Insert, delete, move, drag and sort ListView items


#56 James

James

    jbrooksuk

  • MVPs
  • 9,468 posts

Posted 27 January 2010 - 01:37 PM

I was thinking about that while I was posting :D Originally, I set it to work with the wrong function Posted Image

I think the third option in the array is a much better way of doing it.

James

#57 Melba23

Melba23

    Yes, me!

  • Moderators
  • 15,309 posts

Posted 31 January 2010 - 11:41 AM

James,

This is my take on the "Show Resource" version of the Toast UDF. You pass the resource name within [], and you need to add the type if it is not RC_DATA. Then the Toast code sorts it out - well it does for me! :huggles:

Change this line in the UDF:
; Create icon If $iIcon_Reduction Then GUICtrlCreateIcon($sDLL, $iIcon_Style, 10, 10 + $iTitle_Height)

to read:
AutoIt         
; Create icon If $iIcon_Reduction Then     ; Look for the []     If StringInStr($sDLL, "[")  And StringInStr($sDLL, "]") Then         ; If found then remove them         $sDLL = StringRegExpReplace($sDLL, "\[|\]", "")         ; Assume RC_DATA         $iIcon_Style = $RT_RCDATA         ; See if there is a specified type         Local $aRet = StringSplit($sDLL, ";")         If Not @error Then             ; If there was then use it             $sDLL = $aRet[1]             $iIcon_Style = $aRet[2]         EndIf         ; Set the resource to the control         GUICtrlCreatePic("", 10, 10 + $iTitle_Height, 16, 16) ; Max size 32x32 here         _ResourceSetImageToCtrl(-1, $sDLL, $iIcon_Style)     Else         GUICtrlCreateIcon($sDLL, $iIcon_Style, 10, 10 + $iTitle_Height)     EndIf EndIf

You will also need to include Zedna's Resources within the UDF - I had to modify it slightly as both it and Yashied's WinAPIEx include were declaring the same constants. It just needs the Global Const $RT_ lines commenting out in one or the other include file.

And here is the little test script I used to develop it. I use Jos' new Beta AutoIt3Wrapper to get the resources in place - much neater than ResHacker IMHO. :'(
#AutoIt3Wrapper_UseUpx=n #AutoIt3Wrapper_Res_File_Add=Test.bmp, RT_BITMAP, RESOURCE_1 #AutoIt3Wrapper_Res_File_Add=Test.gif, RT_RCDATA, RESOURCE_2 #include "Toast_Resource.au3" ; I renamed the modified UDF Global $aColor[3] = [0x97D9F5, 0xe9eff5, False] _Toast_Set(0, $aColor, 0x000000, 0xe9eff5, 0x000000, 11, "Arial") $aRet = _Toast_Show("[RESOURCE_1;" &  $RT_BITMAP & "]", "Title", "Some short text", 5) $aRet = _Toast_Show("[RESOURCE_2]", "Title", "Some short text", 5) _Toast_Hide()

I hope that does what you want in a suitable pleasing and eye-catching manner. :D

M23

Edit: Of course you can also use the actual constant value for $RT_BITMAP which makes the syntax a bit less complex:
$aRet = _Toast_Show("[RESOURCE_1;2]", "Title", "Some short text", 5)


Edit: Code changed to restore full functionality for showing icons & exes. Sorry! :D

Edited by Melba23, 31 January 2010 - 02:20 PM.

StringSize - Automatically size controls to fit text - ExtMsgBox - A user customisable replacement for MsgBox

Toast - Small GUIs which pop out of the Systray - Marquee - Scrolling tickertape GUIs

Scrollbars - Automatically sized scrollbars with a single command - GUIFrame - Subdivide GUIs into many adjustable frames

GUIExtender - Extend and retract multiple sections within a GUI - NoFocusLines - Remove the dotted focus lines from buttons, sliders, radios and checkboxes

ChooseFileFolder - Single and multiple selections from specified path tree structure - - Notify - Small notifications on the edge of the display

RecFileListToArray - An alternative to _FileListToArray with user-defined include/exclude masks, maximum recursion level, sorting and displayed path options

GUIListViewEx - Insert, delete, move, drag and sort ListView items


#58 James

James

    jbrooksuk

  • MVPs
  • 9,468 posts

Posted 31 January 2010 - 01:26 PM

Melba,

Too clever Posted Image

Thanks so much for doing that for me! I love the syntax for adding the resource as well, genius :D

James

#59 eri

eri

    Wayfarer

  • Active Members
  • Pip
  • 69 posts

Posted 16 February 2010 - 09:57 AM

Hi.. Melba.. :mellow:
I have test U 1st sample in 1st page..

the title Text goes Here ~ Midwidth (OK)
max width and Normal Header (OK)
Unwrapped Toast (OK)
progress bar (OK)
Script Continuing Toast.. (Error)
Error in Toast.au3
AdlibRegister("_Toast_Timer_Check",100)
^Error
Unknown Funtion Name.. :lol: :P
U are genius.. :(

#60 Melba23

Melba23

    Yes, me!

  • Moderators
  • 15,309 posts

Posted 16 February 2010 - 10:14 AM

eri,

What version of AutoIt are you using? AdlibRegister/Unregister came in with 3.3.2.0 and AdlibEnable/Disable was finally removed in 3.3.4.0. The Toast UDF does say:

; AutoIt Version : 3.3.2.0 - uses AdlibRegister/Unregister

You should really update if you are using a version before 3.3.2.0, but if you do not want to, then replace AdlibRegister with AdlibEnable and AdlibUnRegister with AdlibDisable . You should find that the UDF will work for you then. :mellow:

M23
StringSize - Automatically size controls to fit text - ExtMsgBox - A user customisable replacement for MsgBox

Toast - Small GUIs which pop out of the Systray - Marquee - Scrolling tickertape GUIs

Scrollbars - Automatically sized scrollbars with a single command - GUIFrame - Subdivide GUIs into many adjustable frames

GUIExtender - Extend and retract multiple sections within a GUI - NoFocusLines - Remove the dotted focus lines from buttons, sliders, radios and checkboxes

ChooseFileFolder - Single and multiple selections from specified path tree structure - - Notify - Small notifications on the edge of the display

RecFileListToArray - An alternative to _FileListToArray with user-defined include/exclude masks, maximum recursion level, sorting and displayed path options

GUIListViewEx - Insert, delete, move, drag and sort ListView items





0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users