Jump to content
timmy2

Trying to display text with a transparent BG atop a Veeblefetzer

Recommended Posts

The following demo script, drawn largely from examples by @UEZ, lets me display colored text over a transparent background using my choice of font, type size, etc.  It is a single function (out of many) in the project I'm scripting, but it is crucial to my goal of displaying messages in an interesting way (IMHO).  

(For the purpose of this forum post it displays a single string variable; my actual project script reads a number of  possible messages from a text file into an array and then chooses the messages to be displayed based on stuff that happens in the course of someone using my program.)

Note that I am seeking help only to overcome my inability to figure out how to display this text atop a PNG graphic, and make the result a draggable object.

 

#cs
Display a message one character at a time
with the goal of adding a PNG graphic overlay

#ce

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


#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <GUIConstants.au3>

Global $sMessage
Global $iString = 0
Global $aInfo
Global Const $SC_DRAGMOVE = 0xF012

HotKeySet("{Esc}","Close")

; in my actual script I read in a file containing all the text to be displayed

Global $sText = _
"Lorem ipsum dolor sit amet, consectetur" & @CRLF & _
"elit, sed do eiusmod tempor incididunt ut" & @CRLF & _
@CRLF & _
"Et dolore magna aliqua. Ut enim ad minim," & @CRLF & _
"quis nostrud exercitation ullamco laboris nisi" & @CRLF & _
"aliquip ex ea commodo consequat." & @CRLF & _
@CRLF & _
"Duis aute irure dolor in reprehenderit in" & @CRLF & _
"voluptate velit esse cillum dolore eu fugiat" & @CRLF & _
"nulla pariatur." & @CRLF


; Create GUI

Global $hGUI = GUICreate("", 450, 340, -1, -1, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST))

GUISetBkColor(0xFF000000) ; will change background color, which UEZ doesn't use in his example, but then he doesn't want a BG

GUISetState(@SW_SHOW)

; Draw a string
_GDIPlus_Startup()
Global $hBrush = _GDIPlus_BrushCreateSolid(0xFF99ff33)
Global $hFormat = _GDIPlus_StringFormatCreate()
Global $hFamily = _GDIPlus_FontFamilyCreate("VT323")
Global $hFont = _GDIPlus_FontCreate($hFamily, 14, 0)
Global $tLayout = _GDIPlus_RectFCreate(20, 20, 0, 0)
Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
Global $hBitmap = _GDIPlus_BitmapCreateFromScan0(420, 300)
Global $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

  _GDIPlus_GraphicsSetTextRenderingHint($hBuffer, 4)
  _GDIPlus_GraphicsSetSmoothingMode($hBuffer, 4)

GUIRegisterMsg($WM_LBUTTONDOWN, "_WM_LBUTTONDOWN")


For $iString = 1 to StringLen($sText)
    $sMessage = StringLeft($sText,$iString)
    $aInfo = _GDIPlus_GraphicsMeasureString($hGraphic, $sMessage, $hFont, $tLayout, $hFormat)
    _GDIPlus_GraphicsClear($hBuffer, 0x000000)
    _GDIPlus_GraphicsDrawStringEx($hBuffer, $sMessage, $hFont, $aInfo[0], $hFormat, $hBrush)
    $hHBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    _WinAPI_BitmapDisplayTransparentInGUI($hHBitmap, $hGUI)
    _WinAPI_DeleteObject($hHBitmap)
Next

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Close()

; Clean up resources (my best guess at what needs closing/shutting down)

Func Close()
    _GDIPlus_FontDispose($hFont)
    _GDIPlus_FontFamilyDispose($hFamily)
    _GDIPlus_StringFormatDispose($hFormat)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_ImageDispose($hBitmap)
    _GDIPlus_Shutdown()
    Exit
EndFunc   ;==>Close

Func _WinAPI_BitmapDisplayTransparentInGUI(ByRef $hHBitmap, ByRef $hGUI, $iOpacity = 0xFF, $bReleaseGDI = True)
    If Not BitAND(GUIGetStyle($hGUI)[1], $WS_EX_LAYERED) = $WS_EX_LAYERED Then Return SetError(1, 0, 0)
    Local $tDim = DllStructCreate($tagBITMAP)
    If Not _WinAPI_GetObject($hHBitmap, DllStructGetSize($tDim), DllStructGetPtr($tDim)) Then Return SetError(2, 0, 0)
    Local $tSize = DllStructCreate($tagSIZE), $tSource = DllStructCreate($tagPOINT), $tBlend = DllStructCreate($tagBLENDFUNCTION)
    Local Const $hScrDC = _WinAPI_GetDC(0), $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC), $hOld = _WinAPI_SelectObject($hMemDC, $hHBitmap)
    $tSize.X = $tDim.bmWidth
    $tSize.Y = $tDim.bmHeight
    $tBlend.Alpha = $iOpacity
    $tBlend.Format = 1
    _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, DllStructGetPtr($tSize), $hMemDC, DllStructGetPtr($tSource), 0, DllStructGetPtr($tBlend), $ULW_ALPHA)
    _WinAPI_ReleaseDC(0, $hScrDC)
    _WinAPI_SelectObject($hMemDC, $hOld)
    _WinAPI_DeleteDC($hMemDC)
    If $bReleaseGDI Then _WinAPI_DeleteObject($hHBitmap)
    Return True
EndFunc

Func _WM_LBUTTONDOWN($hWnd, $iMsg, $wParam, $lParam)
    Switch $hWnd
        Case $hGUI
            _SendMessage($hWnd, $WM_SYSCOMMAND, $SC_DRAGMOVE, 0)
    EndSwitch
EndFunc   ;==>_WM_LBUTTONDOWN

 

The above script lets me push the text out to the screen, but I want to display the text atop a PNG graphic, which is an imagined piece of hand-held test equipment that I'll refer to here as the Veeblefetzer.

Here's a half-size animated gif of the desired result.

aniGif of tester (half-size).gif

 

Note that initially I used a different script to stream the text out atop a built-in black background rectangle.  I figured I would place the Veeblefetzer graphic above the text -- with the center "display area" of the Veeblefetzer cut out (transparent).  

Then UEZ's example script came along. The benefit of using text that has a transparent BG, and placing it in a layer above the Veeblefetzer, is this lets me include reflections in the Veeblefetzer's display.

Now to the challenges I'm ill-equipped to figure out.  

The function I use to display the Veeblefetzer is below. It, too, is drawn from some of examples by @UEZ.

There are actually two functions below, one I use to display the PNG graphic, and one that can be used to fade the graphic in or out.  I include it here only because it might be applicable to my ancillary goal of needing to clear the text on the handheld display before streaming the next message onto the Veeblefetzer's display.  I realize that the fade in/out function is for graphic objects, so it may not be applicable to text. 

 

; Display the image at center unless otherwise specified. If Fader will not be used then $iAlpha's default of 0xFF is good.
; If Fader will be used then start with $iAlpha equal to zero.  Option to make this image "Always on top" is also available.
Func DisplayImage($sFile, $iPosX = -1, $iPosY = -1, $iAlpha = 0xFF, $bTopmost = True)
    Local Const $hBmp_Background = _GDIPlus_BitmapCreateFromFile($sFile) ;load the image
    If @error Then Return SetError(1, 0, 0) ;image cannot be loaded
    Local Const $iW = _GDIPlus_ImageGetWidth($hBmp_Background), $iH = _GDIPlus_ImageGetHeight($hBmp_Background) ;get the dimension of the background image
    Local Const $hGUI = GUICreate("", $iW, $iH, $iPosX, $iPosY, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST * $bTopmost, $WS_EX_TOOLWINDOW)) ;create GUI with appropriate styles and extented style (borderless transparent GUI)
    GUICtrlCreateLabel("", 0, 0, $iW, $iH, Default, $GUI_WS_EX_PARENTDRAG) ;create a hidden label for GUI dragging
    GUISetState(@SW_SHOW, $hGUI) ;show GUI

    Local Const $hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH) ;define an empty bitmap where all the gfx stuff will copied to
    Local Const $hGfx = _GDIPlus_ImageGetGraphicsContext($hBitmap) ;get the context to the bitmap to be able to copy / draw to the bitmap
    _GDIPlus_GraphicsDrawImageRect($hGfx, $hBmp_Background, 0, 0, $iW, $iH) ;draw background image to the empty bitmap

    ;display GDI+ with transparency on desktop
    Local Const $hHBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap) ;convert GDI+ image to GDI to display it on the screen using GDI functions
    Local Const $hScrDC = _WinAPI_GetDC($hGUI) ;get the device context (dc) handle of the GUI
    Local Const $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC) ;create a compatible dc handle
    Local Const $hOld = _WinAPI_SelectObject($hMemDC, $hHBitmap) ;selects the GDI bitmap object into the specified device context
    Local Const $tSize = DllStructCreate($tagSIZE) ;create a $tagSIZE struct (x = width, y = height)
    DllStructSetData($tSize, "X", $iW) ;set data for width
    DllStructSetData($tSize, "Y", $iH) ;set data for height
    Local $tSource = DllStructCreate($tagPOINT) ;create a $tagPOINT struct (x = x position, y = y position)
    Local $tBlend = DllStructCreate($tagBLENDFUNCTION) ;create $tagBLENDFUNCTION struct -> see help file for more info
    DllStructSetData($tBlend, "Alpha", $iAlpha) ;set the alpha channel of the GUI -> 255 = opaque, 0 = transparent
    DllStructSetData($tBlend, "Format", 1) ;set the format to 1 -> bitmap has alpha channels
    DllCall("user32.dll", "bool", "UpdateLayeredWindow", "hwnd", $hGUI, "handle", $hScrDC, "ptr", 0, "struct*", $tSize, "handle", $hMemDC, "struct*", $tSource, "dword", 0, "struct*", $tBlend, "dword", $ULW_ALPHA) ;display bitmap on screen

    ;release resources otherwise memory will filled up (memory leak)
    _GDIPlus_GraphicsDispose($hGfx)
    _GDIPlus_BitmapDispose($hBitmap)
    Local $aResource[7] = [$hGUI, _ ;GUI handle
                           $hScrDC, _ ;device context (dc) handle of the GUI (GDI)
                           $hHBitmap, _ ;GDI bitmap handle of the displayed image
                           $hMemDC, _ ;compatible dc handle from $hScrDC
                           $tBlend, _ ;tBlend struct (source blend oper., flags, alpha value, format) -> see help file for description
                           $tSize, _ ;tSize struct (width and height of the window / image)
                           $tSource] ;tSource struct for x / y position of the GUI
    Return $aResource ;returns the handles to release it later or to use it for fading effects
EndFunc   ;==>DisplayImage

; This function releases the resources of a specific image and closes it
Func ReleaseResources(ByRef $aResource)
    If Not IsArray($aResource) Then Return SetError(1, 0, 0)
    If UBound($aResource) <> 7 Then Return SetError(2, 0, 0)
    _WinAPI_ReleaseDC($aResource[0], $aResource[1])
    _WinAPI_DeleteDC($aResource[3])
    _WinAPI_DeleteObject($aResource[2])
    GUIDelete($aResource[0])
EndFunc   ;==>ReleaseResources

; To fade in an image leave $bIn at default (True); to fade out specify False.
; There are also options to set the ending transparency level (0 transparent, 255 opaque), speed and delay.
; If you change the speed or delay be sure to specify $bIn and $iTrans, otherwise you'll wonder why the fade-in or out isn't what you hoped for.
; The default values are specified in the function below.
Func _Fader($res1, $bIn = True, $iTrans = 255, $speed = 3, $delay = 10  )
    If Not IsArray($res1) Then Return SetError(1, 0, 0)
    If UBound($res1) <> 7 Then Return SetError(2, 0, 0)
    Switch $bIn
        Case True
            For $a = 0 To $iTrans Step $speed
                DllStructSetData($res1[4], "Alpha", $a)
                DllCall("user32.dll", "bool", "UpdateLayeredWindow", "hwnd", $res1[0], "handle", $res1[1], "ptr", 0, "struct*", $res1[5], "handle", $res1[3], "struct*", $res1[6], "dword", 0, "struct*", $res1[4], "dword", $ULW_ALPHA) ;display bitmap on screen
                Sleep($delay)
            Next
        Case Else
            For $a = $iTrans To 0 Step -$speed
                DllStructSetData($res1[4], "Alpha", $a)
                DllCall("user32.dll", "bool", "UpdateLayeredWindow", "hwnd", $res1[0], "handle", $res1[1], "ptr", 0, "struct*", $res1[5], "handle", $res1[3], "struct*", $res1[6], "dword", 0, "struct*", $res1[4], "dword", $ULW_ALPHA) ;display bitmap on screen
                Sleep($delay)
            Next
    EndSwitch
EndFunc   ;==>_FadeIn

 

Is anyone willing to step in and show me how to use the text display function along with the PNG display function, so that the resulting Veeblefetzer will be a single draggable object on screen?

I'm equally baffled about how to properly clear off one message before displaying the next.

The reason?   I have only the most rudimentary grasp of the commands within -- or the relationships between -- what seem like three distinct sections common to each of UEZ's scripts:

Initialization (which defines a number of attributes, some of which are obvious to me, for text in this case)

_GDIPlus_Startup()
Global $hBrush = _GDIPlus_BrushCreateSolid(0xFF99ff33)
Global $hFormat = _GDIPlus_StringFormatCreate()
Global $hFamily = _GDIPlus_FontFamilyCreate("VT323")
Global $hFont = _GDIPlus_FontCreate($hFamily, 14, 0)
Global $tLayout = _GDIPlus_RectFCreate(20, 20, 0, 0)
Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
Global $hBitmap = _GDIPlus_BitmapCreateFromScan0(420, 300)
Global $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

  _GDIPlus_GraphicsSetTextRenderingHint($hBuffer, 4)
  _GDIPlus_GraphicsSetSmoothingMode($hBuffer, 4)

 

Delivery... (apparently what's needed to display the text)

$aInfo = _GDIPlus_GraphicsMeasureString($hGraphic, $sMessage, $hFont, $tLayout, $hFormat)
    _GDIPlus_GraphicsClear($hBuffer, 0x000000)
    _GDIPlus_GraphicsDrawStringEx($hBuffer, $sMessage, $hFont, $aInfo[0], $hFormat, $hBrush)
    $hHBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    _WinAPI_BitmapDisplayTransparentInGUI($hHBitmap, $hGUI)
    _WinAPI_DeleteObject($hHBitmap)

Even at my primitive level of understanding I have figured out that you can reuse the above "delivery" section to display other strings before proceeding to the next section.

 

Cleanup... (apparently needed to release resources, which to me is like closing a previously opened file: it's part of the process so I'll do it):

_GDIPlus_FontDispose($hFont)
    _GDIPlus_FontFamilyDispose($hFamily)
    _GDIPlus_StringFormatDispose($hFormat)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_ImageDispose($hBitmap)
    _GDIPlus_Shutdown()

 

(You're getting an inside look at a monkey brain at work here!)

UEZ's script to display the PNG graphic follows a similar pattern. What I cannot figure out is how to merge the two scripts, while avoiding redundancy and conflicts. To clear the text between messages must I release any resources, and if so: which ones? AND, how do I group the PNG graphic with the text so the resulting "object" can be moved around on the screen?

 

 

Edited by timmy2
clarification

Share this post


Link to post
Share on other sites

After 29 views but no answer I wonder if and where I screwed up. I'm not writing a bot, nor am I asking for someone to write my script.

I started the "output to display" phase of my project with this post because I accidentally discovered that AutoHotKey appears to have a single, simple function for displaying text with user-specified font, size, color, transparency, etc.

I wondered if Autoit has a similar function.

I've already got a lot of interest and time invested in Autoit -- and an almost finished project script, so I wondered if we have anything as easy to use for displaying text and graphics (see my original post above for details).

My impression at this point is that we do not -- or at least I cannot find it. Instead we have numerous _WinAPI and _GDIPlus commands, which are probably infinitely powerful, but are not nearly as accessible to the occasional "programmer" as most of what Autoit has to offer.  (think of how much code _ArrayDisplay replaces!)

Am I wrong?  If I've chosen the wrong approach -- within the confines of Autoit -- to display text atop a graphic (per my goals) please tell me.

Share this post


Link to post
Share on other sites

Here something to play with

#cs
Display a message one character at a time
with the goal of adding a PNG graphic overlay

#ce

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


#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <GUIConstants.au3>

Global $sMessage
Global $iString = 0
Global $aInfo

HotKeySet("{Esc}","Close")

; in my actual script I read in a file containing all the text to be displayed

Global $sText = _
"Lorem ipsum dolor sit amet, consectetur" & @CRLF & _
"elit, sed do eiusmod tempor incididunt ut" & @CRLF & _
@CRLF & _
"Et dolore magna aliqua. Ut enim ad minim," & @CRLF & _
"quis nostrud exercitation ullamco laboris nisi" & @CRLF & _
"aliquip ex ea commodo consequat." & @CRLF & _
@CRLF & _
"Duis aute irure dolor in reprehenderit in" & @CRLF & _
"voluptate velit esse cillum dolore eu fugiat" & @CRLF & _
"nulla pariatur." & @CRLF

;MsgBox (1,"test", $sText)

; Create GUI

Global $hGUI = GUICreate("", 800, 465, -1, -1, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST))
; UEZ's example uses the following instead:
; Global $hGUI = GUICreate("Parent", $iW, $iH, -1, -1, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST)

GUISetBkColor(0xFF000000) ; will change background color, which UEZ doesn't use in his example, but then he doesn't want a BG

GUISetState(@SW_SHOW)

; Draw a string
_GDIPlus_Startup()
Global $hBitmap_Bg = _GDIPlus_BitmapCreateFromMemory(_BG())
Global $hBrush = _GDIPlus_BrushCreateSolid(0xFF80F033)
Global $hFormat = _GDIPlus_StringFormatCreate()
Global $hFamily = _GDIPlus_FontFamilyCreate("ARIAL")
Global $hFont = _GDIPlus_FontCreate($hFamily, 12, 0)
Global $tLayout = _GDIPlus_RectFCreate(230, 100, 350, 245)
Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
Global $hBitmap = _GDIPlus_BitmapCreateFromScan0(800, 465) ; UEZ used ..CreateFromScan0 (?)
Global $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

; UEZ's Example used the following commands that are not in my script, and I cannot figure out which ones are
; applicable to my goal vs the goal of his example, which was to display a live digital clock

;  _GDIPlus_StringFormatSetAlign($hFormat, 0)
;  Global $hImage = _GDIPlus_BitmapCreateFromScan0($iW, $iH) ; must achieve something other than CreateFromHWND
  _GDIPlus_GraphicsSetTextRenderingHint($hBuffer, 4)
  _GDIPlus_GraphicsSetSmoothingMode($hBuffer, 4)


For $iString = 1 to StringLen($sText)
    $sMessage = StringLeft($sText,$iString)
    $aInfo = _GDIPlus_GraphicsMeasureString($hGraphic, $sMessage, $hFont, $tLayout, $hFormat)
;~     _GDIPlus_GraphicsClear($hBuffer, 0x000000)
    _GDIPlus_GraphicsDrawImageRect($hBuffer, $hBitmap_Bg, 0, 0, 800, 465)
    _GDIPlus_GraphicsDrawStringEx($hBuffer, $sMessage, $hFont, $aInfo[0], $hFormat, $hBrush)
    $hHBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    _WinAPI_BitmapDisplayTransparentInGUI($hHBitmap, $hGUI)
    _WinAPI_DeleteObject($hHBitmap)
Next

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Close()

; Clean up resources (my best guess at what needs closing/shutting down)

Func Close()
    _GDIPlus_FontDispose($hFont)
    _GDIPlus_FontFamilyDispose($hFamily)
    _GDIPlus_StringFormatDispose($hFormat)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_ImageDispose($hBitmap)
    _GDIPlus_ImageDispose($hBitmap_Bg)
    _GDIPlus_Shutdown()
    Exit
EndFunc   ;==>Close

Func _WinAPI_BitmapDisplayTransparentInGUI(ByRef $hHBitmap, ByRef $hGUI, $iOpacity = 0xFF, $bReleaseGDI = True)
    If Not BitAND(GUIGetStyle($hGUI)[1], $WS_EX_LAYERED) = $WS_EX_LAYERED Then Return SetError(1, 0, 0)
    Local $tDim = DllStructCreate($tagBITMAP)
    If Not _WinAPI_GetObject($hHBitmap, DllStructGetSize($tDim), DllStructGetPtr($tDim)) Then Return SetError(2, 0, 0)
    Local $tSize = DllStructCreate($tagSIZE), $tSource = DllStructCreate($tagPOINT), $tBlend = DllStructCreate($tagBLENDFUNCTION)
    Local Const $hScrDC = _WinAPI_GetDC(0), $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC), $hOld = _WinAPI_SelectObject($hMemDC, $hHBitmap)
    $tSize.X = $tDim.bmWidth
    $tSize.Y = $tDim.bmHeight
    $tBlend.Alpha = $iOpacity
    $tBlend.Format = 1
    _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, DllStructGetPtr($tSize), $hMemDC, DllStructGetPtr($tSource), 0, DllStructGetPtr($tBlend), $ULW_ALPHA)
    _WinAPI_ReleaseDC(0, $hScrDC)
    _WinAPI_SelectObject($hMemDC, $hOld)
    _WinAPI_DeleteDC($hMemDC)
    If $bReleaseGDI Then _WinAPI_DeleteObject($hHBitmap)
    Return True
EndFunc

;Code below was generated by: 'File to Base64 String' Code Generator v1.20 Build 2015-09-19

Func _BG($bSaveBinary = False, $sSavePath = @ScriptDir)
    Local $BG
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '+G1K3mvo9/4SPL5WZ3zDgw0RgvMA+UzX19cYkZhOV4Wm9litaImG0uiK0Wi0KjZxHGcxgPsqJo9iGzMbFDbhwaE/KxoHE9j7gy1ix5vbBjn+PglNe7SPBgEfnzml/7F3NqGRHFccD6EnahZKWBN3QNNyW2i3GQ+WVlqJbpSDlATPjMGXRBix0YKHxWZFxEhgIkH2JFjik2EjWEQuJtgxe1hv57IXhQXnEAKbS9gw5BofcvBtjz7llPd/71VV136IPdiRDvNn1R9V1dU99vv161evpueg3e4P+/02qR+ofY/+t/cPymEfsFBlWZJ9kLDfLnAA7dBRDx/+gRpAByQ9msrRgMStnAociGpdol0fxQWfHvVeUo5TytV96YRz9SHX9T36GAf0QaQ26EYb6MXoKQpXjm2+RP7TBYk+uzRKTL8sIvqPUZgoQa07DNtTpCSZEn34IRY7O/vplGpngrSz3V2WqQtzf8H0F6RCzovGetd9d/zWxmCzd3vr6mUkBb//6uWu8jEcMiCFqCxLWigxtAUZY1BlTBRF2KBVksRx3Gjk1fDhkA5AC5EhcWWWxaHSlA6IU9SlWCZJkkpNI8sasXQY19Qg+U4iknSPNdFEa2qDqiRpZHxhZb8kFVFGRXw895GmqZ4riTO+rAhLrk+SPOdLqV9nSt0Z+pQZirPcmDzPI3z4PLfXI5eGeumWu+KKNG21Uu6G/hot0sTOf9Y6nFd/bfXqErmQ8wLIWG8DEKtbNNB0+/b67+d+hHzgG9ePDskZMAFwIWJ7hvYrWvTBB8gohI+qLExkzIj+aDki24GeZHn1+efD0kQ5VUgHoCjPGhC10OVLK4OwgWWr0XhCcjVx5GTKfsGn8UehEKrKSi/vhSfQzv1+nqOodkSWR9IJNmlbCcnt0WT4vs8YJZbGUBaQvcfTnBXZnSVAztND1ngWlueDhjd7J7c3fzVHc+qmO8ubNw7YR1QECEnNGxY2IioYnIKJqQzssV8RGCOjgqmMYLLVcAhAosjxYdS08pisCmuSN/qsLtie1OleHkEjXuPYOFNRX2yzCuiIACkNOoZAJ5mwKfplIdfNFp05KQo5i6pqIEgBt/YoE4uAUYqzCGIXKUW+lafOL0OlQGR/++bf/92R2QqrC+eJkHEKxHmQd2femV863jrprV3+hADpLHdvH3IIYKpqCGtjjUzBVJChYcMJgJQAxDsJKI5NxTJeI8AjJi2PWQRBbE2qwZYeo5D5QZ2FJ4uIlkhkIi8lBZUMjr1OAwhiVBNShKf6MCKer89xEevZrS/ACQMHAhaUU8jhqjjEMeMi6OMqbMv4GecUug4s0jRtNfe3iZD7FKJTfr2zuMQ6B++uH+uPdQfC07C2tjaXd2l6HQB5/7A9RYiUJTmBOgxFsDJ692R/ErkijglieBAWwhRURryIXegg1od1Q8SHkSwKjh09hBfaU9sktSZ6SwcghYVUAhOUKc/gR1beems8xNqbF04pFOIIX6wfwJ99hF7dJb+sAEgTgGzfXdsFIT+ffrxwbgAZK+TjrWPKI8+u8qzs1b2j9w+nkqTdL4feAzALoSIIxQCEQ3H1EASHBOkVXFCpbGAZEQ3KB0gBH9hkKTBwIc7+REIV9hgQcOAAyfRIhAVMAxBAr97XFHBxSjC3a4TyEIb7zk15QsIKLfb+DBf50krTiWZzcufRo+7a18iEIArhWTPjKOTM9TotLiodOs/9T70Hi51Oh+YjfkUJkcMPAciQADEvAiRyYifCnBhYLDMAmzbVEB7IGidaMgH4E3MX1R54eJcrtQ3EKzBHioKTU2ygpDFblgF0o1Bq1M4IVxKBvKQRo08vZlQjIi3iM9mWHHu9yIMoeaFaFpCTb1YeU/oJ/xaX5vmLhWebTx/rzQAQmoW1SbMeHpAD+WRurrO6d3Ln1wxISYAYtYQAELEHDZuxRPzOjgQAyHApG3PF8YmpuxAVIMhiEbaVi8wColsgxQUDMa+0r5z5iCHeMVKj4AAW'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= 'V0u3RvBRLAJkjezQupUASOiqSUoQIG/zkUi7bneObPtmgx8QjX/UBFWsCxZL3wO6bFNCOtC410CTvcfBh/2ESa/UaJLWcbkBmVWEiKeUGoUKnW7cgdEqHmLBI3Q2EiBCiPWOPogW/sNYAEDoTNX+U0XHy8xmB0IsvTJVFCDYScfftI4AyewCIaXndl8mO4ChNPIj9+719V26dPG0DxDcxSJAtqEptAAQlp5XfESAHK0I/6DOnueWSA69n0ISbNE5G6PXvM8AeW+5+AiFWL7j1b4Q6/woC7H4QV6UV3jH8MsjafAgEQsBASFoFEIM4/79/L5TkIEmlfTpj89fvUp4bM/rQD1VIyehADwUsqUer5atlkqcBEghAVL/NiCYNbF5GCBUcl0AiNWgg/9wuY73I8ICUKcuNJQZzSQk6FV+huvBYmax4qyIrqzXnGPRcTk7Skt//etz50j94MCBLWQWsvTcY+ik7yx5ByA4+zMeAEQQKQQga+vaznWxfRBh1ASAMPGH5bNQFSsACKpYuRe3jE6t8l38oQq9AMjNIwIg7y0EBMEDPRHQw0BgxUTSIQ7ChKC3l5YqcHJEBj5IzG/pGoUEyDUN7jXAHPVlCLHYA/8EIZPd7rKZ9MVJ0kWASOWblQDE3tZ5vH9msucRgCpqeFhgBCB3vPAgJIEgEaMBnZGTIbwv/VsYENnNCDmAn2PH8KHs/nsGCOuk+0IsHio5RwpbKxJhVMAijUJyIR9BBaGusvRbaVhMCoz0D5gHASDL6T5CVaxoXuddzQAZ3lIzhSqW3xYBEhYW1El/kA8PcmD3gWOWaRz1ILt8AM/JXtj2c//L3rkGRX2mWRxo09CCeGsa0DB0o7Vyv2fBNJck0qOEYRKMXG2BACpQcglIIyhCDMIS5XoRRINxdTqJhQSGaBiZiUQTR8yauInoTHYnViIZa2Zq3KR2alK7n/Y87/vS3Yqp2qnKvzsf+qmoPVXwrX9z3vNcn32n0OEHCFclAyQqSdfZ2dmOpFTeDAdk0jCE4aSe7HA1AEE8CIh3WJSuB4nXwdG8GQBCBqlxuqhm5PKOHaf/Atcip4GpHyZeeOERCL1c+PJFAoQRwpoV5wEhBZkHBP4DhAAQuoWw7gFAKIuFfUwyTpUNw14HIUAozRuUPNVtBkQICeV4f1tW9tn3ADJnfOn5lwGCdFHKAImM0gGQKwVZOEYyD0jLUJden1WHiSkfMrGWaV6y9ePZVd1DAIQsy4dESF4LAGlv79SFh4T5M0CkjA3PEiB8e9hcPwAxmfSOWlIQZvIgGyCEHyqsZoDQAR0AwmfS4wK9ZLZ16HZALK7cBl1kgKxwtwAEEgKLzgBxUmi1AhDLNO9L4ENSQFBM9gnNT8f76kpBQUVLHhUaEHgzjRZhfK8uWB3rAw/7ICDKgPz07JHuCgNZFqRduYQU6a9VYSYkmAMikxSQGA4IRQpSvuYslrwjH4BQEYQEhAGCIEDIgzghi8X4CAIgS7285Lbnw64gcXECECMAWbVKECIw4YDAg9ART5kFIO+lprI6yPMOUgMi94lVU5tJQUGWqIIgoAiXRouKKsoTosK8H75RKAdSuSPlqOBNTzI+ICGw9YY3kPfqyU4ItwYgjyebAEntj+4WgGARt19+rg69WAgGCN3wZIemGCBaR4VY7k4K4uaqZOuWbBt2BQEg1M0LQNb+btVjj7FtAqZ4/fUTHBAksWQyEyDvpaSmpm4ew9IG6QHxjgzJze4BH/rBS5S0pe/72eOw3S2GofK08Aix5coMCCGVUEfr1ifuzJwSgMC1FLUiMdyTEEyAyKQF5BUOCCGSMkeAlBEgbFM9AbKW78SCeogrU4jm7sSNMscmDb8CHSQAkdn4xpRdQcyATBEgP/nJY6ssALE06ZaApGwGIHMw6eslBqSJxkFCgrMLqKqBTsBTAIQImcU2RyySZ4A4PQSIExQkoaYI69bROIjGDwFIS5E+KwsNjuNqUhCVpIA8LQBJwZ850xOL'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= 'mJ1PPI9lRsmHOpC9nS193X1jZw50dBwc+2x8nAAMHZvJMWzgVLwUmrNTmwFQBgRopJqgFP4pMynzzCjwgG4f7e8f7ujCLFB2DrYXs+euvfG9i8vnzl3F/8IsUlZPWNpqVVcnJpcHri2pHi2gwSsUXisU5m/89AeF3uuFwnXq7t3r2sGI9osunkqlTp8mQrP3K7BuB5XwfCjti3Tqh0ruhc8tMQoVIPKMSWZjLBA1Hw9ONXmWv8anTB2XnXDD2V8yy8v8tAZ+PC/8CzwmwlMwlE/BgiBs+LyhlZfhuVgLE5/Wz/yHvfP9aes64/jdZseeJxjQeVvB8dgSy8liL2RsSZAGGBF+XW2aM894tGWZSmKwtjDAWYeS1p3BAy2hImmyUG2jSyVkvCaymmQk6rCEyKQikUgB0ReVor3vi4q9YFXbvdrnOedi0irJ/gE+ss+551rB8b33e5/nnHvu/RpCc3Nz0743Rv8++nHfHqTxeiwUChAeiLY9Zjrd2An9x40zP/tN/1T/MozwGhkfJ25nMq25XM7vtMt0XY0SiG0Lp13nV45EfPL9tTefRh+wc+eevQd+Ie4YQb7NANOzi9MVArQE0i0CCRiPY1sgSh8Rj5AOy7IhkF8FawINXbe6ulpaZurpi+xgPOTNk69M//BGIRVHIeqKFDB2UsTtSCIduxtvqtXVEj/9+gw7eHz2tRWYzedX7txhIZ/HyHojn5+YmDgnZOez2Sxeu9Cx0GF0oBbwIJhHMqp4Q9HU1N7W1GZBHOrr6/sp0//ocH/4pS981lFD0HpDFMwnpLElCEo+lrduq/v4Pl90q2HyrMyE+lDGrGR6oRri4vmG0N7e3rZPijbrqRVPvc6LB1/yX1scXVxcHO3p0Ru1sxERNKY5HmNBfDSqg9GGo7ip3oX+/mUSWJQwMn0KUplWHkd29aBsR5szmZB7OqS/5/OCugXBpwViFeCscIihbUUifiuKi8UOkcfTe57ZX03PQ/nHxBYNgVOhEBak7j6LQIwnsi0QM2KKPhAIFSO/W4EEup4/MXzyV8iDPOtw7TvTZ1DIiXiyVHnfSb6bUCmXVog6ixFcKmXqtQOQDJY7hQLZgZQ3bhRgBCiJMiv5sZfH8hvnYOPYsRez8/949q2L2ey8Qp65YbG5RKXosFhQDMrr7FmPwjRNrS3jYZ5q/wz72tooKR4BB7lh7GtrPmRomuhGNaFNyRKlMDUeiEQ4uYT5VkUETJNGurGRgBye6gx3wtRUXfeF5efOD1179dVbDT2hWCwWQiN4iLU03L730cAA4UGsJvySqorTttOGNMDrJZ1yld2/Xwb09xizAtvmvGqFDWSdwyGGOfTO/3tAppzuZI8hj2BtfXWw+rdGtCZgAHOKUEjYEki3FOx+4wlsp1gCexnIfTcxQPXXA5e6UqnyxDDuK7B3b/WRDIf28ycSpUVvLxSi8ysJHxWscEAVqJwYJzAyZpblg0pSZZkkJBB8RDp4LBJjYH19feUObGxQUClo68Y5RKQMLaTSBWSz5xASQSj71jz0SkiamDgtseh788bDXERAC7wfC1dMLSSMLrxk1HVPnTY0vXV1E6frSAgHf08vWfiTQLpIU9N/NxyWOqwq8iPsui+cf+48S0NDmaFr1/6ZSjFKjvdkbexyX2wUqUk4ORoIri2Vubi8xwmlkrdCj+AShFd9djaXq4ytyGb0KoHAp/UBrFICGR6enOG+KLEyYD72gf2HQjW19cGY9Mt70h7pb3pAy0ImUVhLxiPZJmIWBYJCiuhTIysaj14KhAINr2BXWJ6Qbt9eMUu5npqemxs5kbQ8Ii2BYO+JBgB5JCRsCBJORArs91KQlAzpVLruW7jsymK6vDxBEsEjf7FZKIwXnsBskeP5F17Iw9jEBNnaHZSxsfEyHDumSnTz4h/+As9ilf8T+OPFlxTzSlC9oCPQ4KAOQSwM9pLmPTgtPHjA3+OP37x58913b47lJUeUHhUG+YDX8ThQURcKOboI'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= '27fTqSI5P7zPTKwofnPg7U1ftt8yWSzdhbmiXSweghBwgTHoBMkrhQCErul0dMz2UzAq1m2xtBx4+68bdKDLGuvrMmiotOqvrL5yZVwnlFux4bAXiktvGJ+K3uckv1kMrJ3so8+JSWydw/j0uNQZQzDCT5ZwNjsx3w73aWxWMaXIeXgnXoRaF+EA5B3pqOLOYKIvthY/+6b/cSlP5q6CSrHZQS1MjgOQN14wPvK01DXHwqFrtQumHlTfOr2QZKHpWkhORPNEpM3NRbLM46E7uUbfwWNwZyI8TI2u4RCay3w/qpg8Ebo1gVOch5xGWhlKk6vzVd3bC3BeajU3V1WX0opR9/axz//yQIvFZCpTMBQF2QosBe2qcNSUlRUCjVdeeaWwsHC7BpcASA4hGqPRYvny+B/+weebdLjvtq/WWkvZgTcuQvAF5wSADCFSDesY9fAb5aPnEpn8cLCIJxTisYatXtjISH8Yhs+KvxSiv3HpMo13e1cOebuEA+4MDPCB5sxh5Bte92C6dhiF6P/N3tmFtpFdcdxJQBAw9GFNsMCC2cmLxM73LHhK0cdiiXbz4gzRh2fiTiZylupBkmGoLJSGNU7WLm4sWxbGSqx0y+LAgtFSxFI7UFI2kAZSs37ox1tN2YfCQh76UL/tS//nzjiW232vH/xL5t47VyNbV57/nHvuGenEIJBIVE5tIAiC2RUlqkBxHiM8Y0woax/f7zlGmBQS320jjcB0C6ld1x/NEo9QUclqbHcCcCYBNKj8nD3aaqH9p1/+4nefP5plD6yvo6PVauEHguBH4SA8xtp3WpkYNBEuaxxX4lfhWIQPZFVVjejkRQjk+s9+//7ViSzPj57owm8ExgPlCA+GsY0OZ7M8MyGrV/5bIKHhLD809NMfvv8hLEgE5sSgsMgk5BiNRmO2XYYgR1J55LxlQ8VLBXjt04PQtzVO1zqdTg3tFu1N1Vqkf1ISaCE17uf4iNb9APTS1zuCIiuKUxAT2c1P2IIfpZIigcTGBQgEAoA4wFkTyDnCC8VptqoJxHThIx/EnWSj3WjsIz9N3qda7VCBqlPN5xsN+oIRHNGo0l613W4RvTzY7zXyyX1MUrxGo10sej1Eha0kfh6OR9VAIqhGAI5mtSMh1m1oh5wsxfhV6CN+qMZish2GJSg9GPvVh1c/hQAw+Rp0QhD0iJD7MToygjhJlgeSlOVxsvPoiZCbzszIiUBG+aw0MXZ9YaYUuhiRDLusxis4QUPhWDYrGdrOQSiUVZIYD42sl2wQSVRIyIMeqizL2gXoRT9gg8pjsB97vX0aIr1lyf2e5zWbPcJr4ggLz7feksisIcEP6Kef4tfHwqSQqJhIOGIgkDP3HaPnoRBBEFKpjU7Vwh8MhGOGWxDFFKBCQaEIlHpHcHCkAnJpIoeGgsccx8Ge4ygKHZ3LsQI10mliei6KHKfrFaDnAHs6A4crip5zBNGOhFU9XeFk2YhFwnK8UtFsQ5PDsBAj777z4w+GVlezw6H/ctGvQAUwIMPD8HElSepKEvx5vPooH4nAEWHLvVDIwBwLAtkcH69LPARic7Kh4fVpPOY3mqa5enwnFim9wIX8e1FyeiUe1zEQXS8ob8kFla74g06hAiJIAVHXc4Sucy7HqKtvMQz6VADpoxsbouRfx/nAboydgU+hn/Peeyf6ACkhWW1Wyl0SCCJzMVyK0Qb2wcGBLePcNYwdmWqgMWSGKmsBqkxo6FHrdRV3K/4FH1Pckdnxh4c7O5rGMWQ1aMkyp3EiInixsuvgEooeO2zH05QlXOYgEBiAyxT1WIWPEbr4PwKBFeH5aMxQS6XS8+clSZINu8sD5qhHaFVrcCELAsnykXAEPvrkgSi69AFXkR/hNV3Hqd+PG3wJio0fxgk3zg2wE4BRYgOuWlddjkavampJBTLpDLVGFUFaMDSGQZRt24Z94/kwQAX1RiJU85KLv0EKQcIbwJ9gjY8P/b85V8hP/HoiEIjVbqdxAYcm'
    $BG &= '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'
    $BG &= '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'
    $BG &= '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'
    $BG &= 'U4/P69Vq0762j777ws317Ykff3rXhfSd2puXkURKIrOOw4Egl8/mKWYCqdwMMtlv9hQCk1nUPyZ9glahuDhbOPL6ASsHCwJAJAEPAIL8OqeFHWlhgGCxEhosYSFAVGqX62FAsIJELbMnk0W3Qy3nZpPFXC6WXh453429i8ZDS4F0ZLzHnvOhDBHv3cBPQSKPA2814Z1EOy3dp7Zv3rz/vU+BIFjVz/2XlndW4iWx4640wXPHgVwUgFGJeEltE87tqmLeeq2Jk4DgWVPmJVn5L8UomGJ0VE5ZSQAEbFW6PPJzmOadXfNOJy9gpgvsOPNeLYc9NX94/+Yn62s/eO+uEo4AFwSDuPJ4EnCan3daDQkEuVChmImFULp49eV21j0Tytl1jQqtgKBXR0LgtBoN29ud8KgKhGgpHYLFwF7TSRDix5Jgsh5Id7AdG2oNCAdAZDnE0EQ9ACnkQiH4IYe6O23j2MGqmMmEe9ptvoIdBWm8JLztKTzmvCqV/qW2nuvbn6xvnvrpX1GFgmWyXVNdrCzHUftRQu+/ZmwWHhyK4rk+EupNRIjaA2wMTWGCDrLdpLoJkWhgADgYA1DlKOBqb+0FCDgL0RkBcwLGIAfXOUbSHCadra14NUHqOPP7yH3W/Whie/3exmu/2o/rkzPlJeQILjwBshrsPo/xIKOi/9hRLDocj6SKBMifAYgSgMTchn3aNzQaeCTsmpfowKIQAMJVXBHu8kkipIW6WnJAWMUWVK3eYoCo9MaeUCwpcvIWW2hsdCwST820W95GNe+xXDabG2y3jRcoTVcmwyGZRQDS+uzTSEfqAMj6+tqhbtrQSt/cOt/ltFY/LFbxwzr0n5G30oeODCJDjFfDuIwRzhNv55jQAQ5ocZDG8/RJBO0qQOqAEA1dLNyL1gESrEwVGIaE1dbe1lUr8cPOEBI8j0+9BJUPiY6hIfAQRYschLO3t5f66JCslNU2vv3BqxubayPH2qMUX7rIUOPBBwPkmWd6u6bEBCKr5vdjqaQPC4gGOzvPh1Ph0f4zIQDCQsUJMa+lENQe4kLO+FAoCRAihADhuDfQqewyQRuFwH6ACSWpoSaGpeH8CJp5eK2iZdAXGh0NAxDd6bf7z/SAm1jOoMMiXLbPZDUxJMUv5nt5VGXZDm9tb26Ml/Oowd1H04DCCCzwrlcZG6vUGKN59h/kfoWSJhBRUEbq7zElVmCHydlKJpkg+jd75/cauXXF8TsrEIQVzIMvqgY8aCS/yLOaH1oX5JDJjMxsUOqXWKxq4dnYHiKX3obU7gbWs2tMgmPGsOtkwOlULk5QMYVubRaDick+mdRFTzXtg/vcpz7uP9FzrzKDndpxbcxC7fk8aK7lGQsGfXXO8f2ee9H/Nz2oPCYXPof+DUdHP87U1MuXh3Pz82sVvWqb6BTA1jpamSqCQOablXbb0TO//nYGBPJOZdzPaJjntSAsSRy7vzmALVQSGxZjgahxbxQA0aNF15jAIg/QA9fVR+wz4XBaze+TSEwPFisVZ2JuZWU9tz300inDbMzCpE4bptDptNu+/+jv//7LXGUkbNTP/Yb8sV+urjbXqQtr9Oa1CPYUstRcXVzcqEwNoXMoO0swT/jm5Njoj6XWllesbCysO0W9rWfenpibf/TtvfKSb9byKogBv/HW934Tkd3x/DHDCeRY6e9pSXDA+D0eY5GLl4w7VoXQbkIewg/GcLqluoHv6+3Z+bnxzD8yZWhHpDYrPVOsjKEzoEGzOddsju31ofOwoJly9en03Owsc/Cim0UPS3eai18/2CgP3UXn0T+w9d13Dx9uDfSjs7EDrzy79kTPWXqxcFdfbx5Ck7ZeDQoNtm1nxymShUhyHBAIKITB1IIxz2M4MD88d3ImXcpmRajy4SxYeb+K1A/RuzbtQHcKWsHSvZz+bGvJu+s54+gswJr+5sOHk5Pof2B7d432l3yMbiI94EG/Dm1QG+XMMLoSZLJPS3U9lyvmajWrMlYZ+teQ'
    $BG &= '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'
    $BG &= 'u7bNxHEcvrbQqWMJBFJQ33eJyUmWm0FosHRBNSGddDTWpcYSoSqNl8pQcEKyCaNmahuFQwoZAoFCCBRDCWTr4FC6dAv9V7r3d3Knlq6h2L8HbMgf8OFOBOtLbgT9RCovP5AbgdDSFxj9WP+8I2Lf9rlpSk4anQ48i/ypunEZO8ISOw0Rh2Fq1ju1B+/+612vkOmE0OnqibG+2FN92CGnJpWSUmr9uA1+6+Pu/DwpBGNM36xr8fmaDYXU4PgphmRaITRcPenVGmPoww44ZQwScQOfxKLowf8S1XtI5+buLS4axnqvQYhUfTS1R3W2sLYWcq02bxQemV4InS6dGBDIlu1zSZluth03yI+zwE1jQNVzCaXSceAPzh3K9OWmpmki/v88jDc7xvUqmW4Ib1lFwdLQd52oDSKHu0meZbAzYh+Dfj/Lk4PBIEkD6MPUIRAoRLD4SUpFMQPnB0KWp86IycB6JGEP9LCf7e1tj66uri4uLmD9Zr97kATfuBOpQXJd07RNYTImLItMP4Q8jzGzXQWiSnkLE7lwgoyqQL5DIGf7MLwM47MtGEkD2kS9IDMBIQagkKhtUsdpXX6FnXIIZAL2PM66G4fQx/sWDIaCpqbpOgRCZgRCtCoERCqQy8Mkz4+PRqPtfn7weqPbVYFwmEOEK1ZFF9YsXa8QonTssQhuWVHUaj1zgySBQo76WZl8hEIGg91d7khq6k1NV6yVIZkpCHmMRuSVOkM4cYPAD+28zLIsTwZlGbhcSjoW6kUlszkWi5BH4WvZlFISruZj/aAssy27DHarPNhYAOwDIVWKm0IkZba35XMgx2NPiF+bBAihOE1TFxIJXRk5BHjMZN6QAIQQV+uyaQqfWJIJSilREEIxAWq7bGGBIIT+8qNdQP4d6Cfm7QYA1X39iAAAAABJRU5ErkJggg=='
    Local $bString = _WinAPI_Base64Decode($BG)
    If @error Then Return SetError(1, 0, 0)
    $bString = Binary($bString)
    If $bSaveBinary Then
        Local Const $hFile = FileOpen($sSavePath & "\Bg2.png", 18)
        If @error Then Return SetError(2, 0, $bString)
        FileWrite($hFile, $bString)
        FileClose($hFile)
    EndIf
    Return $bString
EndFunc   ;==>_BG

Func _WinAPI_Base64Decode($sB64String)
    Local $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "ptr", 0, "dword*", 0, "ptr", 0, "ptr", 0)
    If @error Or Not $aCrypt[0] Then Return SetError(1, 0, "")
    Local $bBuffer = DllStructCreate("byte[" & $aCrypt[5] & "]")
    $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "struct*", $bBuffer, "dword*", $aCrypt[5], "ptr", 0, "ptr", 0)
    If @error Or Not $aCrypt[0] Then Return SetError(2, 0, "")
    Return DllStructGetData($bBuffer, 1)
EndFunc   ;==>_WinAPI_Base64Decode

 

The rest is homework for you. ;)

Edited by UEZ

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

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

Create an account

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

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By ripdad
      I ran across a topic while researching the BASS UDF...
      https://www.autoitscript.com/forum/topic/155845-carpenter-needs-help-performing-serious-surgery-on-audiometer2/ and then remembered another topic...
      https://www.autoitscript.com/forum/topic/121624-sound-level-sampling/ which got me to thinking as to how I could get the first topic to go LIVE without the need of loading an mp3.
      This will accept any LIVE AUDIO INPUT.
      Be sure to read this post if you have trouble with it...
      https://www.autoitscript.com/forum/topic/121624-sound-level-sampling/?do=findComment&comment=1400178 Also, read the comments I made in the script, so you will know how it will react to LIVE INPUT streams.

      Live FFT Visual Spectrum.zip
       

      LIVE Multiband FFT Visual Spectrum.au3
       
    • By UEZ
      Nothing special - just another analogue clock.  -> Read https://en.wikipedia.org/wiki/Swiss_railway_clock for more information.

       
      Requires Windows7+ OS!
       
       
      Widget style GUI:
      ;The Hilfiker / MobaTime Swiss Railway Clock ;Coded by UEZ build 2019-07-07 ;Thanks to Eukalyptus for the _CreateBrushedAluminum() function! #pragma Compile(Icon, "GDI+ Swiss Railway Clock.ico") #AutoIt3Wrapper_Run_Au3Stripper=y #Au3Stripper_Parameters=/so /pe /rm #AutoIt3Wrapper_Run_After=del /f /q "%scriptdir%\%scriptfile%_stripped.au3" #AutoIt3Wrapper_UseX64=n Break(0) #include <GDIPlus.au3> #include <GuiConstantsEx.au3> #include <WindowsConstants.au3> #include <WinAPISysWin.au3> ProcessSetPriority(@AutoItPID, $PROCESS_LOW) _GDIPlus_Startup() Global $hGUI, $iFPS = 0, $iShowFPS = 0, $bExit Global $iW, $iH, $iX, $iY, $sTitle = "GDI+ Swiss Railway Clock v1.16" $iW = IniRead(@ScriptDir & "\GDI+ Swiss Railway Clock.ini", "Settings", "GUI_Size", 200) $iW = $iW < 100 ? 100 : $iW > 800 ? 800 : $iW $iH = $iW $iX = IniRead(@ScriptDir & "\GDI+ Swiss Railway Clock.ini", "Settings", "GUI_PosX", -1) $iY = IniRead(@ScriptDir & "\GDI+ Swiss Railway Clock.ini", "Settings", "GUI_PosY", -1) Global Const $fRad = ACos(-1) / 180, $fDeg = 180 / ACos(-1), $iTimer = 30, $ULW_ALPHA = 2, $SC_DRAGMOVE = 0xF012, $fDeltaShadow = 20 Global $hBitmap, $hHBitmap, $hCanvas, $hBitmap_Clock, $hBrush_Shadow, $hBrush_Update, $hPen_Update, $fDiameter = $iW, $fShadowAngle, $fMin_next, _ $fRadius = $fDiameter / 2, $fSec, $fMin, $fHr, $fAmplitude = 3, $fSize, $hOld Global $tSize = DllStructCreate($tagSIZE), $tSource = DllStructCreate($tagPOINT), $tBlend = DllStructCreate($tagBLENDFUNCTION) $tSize.X = $iW $tSize.Y = $iH $tBlend.Alpha = 255 $tBlend.Format = 1 Global Const $hScrDC = _WinAPI_GetDC($hGUI), $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC) AutoItSetOption("GUIOnEventMode", 1) GDIPlus_SwissRailwayClockWidget() AutoItSetOption("GUIOnEventMode", 0) _GDIPlus_Shutdown() Func GDIPlus_SwissRailwayClockWidget() $bExit = False $hGUI = GUICreate($sTitle, $iW, $iH, $iX, $iY, $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_LAYERED)) GUISetState(@SW_SHOW, $hGUI) ;create canvas elements $hBitmap = _GDIPlus_BitmapCreateFromScan0($iW + $fDeltaShadow, $iH + $fDeltaShadow) $hCanvas = _GDIPlus_ImageGetGraphicsContext($hBitmap) Local Const $iAlpha = 0x0D / $iW * 200 $hBrush_Shadow = _GDIPlus_BrushCreateSolid(BitShift(0x0D + $iAlpha, -24) + 0x202020) $hPen_Update = _GDIPlus_PenCreate(0xFFA02020) $hBrush_Update = _GDIPlus_BrushCreateSolid(0) _GDIPlus_GraphicsSetSmoothingMode($hCanvas, $GDIP_SMOOTHINGMODE_HIGHQUALITY) _GDIPlus_GraphicsSetPixelOffsetMode($hCanvas, $GDIP_PIXELOFFSETMODE_HIGHQUALITY) $hBitmap_Clock = GenerateClockBg($fDiameter) GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit_About") $fMin_next = @MIN GUIRegisterMsg($WM_LBUTTONDOWN, "_WM_LBUTTONDOWN") GUIRegisterMsg($WM_TIMER, "Draw") ;$WM_TIMER = 0x0113 Local $iID = DllCall("User32.dll", "uint_ptr", "SetTimer", "hwnd", $hGUI, "uint_ptr", 1, "uint", $iTimer, "ptr", 0)[0] Do If $bExit Then ExitLoop Until Not Sleep(100) ;release resources GUIRegisterMsg($WM_TIMER, "") DllCall("user32.dll", "bool", "KillTimer", "hwnd", $hGUI, "uint_ptr", $iID) GUIRegisterMsg($WM_LBUTTONDOWN, "") _GDIPlus_PenDispose($hPen_Update) _GDIPlus_BrushDispose($hBrush_Shadow) _GDIPlus_BrushDispose($hBrush_Update) _GDIPlus_GraphicsDispose($hCanvas) _GDIPlus_ImageDispose($hCanvas) _WinAPI_ReleaseDC(0, $hScrDC) _WinAPI_DeleteDC($hMemDC) IniWrite(@ScriptDir & "\GDI+ Swiss Railway Clock.ini", "Settings", "GUI_Size", WinGetPos($hGUI)[2]) IniWrite(@ScriptDir & "\GDI+ Swiss Railway Clock.ini", "Settings", "GUI_PosX", WinGetPos($hGUI)[0]) IniWrite(@ScriptDir & "\GDI+ Swiss Railway Clock.ini", "Settings", "GUI_PosY", WinGetPos($hGUI)[1]) GUIDelete($hGUI) EndFunc ;==>GDIPlus_SwissRailwayClockWidget Func Draw($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg, $wParam, $lParam _GDIPlus_GraphicsClear($hCanvas, 0x00000000) _GDIPlus_GraphicsDrawImageRect($hCanvas, $hBitmap_Clock, 0, 0, $fDiameter + $fDeltaShadow, $fDiameter + $fDeltaShadow) UpdateClock($hCanvas, $fDiameter) $hHBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap) $hOld = _WinAPI_SelectObject($hMemDC, $hHBitmap) _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, DllStructGetPtr($tSize), $hMemDC, DllStructGetPtr($tSource), 0, DllStructGetPtr($tBlend), $ULW_ALPHA) _WinAPI_SelectObject($hMemDC, $hOld) _WinAPI_DeleteObject($hHBitmap) EndFunc ;==>Draw Func _WM_LBUTTONDOWN($hWnd, $iMsg, $wParam, $lParam) Switch $hWnd Case $hGUI _SendMessage($hWnd, $WM_SYSCOMMAND, $SC_DRAGMOVE, 0) EndSwitch EndFunc ;==>_WM_LBUTTONDOWN Func _Exit_About() $bExit = True EndFunc ;==>_Exit_About Func UpdateClock($hGfx, $fDiameter) Static $bBounce = 0, $f = 0 Local $m1 = $fDiameter * 0.015 ;hour $fHr = 30 * (@HOUR + @MIN / 60) _GDIPlus_GraphicsTranslateTransform($hGfx, $fRadius, $fRadius) _GDIPlus_GraphicsRotateTransform($hGfx, $fHr) _GDIPlus_GraphicsTranslateTransform($hGfx, -$fRadius, -$fRadius) Local $iWidth1 = $fDiameter * 0.0375, _ $iHeight1 = $fDiameter / 2.5, _ $iWidth12 = $iWidth1 / 2, _ $fPosY = $fDiameter * 0.2, $iWidth2, $iWidth22, $fPosY2 _GDIPlus_BrushSetSolidColor($hBrush_Update, 0xFF101010) DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hGfx, "handle", $hBrush_Shadow, _ "float", $fRadius - $iWidth12 + Cos(($fShadowAngle - $fHr) * $fRad) * $m1, _ "float", $fPosY + Sin(($fShadowAngle - $fHr) * $fRad) * $m1, _ "float", $iWidth1, "float", $iHeight1) ;~ DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hGfx, "handle", $hBrush_Update, _ ;~ "float", $fRadius - $iWidth12, _ ;~ "float", $fPosY, _ ;~ "float", $iWidth1, "float", $iHeight1) Local $tPoints = DllStructCreate("float p[8]"), $factor = $iW / 160 ; 1----2 ; | | ; 4----3 ;1 $tPoints.p(1) = $fRadius - $iWidth12 $tPoints.p(2) = $fPosY ;2 $tPoints.p(3) = $tPoints.p(1) + $iWidth1 $tPoints.p(4) = $fPosY ;3 $tPoints.p(5) = $tPoints.p(3) + $factor $tPoints.p(6) = $fPosY + $iHeight1 ;4 $tPoints.p(7) = $tPoints.p(1) - $factor $tPoints.p(8) = $tPoints.p(6) DllCall($__g_hGDIPDll, "int", "GdipFillPolygon", "handle", $hGfx, "handle", $hBrush_Update, _ "struct*", $tPoints, "int", 4, "int", "FillModeAlternate") _GDIPlus_GraphicsResetTransform($hGfx) ;min If $fMin_next <> @MIN Then $bBounce = 1 Switch $bBounce Case 1 $fMin = (6 * Mod(($fMin_next + 1), 60)) + Sin($f * 1.9) * $fAmplitude If $fAmplitude = 0 Then $fMin_next = @MIN $f = 0 $fAmplitude = 3 $bBounce = 0 Else $fAmplitude -= 0.5 $fAmplitude = $fAmplitude <= 0 ? 0 : $fAmplitude $f += 1 EndIf Case Else $fMin = (6 * @MIN) EndSwitch _GDIPlus_GraphicsTranslateTransform($hGfx, $fRadius, $fRadius) _GDIPlus_GraphicsRotateTransform($hGfx, $fMin) _GDIPlus_GraphicsTranslateTransform($hGfx, -$fRadius, -$fRadius) $iWidth1 = $fDiameter * 0.03 $iHeight1 = $fRadius $iWidth12 = $iWidth1 / 2 $fPosY = $fDiameter * 0.1 DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hGfx, "handle", $hBrush_Shadow, _ "float", $fRadius - $iWidth12 + Cos(($fShadowAngle - $fMin) * $fRad) * $m1, _ "float", $fPosY + Sin(($fShadowAngle - $fMin) * $fRad) * $m1, _ "float", $iWidth1, "float", $iHeight1) ;~ DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hGfx, "handle", $hBrush_Update, _ ;~ "float", $fRadius - $iWidth12, _ ;~ "float", $fPosY, _ ;~ "float", $iWidth1, "float", $iHeight1) ;1 $tPoints.p(1) = $fRadius - $iWidth12 $tPoints.p(2) = $fPosY ;2 $tPoints.p(3) = $tPoints.p(1) + $iWidth1 $tPoints.p(4) = $fPosY ;3 $tPoints.p(5) = $tPoints.p(3) + $factor $tPoints.p(6) = $fPosY + $iHeight1 ;4 $tPoints.p(7) = $tPoints.p(1) - $factor $tPoints.p(8) = $tPoints.p(6) DllCall($__g_hGDIPDll, "int", "GdipFillPolygon", "handle", $hGfx, "handle", $hBrush_Update, _ "struct*", $tPoints, "int", 4, "int", "FillModeAlternate") _GDIPlus_GraphicsResetTransform($hGfx) ;sec $fSec = 6 * (@SEC * 1.02564 + @MSEC / 1000) If $fSec >= 360 Then $fSec = 0 _GDIPlus_GraphicsTranslateTransform($hGfx, $fRadius, $fRadius) _GDIPlus_GraphicsRotateTransform($hGfx, $fSec) _GDIPlus_GraphicsTranslateTransform($hGfx, -$fRadius, -$fRadius) $fPosY = $fDiameter * 0.27 $fPosY2 = $fDiameter * 0.19 $iWidth1 = $fDiameter * 0.0095 $iHeight1 = $fRadius * 1.3 - $fPosY $iWidth12 = $iWidth1 / 2 $iWidth2 = $fDiameter * 0.083333 $iWidth22 = $iWidth2 / 2 ;shadow seconds DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hGfx, "handle", $hBrush_Shadow, _ "float", $fRadius + Cos(($fShadowAngle - $fSec) * $fRad) * $m1, _ "float", $fPosY + Sin(($fShadowAngle - $fSec) * $fRad) * $m1, _ "float", $iWidth1 + $fDiameter * 0.006667, "float", $iHeight1 + $fDiameter * 0.006667) DllCall($__g_hGDIPDll, "int", "GdipFillEllipse", "handle", $hGfx, "handle", $hBrush_Shadow, _ "float", $fRadius - $iWidth22 + Cos(($fShadowAngle - $fSec) * $fRad) * $m1, _ "float", $fPosY2 + Sin(($fShadowAngle - $fSec) * $fRad) * $m1, _ "float", $iWidth2, "float", $iWidth2) ;seconds _GDIPlus_BrushSetSolidColor($hBrush_Update, 0xFFC01010) DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hGfx, "handle", $hBrush_Update, _ "float", $fRadius - $iWidth12, _ "float", $fPosY, _ "float", $iWidth1, "float", $iHeight1) DllCall($__g_hGDIPDll, "int", "GdipFillEllipse", "handle", $hGfx, "handle", $hBrush_Update, _ "float", $fRadius - $iWidth22, _ "float", $fPosY2, _ "float", $iWidth2, "float", $iWidth2) _GDIPlus_GraphicsResetTransform($hGfx) ;button in the center DllCall($__g_hGDIPDll, "int", "GdipFillEllipse", "handle", $hGfx, "handle", $hBrush_Update, _ "float", $fRadius - $iWidth1, _ "float", $fRadius - $iWidth1, _ "float", 2 * $iWidth1, "float", 2 * $iWidth1) DllCall($__g_hGDIPDll, "int", "GdipDrawEllipse", "handle", $hGfx, "handle", $hPen_Update, _ "float", $fRadius - $iWidth1, _ "float", $fRadius - $iWidth1, _ "float", 2 * $iWidth1, "float", 2 * $iWidth1) EndFunc ;==>UpdateClock Func GenerateClockBg($fDiameter, $iBGColor = 0xF8FFFFFF) Local Const $hBitmap = _GDIPlus_BitmapCreateFromScan0($fDiameter + $fDeltaShadow, $fDiameter + $fDeltaShadow), $hGfx = _GDIPlus_ImageGetGraphicsContext($hBitmap), _ $hBrush = _GDIPlus_BrushCreateSolid($iBGColor), $fBorderSize = $fDiameter * 0.03333, _ $hEffect = _GDIPlus_EffectCreateBlur($fDiameter / 50, 1), $hPen = _GDIPlus_PenCreate(0xA0000000, $fBorderSize) _GDIPlus_GraphicsSetSmoothingMode($hGfx, 4) _GDIPlus_GraphicsSetPixelOffsetMode($hGfx, 4) _GDIPlus_GraphicsSetTextRenderingHint($hGfx, 4) Local Const $fSize = $fDiameter * 0.942 - $fBorderSize / 2 Local Const $hLBrush = _GDIPlus_LineBrushCreate($fBorderSize, $fBorderSize, $fSize, $fSize, 0xFCFFFFFF, 0xF8F0F0F0, 3) _GDIPlus_LineBrushSetSigmaBlend($hLBrush, 0.33333) _GDIPlus_LineBrushSetGammaCorrection($hLBrush) Local Const $hMatrix = _GDIPlus_MatrixCreate() _GDIPlus_MatrixTranslate($hMatrix, -$fSize, -$fSize, True) _GDIPlus_MatrixRotate($hMatrix, 90, True) _GDIPlus_MatrixTranslate($hMatrix, $fSize, $fSize, True) _GDIPlus_LineBrushMultiplyTransform($hLBrush, $hMatrix, True) _GDIPlus_MatrixDispose($hMatrix) _GDIPlus_GraphicsFillEllipse($hGfx, $fBorderSize, $fBorderSize, $fSize, $fSize, $hLBrush) ;~ Local Const $hPath = _GDIPlus_PathCreate() ;~ _GDIPlus_PathAddEllipse($hPath, $fBorderSize, $fBorderSize, $fSize, $fSize) ;~ Local $hLBrush = _GDIPlus_PathBrushCreateFromPath($hPath) ;~ _GDIPlus_PathBrushSetCenterColor($hLBrush, 0xF8F0F0FF) ;~ _GDIPlus_PathBrushSetCenterPoint($hLBrush, $fSize * 0.70, $fSize * 0.70) ;~ _GDIPlus_PathBrushSetSurroundColor($hLBrush, 0xFBFFFFFF) ;~ _GDIPlus_PathBrushSetGammaCorrection($hLBrush, True) ;~ _GDIPlus_GraphicsFillPath($hGfx, $hPath, $hLBrush) ;~ _GDIPlus_PathDispose($hPath) Local $fShadow_vx = $fDiameter * 0.0095, $fShadow_vy = $fDiameter * 0.01 $fShadowAngle = ATan($fShadow_vy / $fShadow_vx) * $fDeg If $fShadow_vx < 0 And $fShadow_vy >= 0 Then $fShadowAngle += 180 If $fShadow_vx < 0 And $fShadow_vy < 0 Then $fShadowAngle -= 180 _GDIPlus_GraphicsDrawEllipse($hGfx, $fBorderSize + $fShadow_vx, $fBorderSize + $fShadow_vy, $fSize, $fSize, $hPen) _GDIPlus_BitmapApplyEffect($hBitmap, $hEffect) _GDIPlus_BrushSetSolidColor($hBrush) _GDIPlus_PenSetColor($hPen, 0xF0000000) Local Const $hBitmap_Texture = _CreateBrushedAluminum($fDiameter, $fDiameter, $fShadowAngle) Local Const $hTexture = _GDIPlus_TextureCreate($hBitmap_Texture) DllCall($__g_hGDIPDll, "int", "GdipSetPenBrushFill", "ptr", $hPen, "ptr", $hTexture) _GDIPlus_GraphicsDrawEllipse($hGfx, $fBorderSize, $fBorderSize, $fSize, $fSize, $hPen) _GDIPlus_GraphicsTranslateTransform($hGfx, $fRadius, $fRadius) _GDIPlus_GraphicsRotateTransform($hGfx, -6) _GDIPlus_GraphicsTranslateTransform($hGfx, -$fRadius, -$fRadius) Local $iWidth1 = $fDiameter * 0.026667, $iHeight1 = $fDiameter / 10, $iWidth12 = $iWidth1 / 2, $fPosY = $fDiameter * 0.083333, _ $iWidth2 = $fDiameter * 0.013333, $iHeight2 = $fDiameter * 0.0416667, $iWidth22 = $iWidth2 / 2 For $i = 0 To 59 _GDIPlus_GraphicsTranslateTransform($hGfx, $fRadius, $fRadius) _GDIPlus_GraphicsRotateTransform($hGfx, 6) _GDIPlus_GraphicsTranslateTransform($hGfx, -$fRadius, -$fRadius) Switch Mod($i, 5) Case 0 _GDIPlus_GraphicsFillRect($hGfx, $fRadius - $iWidth12, $fPosY, $iWidth1, $iHeight1, $hBrush) Case Else _GDIPlus_GraphicsFillRect($hGfx, $fRadius - $iWidth22, $fPosY, $iWidth2, $iHeight2, $hBrush) EndSwitch Next _GDIPlus_GraphicsResetTransform($hGfx) Local Const $hBitmap_Logo = _GDIPlus_BitmapCreateFromMemory(_Au3_Icon()) Local Const $hBitmap_Logo_Scaled = _GDIPlus_ImageResize($hBitmap_Logo, $fDiameter * 0.125, $fDiameter * 0.125) Local $aDim = _GDIPlus_ImageGetDimension($hBitmap_Logo_Scaled) _GDIPlus_GraphicsDrawImageRect($hGfx, $hBitmap_Logo_Scaled, $fRadius - $aDim[0] / 2, $fRadius / 2, $aDim[0], $aDim[1]) _GDIPlus_ImageDispose($hBitmap_Logo) _GDIPlus_ImageDispose($hBitmap_Logo_Scaled) Local Const $hFamily = _GDIPlus_FontFamilyCreate("Segoe Script"), $hFont = _GDIPlus_FontCreate($hFamily, $fDiameter * 0.025), $hFormat = _GDIPlus_StringFormatCreate() _GDIPlus_StringFormatSetAlign($hFormat, 1) _GDIPlus_StringFormatSetLineAlign($hFormat, 1) _GDIPlus_BrushSetSolidColor($hBrush, 0xE0000000) _GDIPlus_GraphicsDrawStringEx($hGfx, "Clock coded by" & @CRLF & "UEZ", $hFont, _GDIPlus_RectFCreate($fRadius - $fRadius * 0.2, $fRadius + $fRadius * 0.2, $fRadius * 0.4, $fRadius * 0.4), $hFormat, $hBrush) _GDIPlus_ImageDispose($hBitmap_Texture) _GDIPlus_BrushDispose($hTexture) _GDIPlus_FontDispose($hFont) _GDIPlus_FontFamilyDispose($hFamily) _GDIPlus_StringFormatDispose($hFormat) _GDIPlus_EffectDispose($hEffect) _GDIPlus_PenDispose($hPen) _GDIPlus_BrushDispose($hBrush) _GDIPlus_BrushDispose($hLBrush) _GDIPlus_GraphicsDispose($hGfx) Return $hBitmap EndFunc ;==>GenerateClockBg Func _CreateBrushedAluminum($iW, $iH, $fLightAngle = 40, $iBlurDist = 12, $fBlurTrans = 0.6666, $fRed = 0.8, $fGreen = 0.9, $fBlue = 1, $iLightColor = 0xF0FFFFFF, $fLightSigma = 0.5, $fLightScale = 0.83) ;coded by Eukalyptus! $iBlurDist = Ceiling($iBlurDist) $iBlurDist += 1 - Mod($iBlurDist, 2) Local $iOverSize = 0 For $i = 1 To $iBlurDist Step 2 $iOverSize += $i + $i + 1 Next Local $iWO = $iW + $iOverSize ;========================================= ; Add Noise ;========================================= Local $iNoiseSize = 40 Local $hBmp_Noise = _GDIPlus_BitmapCreateFromScan0($iNoiseSize, $iNoiseSize) Local $hGfx_Noise = _GDIPlus_ImageGetGraphicsContext($hBmp_Noise) Local $tData = _GDIPlus_BitmapLockBits($hBmp_Noise, 0, 0, $iNoiseSize, $iNoiseSize, BitOR($GDIP_ILMREAD, $GDIP_ILMWRITE), $GDIP_PXF32ARGB) Local $iStride = DllStructGetData($tData, "Stride") Local $iWidth = DllStructGetData($tData, "Width") Local $iHeight = DllStructGetData($tData, "Height") Local $pScan0 = DllStructGetData($tData, "Scan0") Local $tPixel = DllStructCreate("dword[" & $iWidth * $iHeight & "];", $pScan0) Local $iAmp For $row = 0 To $iHeight - 1 For $col = 0 To $iWidth - 1 $iAmp = Random(0, 0xFF, 1) DllStructSetData($tPixel, 1, BitOR(0xFF000000, BitShift($iAmp, -16), BitShift($iAmp, -8), $iAmp), $row * $iWidth + $col + 1) Next Next _GDIPlus_BitmapUnlockBits($hBmp_Noise, $tData) ;========================================= ; Create Full NoiseBitmap ;========================================= Local $hBmp_Full = _GDIPlus_BitmapCreateFromScan0($iWO, $iH) Local $hGfx_Full = _GDIPlus_ImageGetGraphicsContext($hBmp_Full) _GDIPlus_GraphicsSetSmoothingMode($hGfx_Full, 4) _GDIPlus_GraphicsSetInterpolationMode($hGfx_Full, 3) Local $iXOff, $iYOff, $iSizeX, $iSizeY For $y = 0 To $iH Step $iNoiseSize / 2 For $x = 0 To $iWO Step $iNoiseSize / 2 $iXOff = Random(0, $iNoiseSize / 2, 1) $iYOff = Random(0, $iNoiseSize / 2, 1) $iSizeX = $iNoiseSize - $iXOff $iSizeY = $iNoiseSize - $iYOff _GDIPlus_GraphicsDrawImageRectRect($hGfx_Full, $hBmp_Noise, $iXOff, $iYOff, $iSizeX, $iSizeY, $x, $y, $iSizeX, $iSizeY) Next Next _GDIPlus_GraphicsDispose($hGfx_Noise) _GDIPlus_BitmapDispose($hBmp_Noise) ;========================================= ; MotionBlur ;========================================= Local $hBmp_Full2 = _GDIPlus_BitmapCreateFromScan0($iWO, $iH) Local $hGfx_Full2 = _GDIPlus_ImageGetGraphicsContext($hBmp_Full2) _GDIPlus_GraphicsSetSmoothingMode($hGfx_Full2, 4) _GDIPlus_GraphicsSetInterpolationMode($hGfx_Full, 3) Local $tColorMatrix = DllStructCreate("float[5]; float[5]; float[5]; float[5]; float[5];") DllStructSetData($tColorMatrix, 1, 1, 1) DllStructSetData($tColorMatrix, 2, 1, 2) DllStructSetData($tColorMatrix, 3, 1, 3) DllStructSetData($tColorMatrix, 4, $fBlurTrans, 4) DllStructSetData($tColorMatrix, 5, 1, 5) Local $hImgAttrib = _GDIPlus_ImageAttributesCreate() DllCall($__g_hGDIPDll, "int", "GdipSetImageAttributesColorMatrix", "ptr", $hImgAttrib, "int", 1, "int", 1, "struct*", $tColorMatrix, "struct*", 0, "int", 0) For $i = 1 To $iBlurDist Step 2 DllCall($__g_hGDIPDll, "int", "GdipDrawImageRectRect", "ptr", $hGfx_Full2, "ptr", $hBmp_Full, _ "float", $i, "float", 0, "float", $iWO, "float", $iH, _ "float", 0, "float", 0, "float", $iWO, "float", $iH, _ "int", 2, "ptr", $hImgAttrib, "ptr", 0, "ptr", 0) If $i >= $iBlurDist Then DllStructSetData($tColorMatrix, 1, $fRed, 1) DllStructSetData($tColorMatrix, 2, $fGreen, 2) DllStructSetData($tColorMatrix, 3, $fBlue, 3) DllStructSetData($tColorMatrix, 4, 1, 4) DllCall($__g_hGDIPDll, "int", "GdipSetImageAttributesColorMatrix", "ptr", $hImgAttrib, "int", 1, "int", 1, "struct*", $tColorMatrix, "struct*", 0, "int", 0) EndIf DllCall($__g_hGDIPDll, "int", "GdipDrawImageRectRect", "ptr", $hGfx_Full, "ptr", $hBmp_Full2, _ "float", $i + 1, "float", 0, "float", $iWO, "float", $iH, _ "float", 0, "float", 0, "float", $iWO, "float", $iH, _ "int", 2, "ptr", $hImgAttrib, "ptr", 0, "ptr", 0) Next _GDIPlus_ImageAttributesDispose($hImgAttrib) _GDIPlus_GraphicsDispose($hGfx_Full2) _GDIPlus_BitmapDispose($hBmp_Full2) _GDIPlus_GraphicsDispose($hGfx_Full) ;========================================= ; Add Light ;========================================= Local $hBmp_Alu = _GDIPlus_BitmapCreateFromScan0($iW, $iH) Local $hGfx_Alu = _GDIPlus_ImageGetGraphicsContext($hBmp_Alu) _GDIPlus_GraphicsSetSmoothingMode($hGfx_Alu, 4) _GDIPlus_GraphicsSetInterpolationMode($hGfx_Alu, 3) _GDIPlus_GraphicsDrawImage($hGfx_Alu, $hBmp_Full, -$iOverSize, 0) _GDIPlus_BitmapDispose($hBmp_Full) Local $tPointF1 = DllStructCreate("float; float;") Local $tPointF2 = DllStructCreate("float; float;") DllStructSetData($tPointF2, 2, $iH * $fLightScale) $aResult = DllCall($__g_hGDIPDll, "int", "GdipCreateLineBrush", "struct*", $tPointF1, "struct*", $tPointF2, "uint", 0, "uint", $iLightColor, "int", 0, "handle*", 0) If @error Or Not IsArray($aResult) Then Return SetError(1, 4, False) Local $hBrush = $aResult[6] _GDIPlus_LineBrushSetSigmaBlend($hBrush, $fLightSigma) _GDIPlus_LineBrushSetGammaCorrection($hBrush) DllCall($__g_hGDIPDll, "int", "GdipRotateLineTransform", "ptr", $hBrush, "float", $fLightAngle, "int", 0) _GDIPlus_GraphicsFillRect($hGfx_Alu, 0, 0, $iW, $iH, $hBrush) _GDIPlus_BrushDispose($hBrush) _GDIPlus_GraphicsDispose($hGfx_Alu) Return $hBmp_Alu EndFunc ;==>_CreateBrushedAluminum ;Code below was generated by: 'File to Base64 String' Code Generator v1.20 Build 2018-02-02 Func _Au3_Icon($bSaveBinary = False, $sSavePath = @ScriptDir) Local $Au3_Icon $Au3_Icon &= 'iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAP0ElEQVR4XtWZW4hs6VXHf+v79qWquruquqtvZ/r0uc8540yScTIQQ0JkDOYyGhIkhhAxxhdR8mDAgAg+6FsE9UVffNMH8S0ERAwS1DFeEo3m6owzmUySc+Zc+15VXZd9+dZyp6ro4pDTORlGIfnDn703TW/+//X9v/Wt3i3PPfccP85w/GhBgLqkS23ixhpRfau6bgItIPpRN5Ag0Xl88jYrxu/E+KA492E0vJd44d245BKQ/H8bkAe80wMOEE5HA5c8SpQ822yv/ubW9vnfffyxR3+vs7r6YcS9HewZnP9ZXPwE0Py/NuCBJj65iERvQPybcNFP4JKzuPgq+CeR6GnwV3FJB4juM+mSNj55Ehe97/LFC5947PL2ey5tb755daW1+fiVc295+qk3fuTShfPPPnb10d+J60sfI6o9BbRer4EIaOLis1Nh6dtBfs6ljY82ljqfiNLFX8X597uk/ksrG4/8ftJo/lq62P51XPQOJHoc3DV8egZYxLkLcW3xQ088fvWTj2ysXItjnxRlGY6Ojmxvb98iJwtnz6xeXO80tx+9tP0Rcf6tuHhzLuS1YwmJLiHuslRVbzQbjydJsrXSbl4RIVlpLZ0xM71+e+cbC41a+8zayuVxlo9CCPnX/vslt7S89iEzy4/7R/+MT7+Lhq2V5dbbO63Ftbwog/feDYdDt7e3R71eo9vt2tbWlkZRRC1NFkHWQDpACmQ/bBuVWUyaiN+Kk9oH2q3mO/Ky0HNn1p9sNxeaBpiBmpl3TlTNqouoqkmFoKp5XuT1NKlVFS5ffOXm54ui2EFIr17afudCLV1SM5mBity+fRuAzc1NVC1EkfN3dg+/9e1vf/ePMfssYXz9hzXQJKo/BTyKlovrZ7Y+fPXi1luryubOOeKqPBpKQiilLAMhBAwEw7x3RN9jFImPIhTR8TjPQghFvZY2s7wYpkmc' $Au3_Icon &= 'Ag5ARFBVuXHjBpVPqurTaDRMVRERQgjll776wp9YKP+KMP5a9NCsS7SBuHMgb2stt9+13FraXltubYegmkRRMh4POTwccdAbMy4CQTFDBBEDABMvYmnirNVIaC3UpVFP667WqFdmrRLfYA7MDIBWq0WaplQRIo5j8d6bVvDOxbV6fXV03C0BeYgBvyxx7R1prfbs2srym8+e6bxhtrwMjnt276Bv3UGOuYQ4bVCrJ1JVWtxEvxO0xBHIiiBVpbnbLexetysLidjmygKLCwsYzjATwACpQK/XY2VlBTNjZ2cHVTXvvYkgg3F2lI2z2+ByIEScjgRx23GSPvPU41d+BQE1zMqCnb197h2NxCeLttBeliiOmCUGDIIJFgIbzYh2IyUoqBrHo0LuHQ4ozMl37g1sqTaUrdWWJbW6haAChnOOPM/Z3d1lNBpRVX/CEJTIOxkOs2Mt8z4iAHa6ARdvVnzL+a3NnzfMVNEyz/z1Wzt2XHgWW+tUwkUV8tKYlQ81IZLA9nJMI40IaohAFAnLSxHeSm7sDWi0VuR4cMxLN/fl0maLxsICqlRUVldXOTg4IEkSOp2OVUAE1Iz+YLSHyAAYndZGE1yyAXqt1Wq/b3Vl6WxQC/lo4F5+dccK15Dmchs1yEpAHCAwEe+IKbm8GhN5T6mKEwGmwgAWFxdYHo7Y6fdoLDUZDz0vvnrI1S1lYXEJnRmuhANYBalozolT1dDt97+Chq+j+f6DDUh0Bh8/k9br7754buOng5oW2ci9fGNHxtRoLrbIgwEecw5sasAQRAPnVx3eC0UIE/FmxhxgwMZqm1G+T/d4SL3eoAzKizcPefycUG8soqqEEAxMzFARIcvL8fWbO18YH/c+DfICcPwgA4JZa2lp6b3XLp39kK8QQtBbd/ZlUIgttJakNFA8OIeZQ5hVPyhnm0Y9dpTBEMDMeBBMPGc6i/RvdRnnCVWTIMvHfPPWEU+c97iohpmad47jcda/u3Pw/MHh' $Au3_Icon &= '0b+Zll8GfREtd08bJSJ81DgeDO6WQYOBHh3uy04/M5c0RCaxEBSHmsNMUKBUo5Uo6w0hVwEzToOZQcW01uCR5ZQym2zqSRcbZyW39gdgATPEgLu7hy/v7+3+jWn5GUz/Hi1vAPagUaKGS65geqndbD2ZJnE8Hh3bzb0BuFgkignq0FnmMWaCIHElFzuO0jwOQ+bR+YFGaomHMJyumIvAp1RdirVmnaRWMxGcqwi2i9mrhGyHOe43gEQrLq698+wj6x9f77SvWYVefyjjgOBjwKMiGG4uXsBZydU1jyGoKhpK8iLHe08cJ4gID4aAAhZQA8GBj7Gi4Ob+gMuPREBCGUKJWQNYBASw08bpBbDVtZXWNQPLs6FVvV6QyHAROmuRChigCGjg0rIjdTqpYlHk3L5zl2rO4Tu39iZmDDCzCZnfT4gTmL8PnAMXczTIyPOAqlk1JJ73Sf2NOH9pZoIHGYiApXqjcQVMMXQ8GssoV8NFgngMhyLA1IgLGRfa0K4beZCJ2J3dXfa7Q6I4pV9E3D0YYmV2f/7n90RRTC1yWChQExAPPsJUORzkTjVYNaVuXLm0/UHEXcDXaqcZSBBZi6NoAwRMGWUlhkzE4zwgqBoGYIGzLWG1rmQlOIHjfo+j45z11RUKE6ivcHsYca+bI9j0d21OMMR5Uq9okaEA4k5YGTBMKVV1MBwfYhpVbJy+AuKaYJEZqAbpjQoQx5yCMTspG8ZG05Opm4kL9IYZucJOd0AZL4G4yQgQxTXAMO6PkAF5NqY/KjAXA8LcgGecl6JBEcH1+sd3QFpA68EGosbC7IfxNNqlZaWdCAem92Y0IuXiMuQB5EQUdNotttY7bK52OL+6yLWO8pObsLboCMr3nws2NZAFAZ8whZwY0aAoAoY16rVVIIAVD+5CpklVqcvVmHwFM1TVBTU5GRNwiBnLDcfVjpIHB6bMAbVaQqNeQ8RQVcBRmCGnHWYYWZ5jEoGraDoTP6WpEYKK91YV' $Au3_Icon &= 'pX1ld+/Ah6zonxYhFCsXGumqqk2fDDspCkanIVxbKRkHh6l+X09XNcoQKEolmKAnwgUDzO7fyKZKVgTwMYh7gEFsQtNw697BC6HIR4ic0oUEESQKqkFEHCYmjpMe5zAudCLGFoHp97dDQEQwZmbKchqPYZ9B/4DxoIdqeSJezQhlwTAvwaecQDiBiMwe8cvtxS0fpxfAWoB7QIQoQlm8/NIrNz9z7fLZ94vzSeycZaWJYDzxSB1MmW2q+0TrieAReZ6RF4FRHhgXSqEQJkl0PLadkiR+ZkIIoWCUGdRjmB/rJxQRvBfMQIwESEGSmQG930AY7+HS5/N8fCXPy6KeuiSNnR2Pc1mqJ5ONOywU78BsLjwfjRj0e5NO0s+UIH5aUV+HKJlm21fUkkwhwVAzBCiLgmCAiwG7n6b4yIub6VcsA7uO6Q4QHjRKFGg5rObzs/VasmiqZZr4qJrd7bGtBcnyAifzHIeg9LoH7B70GWoEyRIsLEzFu1nnMuaVRRjmBUupYgrihLIsURyIZ155nVIDjSRR50Sq9tx7+ZXrf46Gf8TKm4CdMguJz4uil+fFKIp80lxo2NZ6g+oZVQXmq9w9OuDmzhFaW4HFzrTSGNicU9hJsPMAmAIOwyjLAM7PzOr9xGgvpZhBvz/aE/HerMiA0WldSIGeqXZFJC6Dulq9ThmChBAwM0wVMxgOj7m730NrHVhYB+fAwikjtIAACGqAKjp7V1AD8QD3VZ5Q4H1kywux5EXQ732Ra7eab0I1AO40AyCupxpe2T/qf9P7yMTUiqKwk9YnMhnWDg+PyKUOjc682gg/EMJ8jzKFqoG4k8xjYUot6LQagikGriyDdnv9zyNyBJSnG9C8b0X2D3mpN9MkcveJB1SV7tE+B4MwFY8ADxEv833pBEwAM8bjMaNxBshcvJYQcpyPbKtTpyjNIufk7l73q1qMvoiVuwCnGRAgixvNKxe21t+VZVlpZq6izA4pBsd9dg5HkDZn' $Au3_Icon &= 'J2eYb9RTMPdn1GLBcJhN33WUCcQNCMWEUwMF2+st0RCsAkf94W7/ePAVzO4Ag1MNzNDcPrP+B2aBEALARLzBJDp7B10CHnwCIQct59l/iAlBaUSgBoJRBp2KdxHo7F3FiFaraZ0Fb3kRDCyr/pz8pyIbfRa4B+hpBhLAti9cfmahnjyd53kBRFYBwFSt1+vZOC8hSkHnFZsygCmg87zcvwSIMR2bDcyUrFSAaSFCCeWIWr1hV9YbMspKjSPnrt/e/fdsNPg7TL9xWnyYn2qkYL/ovVPVWVLNBGA4HNLrDzmz1rbVVsMIGRVtugoFWDE3MjMzp4HmRGSIQBXNybfOLC/BbGqgGFq93uCJc21GeaFR5P0oK3pl0Bugz6P57R+U0wgoN7fO/8Zyq/nRooJhEYZUsLIsqDqA1Bs1lpotW9IgiXfcORqJlSNwCfgIxE84H78FYHofCupRCfjJp8K9wz4BD24SQVtpt+XiRsOqTY2A6/aGt1+9c+8vLBSfI4RXgIzTQQSki43axzHVEILI/Eua9fsDd9TtXd/c2Iy9d49kQfP2YhotNWJ5dW/EMJusguBicBMTcwPCFKqYQCgDg1FGXhqIWpQmnD/Tpplig9EYAesNsnu37tz7S9Pw14Tsf4AeD0F0/tLlReekphoEEDAB0SzL5ODoqI/qn+0e9ZezUp9dbjbOJ/W0aRAurNUlK+vubndsw6zAilwQARy4+SqIlZShIGt2LIQgca1h651l1tt1iqKQ42EIceTdzn7v+b39/U+L889j4VtT8Q+HfOUbL3zq7Ob6J800VlWbfR3W3b193z06/EPEfwoXP+ai+BdWO+0PFEXIq/3wBjAwVGazd29U0q+YFYGghjFF7KDmApVGGQ2PbWOtI1WzIC8Vg1Bp94fdwau37+78KdhzaHgFLbpA4OEgwmzNmPR8RCZDVuj2elG3e/S5NIn/KMuLQyR+Ucv80zs7ey+BbVVinIjUVpcXL816O82613Zd' $Au3_Icon &= 'gMTEOQcCqIo4RlkpVRu2Uk129w8DneWxeO9v3N79l+pCnuVfxvRfCdkLwIDXAPnSf33tU+fOnvktEXNFUUi1af3e3sHXNRQfA746P0+p4eJlxJ9D5I3OR09fPnfml6vD5m6rubCdRC4FAUDNdDTOe977ej2NUjOjdzxgNBwVh73h3/ooGXrvk2w8esE0PI9Nus11oM9rhHzhi//xtpXV1c+msW92uz0ODw6fA/1t4Es8GDEu3kDcFRclP6Ua2nGcbMdxvI4hzossLdQvAeRFeS/Liv00jddUtej2Bs9pKP4TDYdgOdBD3C4h2wcCrx1M/8kn7j2Y/gxwM03Tz2RZdouHo4GLOuA2EGliNBGpY3qM8+uAoeV3MBvjXBucTJ5dfIcwGgIGlIDxOjAx8DrhgQioEdUjxCmmEQDlaDATGTPF+JRKv24Dbp71GX9M8L84Jo46QVTs6gAAAABJRU5ErkJggg==' Local $bString = _WinAPI_Base64Decode($Au3_Icon) If @error Then Return SetError(1, 0, 0) $bString = Binary($bString) If $bSaveBinary Then Local Const $hFile = FileOpen($sSavePath & "\au3-icon2.png", 18) If @error Then Return SetError(2, 0, $bString) FileWrite($hFile, $bString) FileClose($hFile) EndIf Return $bString EndFunc ;==>_Au3_Icon Func _WinAPI_Base64Decode($sB64String) Local $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "ptr", 0, "dword*", 0, "ptr", 0, "ptr", 0) If @error Or Not $aCrypt[0] Then Return SetError(1, 0, "") Local $bBuffer = DllStructCreate("byte[" & $aCrypt[5] & "]") $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "struct*", $bBuffer, "dword*", $aCrypt[5], "ptr", 0, "ptr", 0) If @error Or Not $aCrypt[0] Then Return SetError(2, 0, "") Return DllStructGetData($bBuffer, 1) EndFunc ;==>_WinAPI_Base64Decode  
      Download: GDI+ Swiss Railway Clock v1.16 (Widget).au3
       
       
      GUI version (discontinued):
      ;the Hilfiker / MobaTime Swiss Railway Clock ;coded by UEZ build 2018-03-01 ;thanks to Eukalyptus for the _CreateBrushedAluminum() function! #Pragma Compile(Icon, "GDI+ Swiss Railway Clock.ico") #AutoIt3Wrapper_Run_Au3Stripper=y #Au3Stripper_Parameters=/so /pe /rm #AutoIt3Wrapper_Run_After=del /f /q "%scriptdir%\%scriptfile%_stripped.au3" #AutoIt3Wrapper_UseX64=n Break(0) #include <GDIPlus.au3> #include <GuiConstantsEx.au3> #include <WindowsConstants.au3> ProcessSetPriority(@AutoItPID, $PROCESS_LOW) _GDIPlus_Startup() Global $hGUI, $iFPS = 0, $iShowFPS = 0, $bExit Global Const $iW = 512, $iH = $iW, $iWh = $iW / 2, $iHh = $iH / 2, $sTitle = "GDI+ Swiss Railway Clock v1.1" Global Const $fRad = ACos(-1) / 180, $fDeg = 180 / ACos(-1), $iTimer = 30, $fDeltaShadow = $iW * 0.020 Global $hDC, $hCanvas, $hBitmap_Clock, $hBrush_Shadow, $hBrush_Update, $hPen_Update, $fDiameter = $iW, $hDC_backbuffer, $fShadowAngle, $fMin_next, _ $fRadius = $fDiameter / 2, $fSec, $fMin, $fHr, $fAmplitude = 3 AutoItSetOption("GUIOnEventMode", 1) GDIPlus_SwissRailwayClock() AutoItSetOption("GUIOnEventMode", 0) _GDIPlus_Shutdown() Func GDIPlus_SwissRailwayClock() $bExit = False $hGUI = GUICreate($sTitle, $iW + $fDeltaShadow, $iH + $fDeltaShadow, -1, -1, -1, $WS_EX_TOPMOST) GUISetBkColor(0xFFFFFF, $hGUI) GUISetState(@SW_SHOW, $hGUI) ;~ GUISetCursor(16, 1) ;create canvas elements $hDC = _WinAPI_GetDC($hGUI) Local Const $hHBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $iW + $fDeltaShadow, $iH + $fDeltaShadow) $hDC_backbuffer = _WinAPI_CreateCompatibleDC($hDC) Local Const $DC_obj = _WinAPI_SelectObject($hDC_backbuffer, $hHBitmap) $hCanvas = _GDIPlus_GraphicsCreateFromHDC($hDC_backbuffer) $hBrush_Shadow = _GDIPlus_BrushCreateSolid(0x14A0A0A0) $hPen_Update = _GDIPlus_PenCreate(0xFFA02020) $hBrush_Update = _GDIPlus_BrushCreateSolid(0) _GDIPlus_GraphicsSetSmoothingMode($hCanvas, $GDIP_SMOOTHINGMODE_HIGHQUALITY) _GDIPlus_GraphicsSetPixelOffsetMode($hCanvas, $GDIP_PIXELOFFSETMODE_HIGHQUALITY) $fDiameter = $fDiameter < 128 ? 128 : $fDiameter > 1024 ? 1024 : $fDiameter $hBitmap_Clock = GenerateClockBg($fDiameter) GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit_About") $fMin_next = @MIN GUIRegisterMsg($WM_TIMER, "Draw") ;$WM_TIMER = 0x0113 Local $iID = DllCall("User32.dll", "uint_ptr", "SetTimer", "hwnd", $hGUI, "uint_ptr", 1, "uint", $iTimer, "ptr", 0)[0] Do If $bExit Then ExitLoop Until Not Sleep(100) ;release resources GUIRegisterMsg($WM_TIMER, "") DllCall("user32.dll", "bool", "KillTimer", "hwnd", $hGUI, "uint_ptr", $iID) _GDIPlus_PenDispose($hPen_Update) _GDIPlus_BrushDispose($hBrush_Shadow) _GDIPlus_BrushDispose($hBrush_Update) _GDIPlus_GraphicsDispose($hCanvas) _WinAPI_SelectObject($hDC_backbuffer, $DC_obj) _WinAPI_DeleteDC($hDC_backbuffer) _WinAPI_DeleteObject($hHBitmap) _WinAPI_ReleaseDC($hGUI, $hDC) GUIDelete($hGUI) EndFunc ;==>GDIPlus_SwissRailwayClock Func Draw($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg, $wParam, $lParam _GDIPlus_GraphicsDrawImageRect($hCanvas, $hBitmap_Clock, 0, 0, $fDiameter + $fDeltaShadow, $fDiameter + $fDeltaShadow) UpdateClock($hCanvas, $fDiameter) _WinAPI_BitBlt($hDC, 0, 0, $iW + $fDeltaShadow, $iH + $fDeltaShadow, $hDC_backbuffer, 0, 0, $SRCCOPY) EndFunc Func _Exit_About() $bExit = True EndFunc ;==>_Exit_About Func UpdateClock($hGfx, $fDiameter) Static $bBounce = 0, $f = 0 Local $m1 = $fDiameter * 0.015 ;hour $fHr = 30 * (@HOUR + @MIN / 60) _GDIPlus_GraphicsTranslateTransform($hGfx, $fRadius, $fRadius) _GDIPlus_GraphicsRotateTransform($hGfx, $fHr) _GDIPlus_GraphicsTranslateTransform($hGfx, -$fRadius, -$fRadius) Local $iWidth1 = $fDiameter * 0.0375, _ $iHeight1 = $fDiameter / 2.5, _ $iWidth12 = $iWidth1 / 2, _ $fPosY = $fDiameter * 0.2, $iWidth2, $iWidth22, $fPosY2 _GDIPlus_BrushSetSolidColor($hBrush_Update, 0xFF101010) DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hGfx, "handle", $hBrush_Shadow, _ "float", $fRadius - $iWidth12 + Cos(($fShadowAngle - $fHr) * $fRad) * $m1, _ "float", $fPosY + Sin(($fShadowAngle - $fHr) * $fRad) * $m1, _ "float", $iWidth1, "float", $iHeight1) DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hGfx, "handle", $hBrush_Update, _ "float", $fRadius - $iWidth12, _ "float", $fPosY, _ "float", $iWidth1, "float", $iHeight1) _GDIPlus_GraphicsResetTransform($hGfx) ;min If $fMin_next <> @MIN Then $bBounce = 1 Switch $bBounce Case 1 $fMin = (6 * Mod(($fMin_next + 1), 60)) + Sin($f * 1.9) * $fAmplitude If $fAmplitude = 0 Then $fMin_next = @MIN $f = 0 $fAmplitude = 3 $bBounce = 0 Else $fAmplitude -= 0.5 $fAmplitude = $fAmplitude <= 0 ? 0 : $fAmplitude $f += 1 EndIf Case Else $fMin = (6 * @MIN) EndSwitch _GDIPlus_GraphicsTranslateTransform($hGfx, $fRadius, $fRadius) _GDIPlus_GraphicsRotateTransform($hGfx, $fMin) _GDIPlus_GraphicsTranslateTransform($hGfx, -$fRadius, -$fRadius) $iWidth1 = $fDiameter * 0.03 $iHeight1 = $fRadius $iWidth12 = $iWidth1 / 2 $fPosY = $fDiameter * 0.1 DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hGfx, "handle", $hBrush_Shadow, _ "float", $fRadius - $iWidth12 + Cos(($fShadowAngle - $fMin) * $fRad) * $m1, _ "float", $fPosY + Sin(($fShadowAngle - $fMin) * $fRad) * $m1, _ "float", $iWidth1, "float", $iHeight1) DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hGfx, "handle", $hBrush_Update, _ "float", $fRadius - $iWidth12, _ "float", $fPosY, _ "float", $iWidth1, "float", $iHeight1) _GDIPlus_GraphicsResetTransform($hGfx) ;sec $fSec = 6 * (@SEC * 1.02564 + @MSEC / 1000) If $fSec >= 360 Then $fSec = 0 _GDIPlus_GraphicsTranslateTransform($hGfx, $fRadius, $fRadius) _GDIPlus_GraphicsRotateTransform($hGfx, $fSec) _GDIPlus_GraphicsTranslateTransform($hGfx, -$fRadius, -$fRadius) $fPosY = $fDiameter * 0.27 $fPosY2 = $fDiameter * 0.19 $iWidth1 = $fDiameter * 0.0095 $iHeight1 = $fRadius * 1.3 - $fPosY $iWidth12 = $iWidth1 / 2 $iWidth2 = $fDiameter * 0.083333 $iWidth22 = $iWidth2 / 2 ;shadow seconds DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hGfx, "handle", $hBrush_Shadow, _ "float", $fRadius + Cos(($fShadowAngle - $fSec) * $fRad) * $m1, _ "float", $fPosY + Sin(($fShadowAngle - $fSec) * $fRad) * $m1, _ "float", $iWidth1 + $fDiameter * 0.006667, "float", $iHeight1 + $fDiameter * 0.006667) DllCall($__g_hGDIPDll, "int", "GdipFillEllipse", "handle", $hGfx, "handle", $hBrush_Shadow, _ "float", $fRadius - $iWidth22 + Cos(($fShadowAngle - $fSec) * $fRad) * $m1, _ "float", $fPosY2 + Sin(($fShadowAngle - $fSec) * $fRad) * $m1, _ "float", $iWidth2, "float", $iWidth2) ;seconds _GDIPlus_BrushSetSolidColor($hBrush_Update, 0xFFC01010) DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hGfx, "handle", $hBrush_Update, _ "float", $fRadius - $iWidth12, _ "float", $fPosY, _ "float", $iWidth1, "float", $iHeight1) DllCall($__g_hGDIPDll, "int", "GdipFillEllipse", "handle", $hGfx, "handle", $hBrush_Update, _ "float", $fRadius - $iWidth22, _ "float", $fPosY2, _ "float", $iWidth2, "float", $iWidth2) _GDIPlus_GraphicsResetTransform($hGfx) ;button in the center DllCall($__g_hGDIPDll, "int", "GdipFillEllipse", "handle", $hGfx, "handle", $hBrush_Update, _ "float", $fRadius - $iWidth1, _ "float", $fRadius - $iWidth1, _ "float", 2 * $iWidth1, "float", 2 * $iWidth1) DllCall($__g_hGDIPDll, "int", "GdipDrawEllipse", "handle", $hGfx, "handle", $hPen_Update, _ "float", $fRadius - $iWidth1, _ "float", $fRadius - $iWidth1, _ "float", 2 * $iWidth1, "float", 2 * $iWidth1) EndFunc Func GenerateClockBg($fDiameter) Local Const $hBitmap = _GDIPlus_BitmapCreateFromScan0($fDiameter + $fDeltaShadow, $fDiameter + $fDeltaShadow), $hGfx = _GDIPlus_ImageGetGraphicsContext($hBitmap), _ $hBrush = _GDIPlus_BrushCreateSolid(0xFF000000), $fBorderSize = $fDiameter * 0.03333, _ $hEffect = _GDIPlus_EffectCreateBlur($fDiameter / 50, 0), $hPen = _GDIPlus_PenCreate(0xA0000000, $fBorderSize) _GDIPlus_GraphicsSetSmoothingMode($hGfx, 4) _GDIPlus_GraphicsSetPixelOffsetMode($hGfx, 4) _GDIPlus_GraphicsSetTextRenderingHint($hGfx, 4) _GDIPlus_GraphicsClear($hGfx, 0xFFFFFFFF) Local Const $fSize = $fDiameter * 0.95 - $fBorderSize / 2 Local $fShadow_vx = $fDiameter * 0.0095, $fShadow_vy = $fDiameter * 0.01 $fShadowAngle = ATan($fShadow_vy / $fShadow_vx) * $fDeg If $fShadow_vx < 0 And $fShadow_vy >= 0 Then $fShadowAngle += 180 If $fShadow_vx < 0 And $fShadow_vy < 0 Then $fShadowAngle -= 180 _GDIPlus_GraphicsDrawEllipse($hGfx, $fBorderSize + $fShadow_vx, $fBorderSize + $fShadow_vy, $fSize, $fSize, $hPen) _GDIPlus_BitmapApplyEffect($hBitmap, $hEffect) _GDIPlus_PenSetColor($hPen, 0xF0000000) Local Const $hBitmap_Texture = _CreateBrushedAluminum($fDiameter, $fDiameter, $fShadowAngle) Local Const $hTexture = _GDIPlus_TextureCreate($hBitmap_Texture) DllCall($__g_hGDIPDll, "int", "GdipSetPenBrushFill", "ptr", $hPen, "ptr", $hTexture) _GDIPlus_GraphicsDrawEllipse($hGfx, $fBorderSize, $fBorderSize, $fSize, $fSize, $hPen) _GDIPlus_GraphicsTranslateTransform($hGfx, $fRadius, $fRadius) _GDIPlus_GraphicsRotateTransform($hGfx, -6) _GDIPlus_GraphicsTranslateTransform($hGfx, -$fRadius, -$fRadius) Local $iWidth1 = $fDiameter * 0.026667, $iHeight1 = $fDiameter / 10, $iWidth12 = $iWidth1 / 2, $fPosY = $fDiameter * 0.083333, _ $iWidth2 = $fDiameter * 0.013333, $iHeight2 = $fDiameter * 0.0416667, $iWidth22 = $iWidth2 / 2 For $i = 0 to 59 _GDIPlus_GraphicsTranslateTransform($hGfx, $fRadius, $fRadius) _GDIPlus_GraphicsRotateTransform($hGfx, 6) _GDIPlus_GraphicsTranslateTransform($hGfx, -$fRadius, -$fRadius) Switch Mod($i, 5) Case 0 _GDIPlus_GraphicsFillRect($hGfx, $fRadius - $iWidth12, $fPosY, $iWidth1, $iHeight1, $hBrush) Case Else _GDIPlus_GraphicsFillRect($hGfx, $fRadius - $iWidth22, $fPosY, $iWidth2, $iHeight2, $hBrush) EndSwitch Next _GDIPlus_GraphicsResetTransform($hGfx) Local Const $hBitmap_Logo = _GDIPlus_BitmapCreateFromMemory(_Au3_Icon()) Local Const $hBitmap_Logo_Scaled = _GDIPlus_ImageResize($hBitmap_Logo, $fDiameter * 0.08, $fDiameter * 0.08) Local $aDim = _GDIPlus_ImageGetDimension($hBitmap_Logo_Scaled) _GDIPlus_GraphicsDrawImageRect($hGfx, $hBitmap_Logo_Scaled, $fRadius - $aDim[0] / 2, $fRadius / 1.75, $aDim[0], $aDim[1]) _GDIPlus_ImageDispose($hBitmap_Logo) _GDIPlus_ImageDispose($hBitmap_Logo_Scaled) Local Const $hFamily = _GDIPlus_FontFamilyCreate("Segoe Script"), $hFont = _GDIPlus_FontCreate($hFamily, $fDiameter * 0.025), $hFormat = _GDIPlus_StringFormatCreate() _GDIPlus_StringFormatSetAlign($hFormat, 1) _GDIPlus_StringFormatSetLineAlign($hFormat, 1) ;~ _GDIPlus_BrushSetSolidColor($hBrush, 0xFF400000) _GDIPlus_GraphicsDrawStringEx($hGfx, "Clock by" & @CRLF & "UEZ", $hFont, _GDIPlus_RectFCreate($fRadius - $fRadius * 0.2, $fRadius + $fRadius * 0.2, $fRadius * 0.4, $fRadius * 0.4), $hFormat, $hBrush) _GDIPlus_ImageDispose($hBitmap_Texture) _GDIPlus_BrushDispose($hTexture) _GDIPlus_FontDispose($hFont) _GDIPlus_FontFamilyDispose($hFamily) _GDIPlus_StringFormatDispose($hFormat) _GDIPlus_EffectDispose($hEffect) _GDIPlus_PenDispose($hPen) _GDIPlus_BrushDispose($hBrush) _GDIPlus_GraphicsDispose($hGfx) Return $hBitmap EndFunc Func _CreateBrushedAluminum($iW, $iH, $fLightAngle = 40, $iBlurDist = 12, $fBlurTrans = 0.6666, $fRed = 0.8, $fGreen = 0.9, $fBlue = 1, $iLightColor = 0xF0FFFFFF, $fLightSigma = 0.5, $fLightScale = 0.83) ;coded by Eukalyptus! $iBlurDist = Ceiling($iBlurDist) $iBlurDist += 1 - Mod($iBlurDist, 2) Local $iOverSize = 0 For $i = 1 To $iBlurDist Step 2 $iOverSize += $i + $i + 1 Next Local $iWO = $iW + $iOverSize ;========================================= ; Add Noise ;========================================= Local $iNoiseSize = 40 Local $hBmp_Noise = _GDIPlus_BitmapCreateFromScan0($iNoiseSize, $iNoiseSize) Local $hGfx_Noise = _GDIPlus_ImageGetGraphicsContext($hBmp_Noise) Local $tData = _GDIPlus_BitmapLockBits($hBmp_Noise, 0, 0, $iNoiseSize, $iNoiseSize, BitOR($GDIP_ILMREAD, $GDIP_ILMWRITE), $GDIP_PXF32ARGB) Local $iStride = DllStructGetData($tData, "Stride") Local $iWidth = DllStructGetData($tData, "Width") Local $iHeight = DllStructGetData($tData, "Height") Local $pScan0 = DllStructGetData($tData, "Scan0") Local $tPixel = DllStructCreate("dword[" & $iWidth * $iHeight & "];", $pScan0) Local $iAmp For $row = 0 To $iHeight - 1 For $col = 0 To $iWidth - 1 $iAmp = Random(0, 0xFF, 1) DllStructSetData($tPixel, 1, BitOR(0xFF000000, BitShift($iAmp, -16), BitShift($iAmp, -8), $iAmp), $row * $iWidth + $col + 1) Next Next _GDIPlus_BitmapUnlockBits($hBmp_Noise, $tData) ;========================================= ; Create Full NoiseBitmap ;========================================= Local $hBmp_Full = _GDIPlus_BitmapCreateFromScan0($iWO, $iH) Local $hGfx_Full = _GDIPlus_ImageGetGraphicsContext($hBmp_Full) _GDIPlus_GraphicsSetSmoothingMode($hGfx_Full, 4) _GDIPlus_GraphicsSetInterpolationMode($hGfx_Full, 3) Local $iXOff, $iYOff, $iSizeX, $iSizeY For $y = 0 To $iH Step $iNoiseSize / 2 For $x = 0 To $iWO Step $iNoiseSize / 2 $iXOff = Random(0, $iNoiseSize / 2, 1) $iYOff = Random(0, $iNoiseSize / 2, 1) $iSizeX = $iNoiseSize - $iXOff $iSizeY = $iNoiseSize - $iYOff _GDIPlus_GraphicsDrawImageRectRect($hGfx_Full, $hBmp_Noise, $iXOff, $iYOff, $iSizeX, $iSizeY, $x, $y, $iSizeX, $iSizeY) Next Next _GDIPlus_GraphicsDispose($hGfx_Noise) _GDIPlus_BitmapDispose($hBmp_Noise) ;========================================= ; MotionBlur ;========================================= Local $hBmp_Full2 = _GDIPlus_BitmapCreateFromScan0($iWO, $iH) Local $hGfx_Full2 = _GDIPlus_ImageGetGraphicsContext($hBmp_Full2) _GDIPlus_GraphicsSetSmoothingMode($hGfx_Full2, 4) _GDIPlus_GraphicsSetInterpolationMode($hGfx_Full, 3) Local $tColorMatrix = DllStructCreate("float[5]; float[5]; float[5]; float[5]; float[5];") DllStructSetData($tColorMatrix, 1, 1, 1) DllStructSetData($tColorMatrix, 2, 1, 2) DllStructSetData($tColorMatrix, 3, 1, 3) DllStructSetData($tColorMatrix, 4, $fBlurTrans, 4) DllStructSetData($tColorMatrix, 5, 1, 5) Local $hImgAttrib = _GDIPlus_ImageAttributesCreate() DllCall($__g_hGDIPDll, "int", "GdipSetImageAttributesColorMatrix", "ptr", $hImgAttrib, "int", 1, "int", 1, "struct*", $tColorMatrix, "struct*", 0, "int", 0) For $i = 1 To $iBlurDist Step 2 DllCall($__g_hGDIPDll, "int", "GdipDrawImageRectRect", "ptr", $hGfx_Full2, "ptr", $hBmp_Full, _ "float", $i, "float", 0, "float", $iWO, "float", $iH, _ "float", 0, "float", 0, "float", $iWO, "float", $iH, _ "int", 2, "ptr", $hImgAttrib, "ptr", 0, "ptr", 0) If $i >= $iBlurDist Then DllStructSetData($tColorMatrix, 1, $fRed, 1) DllStructSetData($tColorMatrix, 2, $fGreen, 2) DllStructSetData($tColorMatrix, 3, $fBlue, 3) DllStructSetData($tColorMatrix, 4, 1, 4) DllCall($__g_hGDIPDll, "int", "GdipSetImageAttributesColorMatrix", "ptr", $hImgAttrib, "int", 1, "int", 1, "struct*", $tColorMatrix, "struct*", 0, "int", 0) EndIf DllCall($__g_hGDIPDll, "int", "GdipDrawImageRectRect", "ptr", $hGfx_Full, "ptr", $hBmp_Full2, _ "float", $i + 1, "float", 0, "float", $iWO, "float", $iH, _ "float", 0, "float", 0, "float", $iWO, "float", $iH, _ "int", 2, "ptr", $hImgAttrib, "ptr", 0, "ptr", 0) Next _GDIPlus_ImageAttributesDispose($hImgAttrib) _GDIPlus_GraphicsDispose($hGfx_Full2) _GDIPlus_BitmapDispose($hBmp_Full2) _GDIPlus_GraphicsDispose($hGfx_Full) ;========================================= ; Add Light ;========================================= Local $hBmp_Alu = _GDIPlus_BitmapCreateFromScan0($iW, $iH) Local $hGfx_Alu = _GDIPlus_ImageGetGraphicsContext($hBmp_Alu) _GDIPlus_GraphicsSetSmoothingMode($hGfx_Alu, 4) _GDIPlus_GraphicsSetInterpolationMode($hGfx_Full, 3) _GDIPlus_GraphicsDrawImage($hGfx_Alu, $hBmp_Full, -$iOverSize, 0) _GDIPlus_BitmapDispose($hBmp_Full) Local $tPointF1 = DllStructCreate("float; float;") Local $tPointF2 = DllStructCreate("float; float;") DllStructSetData($tPointF2, 2, $iH * $fLightScale) $aResult = DllCall($__g_hGDIPDll, "int", "GdipCreateLineBrush", "struct*", $tPointF1, "struct*", $tPointF2, "uint", 0, "uint", $iLightColor, "int", 0, "handle*", 0) If @error Or Not IsArray($aResult) Then Return SetError(1, 4, False) Local $hBrush = $aResult[6] _GDIPlus_LineBrushSetSigmaBlend($hBrush, $fLightSigma) _GDIPlus_LineBrushSetGammaCorrection($hBrush) DllCall($__g_hGDIPDll, "int", "GdipRotateLineTransform", "ptr", $hBrush, "float", $fLightAngle, "int", 0) _GDIPlus_GraphicsFillRect($hGfx_Alu, 0, 0, $iW, $iH, $hBrush) _GDIPlus_BrushDispose($hBrush) _GDIPlus_GraphicsDispose($hGfx_Alu) Return $hBmp_Alu EndFunc ;==>_CreateBrushedAluminum ;Code below was generated by: 'File to Base64 String' Code Generator v1.20 Build 2018-02-02 Func _Au3_Icon($bSaveBinary = False, $sSavePath = @ScriptDir) Local $Au3_Icon $Au3_Icon &= 'iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAP0ElEQVR4XtWZW4hs6VXHf+v79qWquruquqtvZ/r0uc8540yScTIQQ0JkDOYyGhIkhhAxxhdR8mDAgAg+6FsE9UVffNMH8S0ERAwS1DFeEo3m6owzmUySc+Zc+15VXZd9+dZyp6ro4pDTORlGIfnDn703TW/+//X9v/Wt3i3PPfccP85w/GhBgLqkS23ixhpRfau6bgItIPpRN5Ag0Xl88jYrxu/E+KA492E0vJd44d245BKQ/H8bkAe80wMOEE5HA5c8SpQ822yv/ubW9vnfffyxR3+vs7r6YcS9HewZnP9ZXPwE0Py/NuCBJj65iERvQPybcNFP4JKzuPgq+CeR6GnwV3FJB4juM+mSNj55Ehe97/LFC5947PL2ey5tb755daW1+fiVc295+qk3fuTShfPPPnb10d+J60sfI6o9BbRer4EIaOLis1Nh6dtBfs6ljY82ljqfiNLFX8X597uk/ksrG4/8ftJo/lq62P51XPQOJHoc3DV8egZYxLkLcW3xQ088fvWTj2ysXItjnxRlGY6Ojmxvb98iJwtnz6xeXO80tx+9tP0Rcf6tuHhzLuS1YwmJLiHuslRVbzQbjydJsrXSbl4RIVlpLZ0xM71+e+cbC41a+8zayuVxlo9CCPnX/vslt7S89iEzy4/7R/+MT7+Lhq2V5dbbO63Ftbwog/feDYdDt7e3R71eo9vt2tbWlkZRRC1NFkHWQDpACmQ/bBuVWUyaiN+Kk9oH2q3mO/Ky0HNn1p9sNxeaBpiBmpl3TlTNqouoqkmFoKp5XuT1NKlVFS5ffOXm54ui2EFIr17afudCLV1SM5mBity+fRuAzc1NVC1EkfN3dg+/9e1vf/ePMfssYXz9hzXQJKo/BTyKlovrZ7Y+fPXi1luryubOOeKqPBpKQiilLAMhBAwEw7x3RN9jFImPIhTR8TjPQghFvZY2s7wYpkmc' $Au3_Icon &= 'Ag5ARFBVuXHjBpVPqurTaDRMVRERQgjll776wp9YKP+KMP5a9NCsS7SBuHMgb2stt9+13FraXltubYegmkRRMh4POTwccdAbMy4CQTFDBBEDABMvYmnirNVIaC3UpVFP667WqFdmrRLfYA7MDIBWq0WaplQRIo5j8d6bVvDOxbV6fXV03C0BeYgBvyxx7R1prfbs2srym8+e6bxhtrwMjnt276Bv3UGOuYQ4bVCrJ1JVWtxEvxO0xBHIiiBVpbnbLexetysLidjmygKLCwsYzjATwACpQK/XY2VlBTNjZ2cHVTXvvYkgg3F2lI2z2+ByIEScjgRx23GSPvPU41d+BQE1zMqCnb197h2NxCeLttBeliiOmCUGDIIJFgIbzYh2IyUoqBrHo0LuHQ4ozMl37g1sqTaUrdWWJbW6haAChnOOPM/Z3d1lNBpRVX/CEJTIOxkOs2Mt8z4iAHa6ARdvVnzL+a3NnzfMVNEyz/z1Wzt2XHgWW+tUwkUV8tKYlQ81IZLA9nJMI40IaohAFAnLSxHeSm7sDWi0VuR4cMxLN/fl0maLxsICqlRUVldXOTg4IEkSOp2OVUAE1Iz+YLSHyAAYndZGE1yyAXqt1Wq/b3Vl6WxQC/lo4F5+dccK15Dmchs1yEpAHCAwEe+IKbm8GhN5T6mKEwGmwgAWFxdYHo7Y6fdoLDUZDz0vvnrI1S1lYXEJnRmuhANYBalozolT1dDt97+Chq+j+f6DDUh0Bh8/k9br7754buOng5oW2ci9fGNHxtRoLrbIgwEecw5sasAQRAPnVx3eC0UIE/FmxhxgwMZqm1G+T/d4SL3eoAzKizcPefycUG8soqqEEAxMzFARIcvL8fWbO18YH/c+DfICcPwgA4JZa2lp6b3XLp39kK8QQtBbd/ZlUIgttJakNFA8OIeZQ5hVPyhnm0Y9dpTBEMDMeBBMPGc6i/RvdRnnCVWTIMvHfPPWEU+c97iohpmad47jcda/u3Pw/MHh' $Au3_Icon &= '0b+Zll8GfREtd08bJSJ81DgeDO6WQYOBHh3uy04/M5c0RCaxEBSHmsNMUKBUo5Uo6w0hVwEzToOZQcW01uCR5ZQym2zqSRcbZyW39gdgATPEgLu7hy/v7+3+jWn5GUz/Hi1vAPagUaKGS65geqndbD2ZJnE8Hh3bzb0BuFgkignq0FnmMWaCIHElFzuO0jwOQ+bR+YFGaomHMJyumIvAp1RdirVmnaRWMxGcqwi2i9mrhGyHOe43gEQrLq698+wj6x9f77SvWYVefyjjgOBjwKMiGG4uXsBZydU1jyGoKhpK8iLHe08cJ4gID4aAAhZQA8GBj7Gi4Ob+gMuPREBCGUKJWQNYBASw08bpBbDVtZXWNQPLs6FVvV6QyHAROmuRChigCGjg0rIjdTqpYlHk3L5zl2rO4Tu39iZmDDCzCZnfT4gTmL8PnAMXczTIyPOAqlk1JJ73Sf2NOH9pZoIHGYiApXqjcQVMMXQ8GssoV8NFgngMhyLA1IgLGRfa0K4beZCJ2J3dXfa7Q6I4pV9E3D0YYmV2f/7n90RRTC1yWChQExAPPsJUORzkTjVYNaVuXLm0/UHEXcDXaqcZSBBZi6NoAwRMGWUlhkzE4zwgqBoGYIGzLWG1rmQlOIHjfo+j45z11RUKE6ivcHsYca+bI9j0d21OMMR5Uq9okaEA4k5YGTBMKVV1MBwfYhpVbJy+AuKaYJEZqAbpjQoQx5yCMTspG8ZG05Opm4kL9IYZucJOd0AZL4G4yQgQxTXAMO6PkAF5NqY/KjAXA8LcgGecl6JBEcH1+sd3QFpA68EGosbC7IfxNNqlZaWdCAem92Y0IuXiMuQB5EQUdNotttY7bK52OL+6yLWO8pObsLboCMr3nws2NZAFAZ8whZwY0aAoAoY16rVVIIAVD+5CpklVqcvVmHwFM1TVBTU5GRNwiBnLDcfVjpIHB6bMAbVaQqNeQ8RQVcBRmCGnHWYYWZ5jEoGraDoTP6WpEYKK91YV' $Au3_Icon &= 'pX1ld+/Ah6zonxYhFCsXGumqqk2fDDspCkanIVxbKRkHh6l+X09XNcoQKEolmKAnwgUDzO7fyKZKVgTwMYh7gEFsQtNw697BC6HIR4ic0oUEESQKqkFEHCYmjpMe5zAudCLGFoHp97dDQEQwZmbKchqPYZ9B/4DxoIdqeSJezQhlwTAvwaecQDiBiMwe8cvtxS0fpxfAWoB7QIQoQlm8/NIrNz9z7fLZ94vzSeycZaWJYDzxSB1MmW2q+0TrieAReZ6RF4FRHhgXSqEQJkl0PLadkiR+ZkIIoWCUGdRjmB/rJxQRvBfMQIwESEGSmQG930AY7+HS5/N8fCXPy6KeuiSNnR2Pc1mqJ5ONOywU78BsLjwfjRj0e5NO0s+UIH5aUV+HKJlm21fUkkwhwVAzBCiLgmCAiwG7n6b4yIub6VcsA7uO6Q4QHjRKFGg5rObzs/VasmiqZZr4qJrd7bGtBcnyAifzHIeg9LoH7B70GWoEyRIsLEzFu1nnMuaVRRjmBUupYgrihLIsURyIZ155nVIDjSRR50Sq9tx7+ZXrf46Gf8TKm4CdMguJz4uil+fFKIp80lxo2NZ6g+oZVQXmq9w9OuDmzhFaW4HFzrTSGNicU9hJsPMAmAIOwyjLAM7PzOr9xGgvpZhBvz/aE/HerMiA0WldSIGeqXZFJC6Dulq9ThmChBAwM0wVMxgOj7m730NrHVhYB+fAwikjtIAACGqAKjp7V1AD8QD3VZ5Q4H1kywux5EXQ732Ra7eab0I1AO40AyCupxpe2T/qf9P7yMTUiqKwk9YnMhnWDg+PyKUOjc682gg/EMJ8jzKFqoG4k8xjYUot6LQagikGriyDdnv9zyNyBJSnG9C8b0X2D3mpN9MkcveJB1SV7tE+B4MwFY8ADxEv833pBEwAM8bjMaNxBshcvJYQcpyPbKtTpyjNIufk7l73q1qMvoiVuwCnGRAgixvNKxe21t+VZVlpZq6izA4pBsd9dg5HkDZn' $Au3_Icon &= 'J2eYb9RTMPdn1GLBcJhN33WUCcQNCMWEUwMF2+st0RCsAkf94W7/ePAVzO4Ag1MNzNDcPrP+B2aBEALARLzBJDp7B10CHnwCIQct59l/iAlBaUSgBoJRBp2KdxHo7F3FiFaraZ0Fb3kRDCyr/pz8pyIbfRa4B+hpBhLAti9cfmahnjyd53kBRFYBwFSt1+vZOC8hSkHnFZsygCmg87zcvwSIMR2bDcyUrFSAaSFCCeWIWr1hV9YbMspKjSPnrt/e/fdsNPg7TL9xWnyYn2qkYL/ovVPVWVLNBGA4HNLrDzmz1rbVVsMIGRVtugoFWDE3MjMzp4HmRGSIQBXNybfOLC/BbGqgGFq93uCJc21GeaFR5P0oK3pl0Bugz6P57R+U0wgoN7fO/8Zyq/nRooJhEYZUsLIsqDqA1Bs1lpotW9IgiXfcORqJlSNwCfgIxE84H78FYHofCupRCfjJp8K9wz4BD24SQVtpt+XiRsOqTY2A6/aGt1+9c+8vLBSfI4RXgIzTQQSki43axzHVEILI/Eua9fsDd9TtXd/c2Iy9d49kQfP2YhotNWJ5dW/EMJusguBicBMTcwPCFKqYQCgDg1FGXhqIWpQmnD/Tpplig9EYAesNsnu37tz7S9Pw14Tsf4AeD0F0/tLlReekphoEEDAB0SzL5ODoqI/qn+0e9ZezUp9dbjbOJ/W0aRAurNUlK+vubndsw6zAilwQARy4+SqIlZShIGt2LIQgca1h651l1tt1iqKQ42EIceTdzn7v+b39/U+L889j4VtT8Q+HfOUbL3zq7Ob6J800VlWbfR3W3b193z06/EPEfwoXP+ai+BdWO+0PFEXIq/3wBjAwVGazd29U0q+YFYGghjFF7KDmApVGGQ2PbWOtI1WzIC8Vg1Bp94fdwau37+78KdhzaHgFLbpA4OEgwmzNmPR8RCZDVuj2elG3e/S5NIn/KMuLQyR+Ucv80zs7ey+BbVVinIjUVpcXL816O82613Zd' $Au3_Icon &= 'gMTEOQcCqIo4RlkpVRu2Uk129w8DneWxeO9v3N79l+pCnuVfxvRfCdkLwIDXAPnSf33tU+fOnvktEXNFUUi1af3e3sHXNRQfA746P0+p4eJlxJ9D5I3OR09fPnfml6vD5m6rubCdRC4FAUDNdDTOe977ej2NUjOjdzxgNBwVh73h3/ooGXrvk2w8esE0PI9Nus11oM9rhHzhi//xtpXV1c+msW92uz0ODw6fA/1t4Es8GDEu3kDcFRclP6Ua2nGcbMdxvI4hzossLdQvAeRFeS/Liv00jddUtej2Bs9pKP4TDYdgOdBD3C4h2wcCrx1M/8kn7j2Y/gxwM03Tz2RZdouHo4GLOuA2EGliNBGpY3qM8+uAoeV3MBvjXBucTJ5dfIcwGgIGlIDxOjAx8DrhgQioEdUjxCmmEQDlaDATGTPF+JRKv24Dbp71GX9M8L84Jo46QVTs6gAAAABJRU5ErkJggg==' Local $bString = _WinAPI_Base64Decode($Au3_Icon) If @error Then Return SetError(1, 0, 0) $bString = Binary($bString) If $bSaveBinary Then Local Const $hFile = FileOpen($sSavePath & "\au3-icon2.png", 18) If @error Then Return SetError(2, 0, $bString) FileWrite($hFile, $bString) FileClose($hFile) EndIf Return $bString EndFunc ;==>_Au3_Icon Func _WinAPI_Base64Decode($sB64String) Local $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "ptr", 0, "dword*", 0, "ptr", 0, "ptr", 0) If @error Or Not $aCrypt[0] Then Return SetError(1, 0, "") Local $bBuffer = DllStructCreate("byte[" & $aCrypt[5] & "]") $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "struct*", $bBuffer, "dword*", $aCrypt[5], "ptr", 0, "ptr", 0) If @error Or Not $aCrypt[0] Then Return SetError(2, 0, "") Return DllStructGetData($bBuffer, 1) EndFunc ;==>_WinAPI_Base64Decode  
      If you want to run in x64 mode please use AutoIt version 3.3.14.3 since the bug in function _GDIPlus_EffectCreate() has been fixed!
       
    • By Sidley
      Hello folks, I've been working on a couple of GDI+ gauges, they need a bit of polish here and there I'd appreciate it if you guys/girls could play around and give me some suggestions. Cheers.
       
      #Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Outfile=Gauges With Sliders.exe #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** #include <GUIConstants.au3> #include <GDIplus.au3> #include <ColorConstants.au3> #include <Array.au3> Global Const $width = @DesktopWidth * 3 / 4 Global Const $height = @DesktopHeight Global $title = "GDI+" ; Build your GUI here Opt("GUIOnEventMode", 1) Global $hwnd = GUICreate($title, @DesktopWidth, @DesktopHeight, -1, -1, $WS_SIZEBOX) GUISetOnEvent($GUI_EVENT_CLOSE, "close") GUISetState() #Region Sliders Global $VariableMaxValue = 100 Global $SecondaryMaxValue = 100 Global $VariableMinValue = 0 Global $HexLabel = GUICtrlCreateLabel("Hex Value: ", @DesktopWidth - 300, 50, 150, 20) GUICtrlSetColor($HexLabel, $COLOR_WHITE) GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER) Global $idSliderThick = GUICtrlCreateSlider(@DesktopWidth - 300, 100, 250, 20) GUICtrlSetLimit(-1, 240, 0) ; change min/max value GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER) Global $ThickLabel = GUICtrlCreateLabel("Thickness Value: " & GUICtrlRead($idSliderThick), @DesktopWidth - 300, 120, 150, 20) GUICtrlSetColor($ThickLabel, $COLOR_WHITE) GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER) Global $idSliderVal = GUICtrlCreateSlider(@DesktopWidth - 300, 150, 250, 20) GUICtrlSetLimit(-1, $VariableMaxValue, $VariableMinValue) ; change min/max value GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER) Global $ValLabel = GUICtrlCreateLabel("Variable Value: " & GUICtrlRead($idSliderVal), @DesktopWidth - 300, 170, 150, 20) GUICtrlSetColor($ValLabel, $COLOR_WHITE) GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER) Global $idSliderScale = GUICtrlCreateSlider(@DesktopWidth - 300, 200, 250, 20) GUICtrlSetLimit(-1, 20, 0) ; change min/max value GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER) Global $ScaleLabel = GUICtrlCreateLabel("Scale Value: " & (GUICtrlRead($idSliderScale) * .1), @DesktopWidth - 300, 220, 150, 20) GUICtrlSetColor($ScaleLabel, $COLOR_WHITE) GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER) Global $idStartAngleScale = GUICtrlCreateSlider(@DesktopWidth - 300, 250, 250, 20) GUICtrlSetLimit(-1, 360, 0) ; change min/max value GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER) Global $StartAngleLabel = GUICtrlCreateLabel("Angle Value: " & GUICtrlRead($idStartAngleScale), @DesktopWidth - 300, 270, 150, 20) GUICtrlSetColor($StartAngleLabel, $COLOR_WHITE) GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER) Global $idSweepScale = GUICtrlCreateSlider(@DesktopWidth - 300, 300, 250, 20) GUICtrlSetLimit(-1, 360, 0) ; change min/max value GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER) Global $SweepLabel = GUICtrlCreateLabel("Sweep Value: " & GUICtrlRead($idSweepScale), @DesktopWidth - 300, 320, 150, 20) GUICtrlSetColor($SweepLabel, $COLOR_WHITE) GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER) Global $idCheckmarksScale = GUICtrlCreateSlider(@DesktopWidth - 300, 350, 250, 20) GUICtrlSetLimit(-1, 20, 0) ; change min/max value GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER) Global $CheckmarkLabel = GUICtrlCreateLabel("No. of Checkmarks: " & GUICtrlRead($idCheckmarksScale), @DesktopWidth - 300, 370, 150, 20) GUICtrlSetColor($CheckmarkLabel, $COLOR_WHITE) GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER) Global $idVarMin = GUICtrlCreateSlider(@DesktopWidth - 300, 450, 250, 20) GUICtrlSetLimit(-1, 0, -50) ; change min/max value GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER) Global $MinLabel = GUICtrlCreateLabel("Min Value: " & GUICtrlRead($idVarMin), @DesktopWidth - 300, 470, 150, 20) GUICtrlSetColor($MinLabel, $COLOR_WHITE) GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER) Global $RadioGroup1 = GUICtrlCreateGroup("", @DesktopWidth - 300, 500, 200, 50) Global $clockwiseCtrl = GUICtrlCreateRadio("Clockwise", @DesktopWidth - 280, 520, 80, 20) GUICtrlSetState(-1, $GUI_CHECKED) GUICtrlSetColor(-1, $COLOR_WHITE) GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER) Global $antiClockwiseCtrl = GUICtrlCreateRadio("Anti-clockwise", @DesktopWidth - 200, 520, 85, 20) GUICtrlSetColor(-1, $COLOR_WHITE) GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER) Global $RadioGroup2 = GUICtrlCreateGroup("", @DesktopWidth - 300, 550, 200, 50) Global $RadialCtrl = GUICtrlCreateRadio("Radial", @DesktopWidth - 280, 570, 80, 20) GUICtrlSetState(-1, $GUI_CHECKED) GUICtrlSetColor(-1, $COLOR_WHITE) GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER) Global $SquareCtrl = GUICtrlCreateRadio("Linear", @DesktopWidth - 200, 570, 85, 20) GUICtrlSetColor(-1, $COLOR_WHITE) GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKVCENTER) GUICtrlSetData($idSliderThick, 35) GUICtrlSetData($idSliderScale, 10) GUICtrlSetData($idStartAngleScale, 180) GUICtrlSetData($idSweepScale, 180) GUICtrlSetData($idCheckmarksScale, 10) #EndRegion Sliders GUISetBkColor(0x303030) Global $aWindowSize = WinGetClientSize($hwnd) ; Load your GDI+ resources here: _GDIPlus_Startup() Global $graphics = _GDIPlus_GraphicsCreateFromHWND($hwnd) Global $bitmap = _GDIPlus_BitmapCreateFromGraphics($width, $height, $graphics) Global $backbuffer = _GDIPlus_ImageGetGraphicsContext($bitmap) While 1 _GDIPlus_GraphicsClear($backbuffer, 0xFF303030) Sleep(50) #Region Test Variables Global $Thickness = GUICtrlRead($idSliderThick) Global $Variable = GUICtrlRead($idSliderVal) Global $tValue = 0xFF000000 Global $rValue = 0x00FF0000 Global $gValue = BitShift((255 - (($Variable / $VariableMaxValue) * 255)), -8) Global $bValue = 0x00 Global $ScalingFactor = GUICtrlRead($idSliderScale) / 10 GUICtrlSetData($HexLabel, "Hex Value: " & HEX(BitOR($tValue, $rValue, $gValue, $bValue))) Global $PenColour = ("0x" & HEX(BitOR($tValue, $rValue, $gValue, $bValue))) GUICtrlSetData($ValLabel, "Variable Value: " & GUICtrlRead($idSliderVal)) GUICtrlSetData($ThickLabel, "Thickness Value: " & GUICtrlRead($idSliderThick)) GUICtrlSetData($ScaleLabel, "Scale Value: " & (GUICtrlRead($idSliderScale) * .1)) GUICtrlSetData($StartAngleLabel, "Angle Value: " & GUICtrlRead($idStartAngleScale)) GUICtrlSetData($SweepLabel, "Sweep Value: " & GUICtrlRead($idSweepScale)) GUICtrlSetData($CheckmarkLabel, "No. Of Checkmarks: " & GUICtrlRead($idCheckmarksScale)) GUICtrlSetData($MinLabel, "Min Value: " & GUICtrlRead($idVarMin)) GUICtrlSetLimit($idSliderVal, $VariableMaxValue, $VariableMinValue) Local $Radius = 300 If GUICtrlRead($clockwiseCtrl) = $GUI_CHECKED Then Local $Clockwise = True Else Local $Clockwise = False EndIf Local $StartAngle = GUICtrlRead($idStartAngleScale) Local $SweepAngle = GUICtrlRead($idSweepScale) Local $CentrePointX = 500 Local $CentrePointY = 500 Local $NoOfCheckmarks = GUICtrlRead($idCheckmarksScale) Local $CheckLength = 15 Local $AllowedLimit = 75 Local $VariableLimit = True Local $VariableMinValue = GUICtrlRead($idVarMin) #EndRegion Test Variables #Region Function Call If GUICtrlRead($RadialCtrl) = $GUI_CHECKED Then _GDIPlus_GraphicsDrawPath($backbuffer, _Gauges_DrawRadialGauge($backbuffer, $CentrePointX, $CentrePointY, $Radius, $Thickness, $Variable, $ScalingFactor, $Clockwise, $StartAngle, $SweepAngle, $VariableMaxValue, $NoOfCheckmarks, $CheckLength, $VariableLimit, $AllowedLimit, $VariableMinValue)) GUICtrlSetState($idSliderThick, $GUI_SHOW) GUICtrlSetState($ThickLabel, $GUI_SHOW) GUICtrlSetState($idStartAngleScale, $GUI_SHOW) GUICtrlSetState($StartAngleLabel, $GUI_SHOW) GUICtrlSetState($idSweepScale, $GUI_SHOW) GUICtrlSetState($SweepLabel, $GUI_SHOW) GUICtrlSetState($RadioGroup1, $GUI_SHOW) GUICtrlSetState($clockwiseCtrl, $GUI_SHOW) GUICtrlSetState($antiClockwiseCtrl, $GUI_SHOW) Else _GDIPlus_GraphicsDrawPath($backbuffer, _Gauges_DrawLinearGauge($backbuffer, $CentrePointX, $CentrePointY, 600, 100, $Variable, $ScalingFactor, $NoOfCheckmarks, $CheckLength, $VariableMaxValue, $VariableLimit, $AllowedLimit, $VariableMinValue)) GUICtrlSetState($idSliderThick, $GUI_HIDE) GUICtrlSetState($ThickLabel, $GUI_HIDE) GUICtrlSetState($idStartAngleScale, $GUI_HIDE) GUICtrlSetState($StartAngleLabel, $GUI_HIDE) GUICtrlSetState($idSweepScale, $GUI_HIDE) GUICtrlSetState($SweepLabel, $GUI_HIDE) GUICtrlSetState($RadioGroup1, $GUI_HIDE) GUICtrlSetState($clockwiseCtrl, $GUI_HIDE) GUICtrlSetState($antiClockwiseCtrl, $GUI_HIDE) EndIf #EndRegion Function Call _GDIPlus_GraphicsDrawImageRect($graphics, $bitmap, 0, 0, $width, $height) WEnd Func close() _GDIPlus_GraphicsDispose($backbuffer) _GDIPlus_BitmapDispose($bitmap) _GDIPlus_GraphicsDispose($graphics) _GDIPlus_Shutdown() Exit EndFunc ;==>close #Region Functions #Region Draw Linear Gauge ; #FUNCTION# ==================================================================================================================== ; Name...........: _Gauges_DrawLinearGauge ; Description ...: Creates a horizontal or vertical gauge in the graphics backbuffer ; Syntax.........: _Gauges_DrawLinearGauge(ByRef $backbuffer, $CentrePointX, $CentrePointY, $GaugeWidth, $GaugeHeight, $Variable, [$ScalingFactor = 1, [$NoOfCheckmarks = 6, [$CheckLength = 20, ; + [$VariableMaxValue = 256, [$VariableLimit = False, [$AllowedLimit = 0, [$VariableMinValue = 0]]]]]]] ) ; Parameters ....: $backbuffer - [byref] The graphics object to draw the gauge to. ; $CentrePointX - The horizontal coordinate of the centre of the gauge. ; $CentrePointY - The vertical coordinate of the centre of the gauge. ; $GaugeWidth - The width of the gauge (Duh). ; $GaugeHeight - The height of the gauge. ; $Variable - The variable used to change the gauge. ; $ScalingFactor - [optional] Scales the gauge by this factor. Default is 1, i.e. no scaling. ; $NoOfCheckmarks - [optional] The number of dashes indicating a scale around the gauge. Default is 6. ; $CheckLength - [optional] The length of the checkmarks in pixels. Default is 20. ; $VariableMaxValue - [optional] The maximum value of the variable. Default is 256. ; $VariableLimit - [optional] Boolean, if TRUE, displays a red limit indicator on the scale. Default is FALSE. ; $AllowedLimit -[optional] The value of the above limit if it is drawn. Default is 0. ; $VariableMinValue -[optional] The minimum value of the variable. Only used if negative numbers are required. Default is 0. ; Author ........: Simon Renardson (Sidley) ; Modified.......: ; Remarks .......: There is a more comprehensive function available, but I deemed it overkill for the majority of people. ; Related .......: _GDIPlus_ ; Example .......: Yes ; =============================================================================================================================== ;Draw a Linear gauge to the screen Func _Gauges_DrawLinearGauge(ByRef $backbuffer, $CentrePointX, $CentrePointY, $GaugeWidth, $GaugeHeight, $Variable, $ScalingFactor = 1, $NoOfCheckmarks = 6, $CheckLength = 20, $VariableMaxValue = 256, $VariableLimit = False, $AllowedLimit = 0, $VariableMinValue = 0) If $Variable >= 0 Then Local $BrushColour = ("0xFF4BF221") Else Local $BrushColour = ("0xFFFF0000") EndIf If $GaugeWidth >= $GaugeHeight Then Local $GaugeBrush = _GDIPlus_HatchBrushCreate(1, 0x00000000, $BrushColour) ;Set to vertical hatch if the gauge is horizontal Else Local $GaugeBrush = _GDIPlus_HatchBrushCreate(0, 0x00000000, $BrushColour) ;Set to horizontal hatch if the gauge is vertical EndIf Local $TextBrush = _GDIPlus_BrushCreateSolid($BrushColour) Local $Path = _GDIPlus_PathCreate() Local $hPen = _GDIPlus_PenCreate("0xFF96A29F", 2 * $ScalingFactor) ; Off-white pen for outlines Local $AllowedPen = _GDIPlus_PenCreate("0xFFFF0000", 8 * $ScalingFactor) ;Red pen for allowed speed indicators If $GaugeWidth >= $GaugeHeight Then ;If the gauge is to be length wise _GDIPlus_PathAddLine($Path, $CentrePointX - ((($GaugeWidth / 2) + $VariableMinValue * ($GaugeWidth / ($VariableMaxValue - $VariableMinValue))) * $ScalingFactor), ($CentrePointY + ($GaugeHeight / 2) * $ScalingFactor), $CentrePointX - ((($GaugeWidth / 2) + $VariableMinValue * ($GaugeWidth / ($VariableMaxValue - $VariableMinValue))) * $ScalingFactor) + ($Variable * ($GaugeWidth / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor), ($CentrePointY + ($GaugeHeight / 2) * $ScalingFactor)) _GDIPlus_PathAddLine($Path, $CentrePointX - ((($GaugeWidth / 2) + $VariableMinValue * ($GaugeWidth / ($VariableMaxValue - $VariableMinValue))) * $ScalingFactor) + ($Variable * ($GaugeWidth / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor), ($CentrePointY - ($GaugeHeight / 2) * $ScalingFactor), $CentrePointX - ((($GaugeWidth / 2) + $VariableMinValue * ($GaugeWidth / ($VariableMaxValue - $VariableMinValue))) * $ScalingFactor), ($CentrePointY - ($GaugeHeight / 2) * $ScalingFactor)) _GDIPlus_PathCloseFigure($Path) Else ;If the gauge is to be height wise _GDIPlus_PathAddLine($Path, ($CentrePointX + ($GaugeWidth / 2) * $ScalingFactor), ($CentrePointY + (($GaugeHeight / 2) * $ScalingFactor)) + ($VariableMinValue * ($GaugeHeight / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor), ($CentrePointX + ($GaugeWidth / 2) * $ScalingFactor), ($CentrePointY + (($GaugeHeight / 2) * $ScalingFactor)) + ($VariableMinValue * ($GaugeHeight / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor) - $Variable * ($GaugeHeight / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor) _GDIPlus_PathAddLine($Path, ($CentrePointX - ($GaugeWidth / 2) * $ScalingFactor), ($CentrePointY + (($GaugeHeight / 2) * $ScalingFactor)) + ($VariableMinValue * ($GaugeHeight / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor) - $Variable * ($GaugeHeight / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor, ($CentrePointX - ($GaugeWidth / 2) * $ScalingFactor), ($CentrePointY + (($GaugeHeight / 2) * $ScalingFactor)) + ($VariableMinValue * ($GaugeHeight / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor)) _GDIPlus_PathCloseFigure($Path) EndIf _GDIPlus_GraphicsFillPath($backbuffer, $Path, $GaugeBrush) ;Draw the gauge _DrawBar($backbuffer, $CentrePointX, $CentrePointY, $GaugeWidth, $GaugeHeight, $VariableMaxValue, $VariableMinValue, $hPen, $ScalingFactor) ;Draw the outline for the gauge _DrawLinearGaugeCheckMarks($backbuffer, $CentrePointX, $CentrePointY, $GaugeWidth, $GaugeHeight, $ScalingFactor, $VariableMaxValue, $NoOfCheckmarks, $CheckLength, $hPen) ;Draw the checkmarks for the gauge If $VariableLimit Then _DrawLinearAllowedSpeed($backbuffer, $CentrePointX, $CentrePointY, $GaugeWidth, $GaugeHeight, $VariableMaxValue, $AllowedLimit, $AllowedPen, $ScalingFactor, $VariableLimit) ;Draw the allowed speed indicator(s) for the gauge EndIf _LinearGaugeText($backbuffer, $Variable, $CentrePointX, $CentrePointY, $GaugeWidth, $GaugeHeight, $ScalingFactor, $TextBrush) ;Put the gauge text above the gauge _GDIPlus_PathDispose($Path) ;Tidy up _GDIPlus_BrushDispose($GaugeBrush) _GDIPlus_PenDispose($hPen) _GDIPlus_PenDispose($AllowedPen) _GDIPlus_BrushDispose($TextBrush) EndFunc ;==>_DrawLinearGauge ;Draw the text for the main gauge Func _LinearGaugeText(ByRef $backbuffer, $Variable, $CentrePointX, $CentrePointY, $GaugeWidth, $GaugeHeight, $ScalingFactor, ByRef $TextBrush) Local $FontSize = 80 * $ScalingFactor ;Linear gauge font size Local $Path = _GDIPlus_PathCreate() Local $Format = _GDIPlus_StringFormatCreate() Local $Family = _GDIPlus_FontFamilyCreate("Agency FB") ;Centre text font Local $Font = _GDIPlus_FontCreate($Family, $FontSize, 2) _GDIPlus_StringFormatSetAlign($Format, 2) ;Right align _GDIPlus_GraphicsSetSmoothingMode($backbuffer, 2) ;Change smoothing mode for text If $GaugeWidth >= $GaugeHeight Then Local $Layout = _GDIPlus_RectFCreate($CentrePointX - ($FontSize * $ScalingFactor / 2), $CentrePointY - ($GaugeHeight / 2 * $ScalingFactor) - $FontSize * 1.5 * $ScalingFactor) ;Set text position for inner text Else Local $Layout = _GDIPlus_RectFCreate($CentrePointX - ($GaugeWidth / 2) * $ScalingFactor - $FontSize * 2, ($CentrePointY - $FontSize * $ScalingFactor / 2)) ;Set text positionfor inner text EndIf _GDIPlus_PathAddString($Path, $Variable, $Layout, $Family, 0, $FontSize * $ScalingFactor) _GDIPlus_GraphicsFillPath($backbuffer, $Path, $TextBrush) $Layout = 0 _GDIPlus_PathDispose($Path) _GDIPlus_FontDispose($Font) _GDIPlus_StringFormatDispose($Format) _GDIPlus_FontFamilyDispose($Family) EndFunc ;==>_LinearGaugeText ;Draw the outline of the gauge Func _DrawBar(ByRef $backbuffer, $CentrePointX, $CentrePointY, $GaugeWidth, $GaugeHeight, $VariableMaxValue, $VariableMinValue, ByRef $hPen, $ScalingFactor = 1) Local $Path = _GDIPlus_PathCreate() _GDIPlus_PathAddLine($Path, $CentrePointX - ($GaugeWidth / 2) * $ScalingFactor, $CentrePointY - ($GaugeHeight / 2) * $ScalingFactor, $CentrePointX + ($GaugeWidth / 2) * $ScalingFactor, $CentrePointY - ($GaugeHeight / 2) * $ScalingFactor) _GDIPlus_PathAddLine($Path, $CentrePointX + ($GaugeWidth / 2) * $ScalingFactor, $CentrePointY + ($GaugeHeight / 2) * $ScalingFactor, $CentrePointX - ($GaugeWidth / 2) * $ScalingFactor, $CentrePointY + ($GaugeHeight / 2) * $ScalingFactor) _GDIPlus_PathCloseFigure($Path) If $GaugeWidth >= $GaugeHeight Then _GDIPlus_GraphicsDrawLine($backbuffer, $CentrePointX - ($GaugeWidth / 2 * $ScalingFactor) - $VariableMinValue * ($GaugeWidth / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor, $CentrePointY - ($GaugeHeight / 2) * $ScalingFactor, $CentrePointX - ($GaugeWidth / 2 * $ScalingFactor) - $VariableMinValue * ($GaugeWidth / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor, $CentrePointY + ($GaugeHeight / 2) * $ScalingFactor, $hPen) Else _GDIPlus_GraphicsDrawLine($backbuffer, $CentrePointX - ($GaugeWidth / 2 * $ScalingFactor), ($CentrePointY + (($GaugeHeight / 2) * $ScalingFactor)) + ($VariableMinValue * ($GaugeHeight / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor), $CentrePointX + ($GaugeWidth / 2 * $ScalingFactor), ($CentrePointY + (($GaugeHeight / 2) * $ScalingFactor)) + ($VariableMinValue * ($GaugeHeight / ($VariableMaxValue - $VariableMinValue)) * $ScalingFactor), $hPen) EndIf _GDIPlus_GraphicsDrawPath($backbuffer, $Path, $hPen) ;Draw the outline _GDIPlus_PathDispose($Path) EndFunc ;==>_DrawBar ;Draw the checkmarks Func _DrawLinearGaugeCheckMarks(ByRef $backbuffer, $CentrePointX, $CentrePointY, $GaugeWidth, $GaugeHeight, $ScalingFactor, $VariableMaxValue, $NoOfCheckmarks, $CheckLength, ByRef $hPen) Local $TextBrush = _GDIPlus_BrushCreateSolid("0xFFFFFFFF") ;Solid white brush for the checkmarks Local $aPoints[$NoOfCheckmarks][2] ;Two cartesian coordinates for each checkmark Local $aMarkText[$NoOfCheckmarks] ; The text for each checkmark ;Create the font for the checkmarks Local $FontSize = 15 * $ScalingFactor ;The font size (Scaled) Local $Format = _GDIPlus_StringFormatCreate() Local $Family = _GDIPlus_FontFamilyCreate("Agency FB") Local $Font = _GDIPlus_FontCreate($Family, $FontSize, 2) For $i = 0 to($NoOfCheckmarks - 1) $aMarkText[$i] = Round($VariableMinValue + (($VariableMaxValue - $VariableMinValue) / ($NoOfCheckmarks - 1)) * $i) Next If $GaugeWidth >= $GaugeHeight Then _GDIPlus_GraphicsDrawLine($backbuffer, $CentrePointX - ($GaugeWidth / 2) * $ScalingFactor, $CentrePointY - ($GaugeHeight / 2 + 10) * $ScalingFactor, $CentrePointX + ($GaugeWidth / 2) * $ScalingFactor, $CentrePointY - ($GaugeHeight / 2 + 10) * $ScalingFactor, $hPen) For $i = 0 to($NoOfCheckmarks - 1) ;Set the coordinates of each checkmark $aPoints[$i][0] = ($CentrePointX - ($GaugeWidth / 2) * $ScalingFactor) + ($GaugeWidth * $ScalingFactor / ($NoOfCheckmarks - 1)) * $i ;Set x position depending on the number of checkmarks and the length of the gauge $aPoints[$i][1] = $CentrePointY - ($GaugeHeight / 2 + 10) * $ScalingFactor ;Height remains uniform Next For $i = 0 to($NoOfCheckmarks - 1) _GDIPlus_GraphicsDrawLine($backbuffer, $aPoints[$i][0], $aPoints[$i][1], $aPoints[$i][0], ($aPoints[$i][1] - $CheckLength * $ScalingFactor), $hPen) ;Draw a line $Checklength long $Layout = _GDIPlus_RectFCreate(($aPoints[$i][0] - $FontSize), ($aPoints[$i][1] - $CheckLength * $ScalingFactor - ($FontSize * 1.5) * $ScalingFactor), 0, 0) _GDIPlus_GraphicsDrawStringEx($backbuffer, $aMarkText[$i], $Font, $Layout, $Format, $TextBrush) ;Draw the sext for the checkmark Next Else _GDIPlus_GraphicsDrawLine($backbuffer, $CentrePointX - ($GaugeWidth / 2 * $ScalingFactor) - 10 * $ScalingFactor, $CentrePointY + ($GaugeHeight / 2) * $ScalingFactor, $CentrePointX - ($GaugeWidth / 2 * $ScalingFactor) - 10 * $ScalingFactor, $CentrePointY - ($GaugeHeight / 2) * $ScalingFactor, $hPen) For $i = 0 to($NoOfCheckmarks - 1) $aPoints[$i][0] = $CentrePointX - ($GaugeWidth / 2 + 10) * $ScalingFactor $aPoints[$i][1] = ($CentrePointY + ($GaugeHeight / 2) * $ScalingFactor) - ($GaugeHeight * $ScalingFactor / ($NoOfCheckmarks - 1)) * $i Next For $i = 0 to($NoOfCheckmarks - 1) _GDIPlus_GraphicsDrawLine($backbuffer, $aPoints[$i][0], $aPoints[$i][1], $aPoints[$i][0] - $CheckLength * $ScalingFactor, $aPoints[$i][1], $hPen) $Layout = _GDIPlus_RectFCreate(($aPoints[$i][0] - $CheckLength * $ScalingFactor - $FontSize * 2.5), $aPoints[$i][1] - $FontSize / 1.5, 0, 0) _GDIPlus_GraphicsDrawStringEx($backbuffer, $aMarkText[$i], $Font, $Layout, $Format, $TextBrush) Next EndIf $Layout = 0 _GDIPlus_BrushDispose($TextBrush) _GDIPlus_FontDispose($Font) _GDIPlus_StringFormatDispose($Format) _GDIPlus_FontFamilyDispose($Family) EndFunc ;==>_DrawLinearGaugeCheckMarks Func _DrawLinearAllowedSpeed(ByRef $backbuffer, $CentrePointX, $CentrePointY, $GaugeWidth, $GaugeHeight, $MaxValue, $AllowedLimit, ByRef $AllowedPen, $ScalingFactor, $PrimaryAllowedSpeed) Local $Path = _GDIPlus_PathCreate() If $PrimaryAllowedSpeed Then If $GaugeWidth >= $GaugeHeight Then _GDIPlus_PathAddLine($Path, $CentrePointX - ($GaugeWidth / 2) * $ScalingFactor, $CentrePointY - ($GaugeHeight / 2 + 15) * $ScalingFactor + 3 * $ScalingFactor, ($CentrePointX - (($GaugeWidth / 2) * $ScalingFactor)) + ($GaugeWidth * $AllowedLimit / 100 * $ScalingFactor), $CentrePointY - ($GaugeHeight / 2 + 15) * $ScalingFactor + 3 * $ScalingFactor) Else _GDIPlus_PathAddLine($Path, $CentrePointX - ($GaugeWidth / 2) * $ScalingFactor - 10 * $ScalingFactor, $CentrePointY + ($GaugeHeight / 2) * $ScalingFactor, $CentrePointX - ($GaugeWidth / 2) * $ScalingFactor - 10 * $ScalingFactor, ($CentrePointY + ($GaugeHeight / 2) * $ScalingFactor) - ($GaugeHeight * $AllowedLimit / 100 * $ScalingFactor)) EndIf EndIf _GDIPlus_GraphicsDrawPath($backbuffer, $Path, $AllowedPen) _GDIPlus_PathDispose($Path) EndFunc ;==>_DrawLinearAllowedSpeed #EndRegion Draw Linear Gauge #Region Draw Radial Gauge ; #FUNCTION# ==================================================================================================================== ; Name...........: _Gauges_DrawRadialGauge ; Description ...: Creates a radial gauge in the graphics backbuffer ; Syntax.........: _Gauges_DrawRadialGauge(ByRef $backbuffer, $CentrePointX, $CentrePointY, $Radius, $Thickness, $Variable, $ScalingFactor = 1, $Clockwise = True, $StartAngle = 0, ; + $SweepAngle = 180, $NoOfCheckmarks = 6, $CheckLength = 20, $VariableMaxValue = 256, $VariableLimit = True, $AllowedLimit = 0, $VariableMinValue = 0) ; Parameters ....: $backbuffer - [byref] The graphics object to draw the gauge to. ; $CentrePointX - The horizontal coordinate of the centre of the gauge. ; $CentrePointY - The vertical coordinate of the centre of the gauge. ; $Radius - The radius of the outer edge of the gauge. ; $Thickness - The thickness of the gauge in pixels. ; $Variable - The variable used to change the gauge. ; $ScalingFactor - [optional] Scales the gauge by this factor. Default is 1, i.e. no scaling. ; $Clockwise - [optional] Boolean, determines whether the gauge fills clockwise or anti-clockwise. Default is TRUE, i.e. clockwise. ; $StartAngle - [optional] The starting angle of the gauge. Default is 0 (East). ; $SweepAngle - [optional] The sweep angle of the gauge (How many degrees it rotates through). The default is 180. ; $NoOfCheckmarks - [optional] The number of dashes indicating a scale around the gauge. Default is 6. ; $CheckLength - [optional] The length of the checkmarks in pixels. Default is 20. ; $VariableMaxValue - [optional] The maximum value of the variable. Default is 256. ; $VariableLimit - [optional] Boolean, if TRUE, displays a red limit indicator on the scale. Default is FALSE. ; $AllowedLimit -[optional] The value of the above limit if it is drawn. Default is 0. ; $VariableMinValue -[optional] The minimum value of the variable. Only used if negative numbers are required. Default is 0. ; Author ........: Simon Renardson (Sidley) ; Modified.......: ; Remarks .......: There is a more comprehensive function available, but I deemed it overkill for the majority of people. ; Related .......: _GDIPlus_ ; Example .......: Yes ; =============================================================================================================================== ;Draw Gauge (Speed/Load Level) ;Creates Completed Radial Gauge ;~ _DrawRadialGauge($CentrePointX, $CentrePointY, $Radius, $Thickness, $Variable, [$ScalingFactor = 1, [$Clockwise = True, [$StartAngle = 0, [$SweepAngle = 180, [$MaxValue = 256, [$NoOfCheckmarks = 10, [$CheckLength = 20]]]]]]]) Func _Gauges_DrawRadialGauge(ByRef $backbuffer, $CentrePointX, $CentrePointY, $Radius, $Thickness, $Variable, $ScalingFactor = 1, $Clockwise = True, $StartAngle = 0, $SweepAngle = 180, $NoOfCheckmarks = 6, $CheckLength = 20, $VariableMaxValue = 256, $VariableLimit = True, $AllowedLimit = 0, $VariableMinValue = 0) Local $BrushColour = ("0x" & HEX(BitOR(0xFFFF0000, BitShift((255 - (($Variable / $VariableMaxValue) * 255)), -8)))) Local $GaugeBrush = _GDIPlus_HatchBrushCreate(39, 0xFF000000, $BrushColour) Local $TextBrush = _GDIPlus_BrushCreateSolid($BrushColour) Local $Path = _GDIPlus_PathCreate() Local $hPen = _GDIPlus_PenCreate("0xFF96A29F", 2 * $ScalingFactor) ;Pen colour Local $AllowedPen = _GDIPlus_PenCreate("0xFFFF0000", 10 * $ScalingFactor) _GDIPlus_GraphicsSetSmoothingMode($backbuffer, 2) ;TODO may need to be removed If $Clockwise Then ;If clockwise rotation _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), $StartAngle - $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue)), $Variable * $SweepAngle / ($VariableMaxValue - $VariableMinValue)) ;Add outer arc of gauge $Radius -= ($Thickness * $ScalingFactor) ;Reduce radius for inner arc by the thickness of the gauge _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), $StartAngle - $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue)) + ($Variable * $SweepAngle / ($VariableMaxValue - $VariableMinValue)), (-1 * $Variable * $SweepAngle / ($VariableMaxValue - $VariableMinValue))) ;Add inner arc of Gauge Else ;If anti-clockwise rotation _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), $StartAngle + $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue)), (-1 * $Variable * $SweepAngle / ($VariableMaxValue - $VariableMinValue))) ;Add outer arc of gauge $Radius -= ($Thickness * $ScalingFactor) ;Reduce radius for inner arcby the thickness of the gauge _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), $StartAngle + $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue)) - ($Variable * $SweepAngle / ($VariableMaxValue - $VariableMinValue)), $Variable * $SweepAngle / ($VariableMaxValue - $VariableMinValue)) ;Add inner arc of Gauge EndIf $Radius += ($Thickness * $ScalingFactor) ;Return radius to original size _GDIPlus_PathCloseFigure($Path) ;Close the two arcs _GDIPlus_GraphicsFillPath($backbuffer, $Path, $GaugeBrush) ;Fill the gauge and centre text with colour _DrawRadialGaugeText($backbuffer, $Variable, $CentrePointX, $CentrePointY, $Clockwise, $Radius, $ScalingFactor, $TextBrush) ;Draw the centre text _DrawGaugeOutline($backbuffer, $CentrePointX, $CentrePointY, $Radius, $VariableMaxValue, $VariableMinValue, $Thickness, $ScalingFactor, $Clockwise, $StartAngle, $SweepAngle, $hPen) ;Draw the gauge outline _DrawIndicators($backbuffer, $CentrePointX, $CentrePointY, $Radius, $Thickness, $Clockwise, $ScalingFactor, $StartAngle, $SweepAngle, $hPen, True) ;Draw scale arc _DrawCheckMarks($backbuffer, $CentrePointX, $CentrePointY, $Radius, $Thickness, $ScalingFactor, $VariableMaxValue, $NoOfCheckmarks, $CheckLength, $StartAngle, $SweepAngle, $hPen, True) ;Draw scale checkmarks If $VariableLimit Then _DrawRadialAllowedSpeed($backbuffer, $CentrePointX, $CentrePointY, $Radius, $Thickness, $Clockwise, $ScalingFactor, $StartAngle, $SweepAngle, $AllowedLimit, $AllowedPen, True) ;Draw allowed speed limits EndIf _GDIPlus_PathDispose($Path) ;Tidy up _GDIPlus_BrushDispose($GaugeBrush) _GDIPlus_BrushDispose($TextBrush) _GDIPlus_PenDispose($hPen) _GDIPlus_PenDispose($AllowedPen) EndFunc ;==>_DrawRadialGauge ;Draw Variable Value (Text, Load/Speed Value) ;Creates The Centre Text of the Radial Gauge ;~ Func _DrawRadialGaugeText($ValueText, $CentrePointX, $CentrePointY, $Clockwise, $Radius, $ScalingFactor) Func _DrawRadialGaugeText(ByRef $backbuffer, $ValueText, $CentrePointX, $CentrePointY, $Clockwise, $Radius, $ScalingFactor, ByRef $TextBrush) Local $FontSize = 180 * $ScalingFactor ;Default font size (Scaled) Local $Text = _GDIPlus_PathCreate() Local $Format = _GDIPlus_StringFormatCreate() _GDIPlus_StringFormatSetAlign($Format, 2) ;Align right (Doesn't seem to make a difference) Local $Family = _GDIPlus_FontFamilyCreate("Agency FB") ;Centre text font Local $Font = _GDIPlus_FontCreate($Family, $FontSize, 2) Local $Layout = _GDIPlus_RectFCreate($CentrePointX - ($FontSize / 1.3) * $ScalingFactor, $CentrePointY - $FontSize * $ScalingFactor / 2) ;Set position (Top left) _GDIPlus_PathAddString($Text, Round($ValueText, 1), $Layout, $Family, 0, $FontSize * $ScalingFactor) ;Add value to path (To 1 decimal place) _GDIPlus_GraphicsFillPath($backbuffer, $Text, $TextBrush) $Layout = 0 ;Tidy up _GDIPlus_PathDispose($Text) _GDIPlus_FontDispose($Font) _GDIPlus_StringFormatDispose($Format) _GDIPlus_FontFamilyDispose($Family) EndFunc ;==>_DrawRadialGaugeText ;Draw Gauge Outline ;Creates the Outline of the Radial Gauge ;~ Func _DrawGaugeOutline($CentrePointX, $CentrePointY, $Radius, $Thickness, $ScalingFactor, $Clockwise, $StartAngle, $SweepAngle) Func _DrawGaugeOutline(ByRef $backbuffer, $CentrePointX, $CentrePointY, $Radius, $VariableMaxValue, $VariableMinValue, $Thickness, $ScalingFactor, $Clockwise, $StartAngle, $SweepAngle, ByRef $hPen) Local $Path = _GDIPlus_PathCreate() Local Const $PI = 3.141592653589793 $Radius += 2 ;Put the outline 2 px outside the gauge If $Clockwise Then ;If the gauge is to be filled clockwise _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), $StartAngle, $SweepAngle) _GDIPlus_GraphicsDrawLine($backbuffer, $CentrePointX + ($Radius * $ScalingFactor * Cos(($PI / 180) * ($StartAngle - $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue))))), $CentrePointY + ($Radius * $ScalingFactor * Sin(($PI / 180) * ($StartAngle - $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue))))), $CentrePointX + (($Radius - ($Thickness * $ScalingFactor) - (4 * $ScalingFactor)) * Cos(($PI / 180) * ($StartAngle - $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue)))) * $ScalingFactor), $CentrePointY + (($Radius - ($Thickness * $ScalingFactor) - 4) * $ScalingFactor * Sin(($PI / 180) * ($StartAngle - $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue))))), $hPen) $Radius -= ($Thickness * $ScalingFactor) ;Reduce radius for inner arc $Radius -= 4 _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), ($StartAngle + $SweepAngle), -$SweepAngle) Else _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), $StartAngle, -$SweepAngle) _GDIPlus_GraphicsDrawLine($backbuffer, $CentrePointX + ($Radius * $ScalingFactor * Cos(($PI / 180) * ($StartAngle + $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue))))), $CentrePointY + ($Radius * $ScalingFactor * Sin(($PI / 180) * ($StartAngle + $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue))))), $CentrePointX + (($Radius - ($Thickness * $ScalingFactor) - (4 * $ScalingFactor)) * Cos(($PI / 180) * ($StartAngle + $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue)))) * $ScalingFactor), $CentrePointY + (($Radius - ($Thickness * $ScalingFactor) - 4) * $ScalingFactor * Sin(($PI / 180) * ($StartAngle + $VariableMinValue * ($SweepAngle / ($VariableMaxValue - $VariableMinValue))))), $hPen) $Radius -= ($Thickness * $ScalingFactor) ;Reduce radius for inner arc $Radius -= 4 _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), $StartAngle - $SweepAngle, $SweepAngle) EndIf _GDIPlus_PathCloseFigure($Path) ;Close the path _GDIPlus_GraphicsDrawPath($backbuffer, $Path, $hPen) ;Draw the path _GDIPlus_PathDispose($Path) EndFunc ;==>_DrawGaugeOutline ;Draw Scale(s) ;Creates a number of indicative markings around the centre of the radial gauge ;~ Func _DrawIndicators($CentrePointX, $CentrePointY, $Radius, $Thickness, $Clockwise, $ScalingFactor, $StartAngle, $SweepAngle) Func _DrawIndicators(ByRef $backbuffer, $CentrePointX, $CentrePointY, $Radius, $Thickness, $Clockwise, $ScalingFactor, $StartAngle, $SweepAngle, ByRef $hPen, $Inside) Local $Path = _GDIPlus_PathCreate() $Radius -= ($Thickness + 20) * $ScalingFactor If $Clockwise Then _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), $StartAngle, $SweepAngle) Else ;Doesn't make much difference, but it will be 180 degrees out _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), $StartAngle, -$SweepAngle) EndIf _GDIPlus_GraphicsDrawPath($backbuffer, $Path, $hPen) _GDIPlus_PathDispose($Path) EndFunc ;==>_DrawIndicators ;Draw the allowed speed marker Func _DrawRadialAllowedSpeed(ByRef $backbuffer, $CentrePointX, $CentrePointY, $Radius, $Thickness, $Clockwise, $ScalingFactor, $StartAngle, $SweepAngle, _ $AllowedLimit, ByRef $AllowedPen, $Inside) Local $Path = _GDIPlus_PathCreate() $Radius -= ($Thickness + 24) * $ScalingFactor If $Clockwise Then ;Display in a clockwise direction _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), $StartAngle, $SweepAngle * $AllowedLimit / 100) ElseIf NOT $Clockwise Then ;Display in an anti-clockwise direction _GDIPlus_PathAddArc($Path, ($CentrePointX - ($Radius * $ScalingFactor)), ($CentrePointY - ($Radius * $ScalingFactor)), ($Radius * $ScalingFactor * 2), ($Radius * $ScalingFactor * 2), $StartAngle, -$SweepAngle * $AllowedLimit / 100) EndIf _GDIPlus_GraphicsDrawPath($backbuffer, $Path, $AllowedPen) ;Draw with the red pen ($AllowedPen) _GDIPlus_PathDispose($Path) EndFunc ;==>_DrawRadialAllowedSpeed ;DrawCheckmarks (Checkmarks) ;Creates the checkmarks and text around the indicator gauge ;~ Func _DrawCheckMarks($CentrePointX, $CentrePointY, $Radius, $Thickness, $ScalingFactor, $MaxValue, $NoOfCheckmarks, $CheckLength, $StartAngle, $SweepAngle, $hPen) Func _DrawCheckMarks(ByRef $backbuffer, $CentrePointX, $CentrePointY, $Radius, $Thickness, $ScalingFactor, $VariableMaxValue, $NoOfCheckmarks, $CheckLength, $StartAngle, _ $SweepAngle, ByRef $hPen, $Inside) Local Const $PI = 3.141592653589793 Local $TextBrush = _GDIPlus_BrushCreateSolid("0xFFFFFFFF") Local $aPoints[$NoOfCheckmarks][4] ;Creates an array of four points for each check line Local $aMarkText[$NoOfCheckmarks] ;Creates the text for the checkmarks $Radius -= ($Thickness + 20) * $ScalingFactor For $i = 0 to ($NoOfCheckmarks-1) $aMarkText[$i] = Round((($VariableMaxValue - $VariableMinValue) / ($NoOfCheckmarks - 1)) * $i) + $VariableMinValue ;Round checkmark values to one decimal place Next Local $aAngles[$NoOfCheckmarks] = [] ;Create an array to hold the angles at which the checkmarks should be If $Clockwise Then For $i = 0 to($NoOfCheckmarks - 1) $aAngles[$i] = $StartAngle + (($SweepAngle / ($NoOfCheckmarks - 1)) * $i) ;Spread out checkmarks evenly over the gauge Next Else ;For anticlockwise filling gauge For $i = 0 to($NoOfCheckmarks - 1) $aAngles[$i] = $StartAngle - (($SweepAngle / ($NoOfCheckmarks - 1)) * $i) ;Spread out checkmarks evenly over the gauge Next EndIf For $i = 0 to($NoOfCheckmarks - 1) $aAngles[$i] = $aAngles[$i] * $PI / 180 ;Convert degrees to radians $aPoints[$i][0] = $CentrePointX + ($Radius * Cos($aAngles[$i]) * $ScalingFactor) ;Create cartesian coordinates for the check lines from polar coordinates (Radius, angle) $aPoints[$i][1] = $CentrePointY + ($Radius * Sin($aAngles[$i]) * $ScalingFactor) $aPoints[$i][2] = $CentrePointX + (($Radius - ($CheckLength * $ScalingFactor)) * Cos($aAngles[$i]) * $ScalingFactor) $aPoints[$i][3] = $CentrePointY + (($Radius - ($CheckLength * $ScalingFactor)) * Sin($aAngles[$i]) * $ScalingFactor) Next ;Font data for checkmark text Local $Format = _GDIPlus_StringFormatCreate() Local $Family = _GDIPlus_FontFamilyCreate("Agency FB") Local $FontSize = 15 Local $Font = _GDIPlus_FontCreate($Family, $FontSize * $ScalingFactor, 2) For $i = 0 to($NoOfCheckmarks - 1) ;For each checkmark _GDIPlus_GraphicsDrawLine($backbuffer, $aPoints[$i][0], $aPoints[$i][1], $aPoints[$i][2], $aPoints[$i][3], $hPen) ;Draw the lines $Layout = _GDIPlus_RectFCreate($aPoints[$i][2] - ($FontSize * Cos($aAngles[$i])) - (18 * $ScalingFactor), $aPoints[$i][3] - ($FontSize * Sin($aAngles[$i]) + 10), 0, 0) _GDIPlus_GraphicsDrawStringEx($backbuffer, $aMarkText[$i], $Font, $Layout, $Format, $TextBrush) Next $Layout = 0 _GDIPlus_BrushDispose($TextBrush) _GDIPlus_FontDispose($Font) _GDIPlus_StringFormatDispose($Format) _GDIPlus_FontFamilyDispose($Family) EndFunc ;==>_DrawCheckMarks #EndRegion Draw Radial Gauge #EndRegion Functions  
    • By Valiante
      I'm creating a tool which automatically saves screenshots.  I've found that some images appear corrupt after saving.  I've narrowed the source down to screenshots taken from within an RDP session via the Ctrl+Alt+Plus (PrtScn equivalent) and Ctrl+Alt+Minus (Alt+PrtScn equivalent) key combos.
      Here is the example code:
      #include <ClipBoard.au3> #include <GDIPlus.au3> If _ClipBoard_IsFormatAvailable($CF_BITMAP) Then ConsoleWrite("+Bitmap found on Clipboard" & @CRLF) If Not _ClipBoard_Open(0) Then MsgBox(16, "Error", "_ClipBoard_Open failed") Exit EndIf $hClipboardImage = _ClipBoard_GetDataEx($CF_BITMAP) _ClipBoard_Close() _GDIPlus_Startup() $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hClipboardImage) $sCLSID = _GDIPlus_EncodersGetCLSID("JPG") _GDIPlus_ImageSaveToFileEx($hBitmap, @ScriptDir & "\" & TimerInit() & "_Clipboard_Image.jpg", $sCLSID, 0) _GDIPlus_BitmapDispose($hBitmap) _GDIPlus_Shutdown() Else MsgBox(48, @ScriptName, "No Bitmap found on Clipboard") EndIf If you copy a local window to the clipboard via Alt+PrtScn the above works fine.  If you copy a window in an RDP session via Ctrl+Alt+Minus it saves the image, but the left-hand edge appears to contain a few pixels sliced off the right-hand side of the bitmap (see two attached images for examples; one good, one bad).  If you paste directly into MSPaint, the image appears correctly, so the clipboard contents is good. It seems to be the process of converting the bitmap handle to an image file via GDIPlus which corrupts it (though I may be wrong about this).
      I've tried inspecting the contents of the clipboard via the _ClipBoard_EnumFormats example and I've noticed the clipboard from the RDP session contains a couple more formats;
      Local:
      Clipboard formats ..: 3 Clipboard format 1 .: Bitmap Clipboard format 2 .: DIB Clipboard format 3 .: DIB V5 RDP:
      Clipboard formats ..: 5 Clipboard format 1 .: DataObject Clipboard format 2 .: DIB Clipboard format 3 .: DIB V5 Clipboard format 4 .: Ole Private Data Clipboard format 5 .: Bitmap However the _ClipBoard_GetDataEx function is specifying the $CF_BITMAP constant for the format, which both instances contain, so I'm not sure the extra formats have any impact?
      I've tried using a combination of _ClipBoard_GetDataEx($CF_DIB) and _GDIPlus_BitmapCreateFromMemory in an effort to write the binary directly to a file, instead of using a bitmap handle, however this doesn't appear to work and just returns a zero and doesn't set @error to anything, which isn't covered in the help file (a failure should return a zero and set the @error level to something).
      I've hunted around the forums and tried everything I can think of. I can normally figure most things out without posting but I've been dipping in and out of this script for a few months now and have finally thrown in the towel and must ask you guys for help, which isn't a decision I take lightly.  Your help is, as always, greatly appreciated.


    • By timmy2
      The following script, thanks largely to @UEZ, displays the attached PNG image on the Windows Desktop.

      It perfectly renders the sticky note's shadow over whatever's in the background.
      But here's the catch: I would like to add a line of text, fetched from a variable and using a font of my choice, atop the sticky note. It needs to be part of the same GUI because the sticky note can be dragged and placed anywhere on the screen.
      Will someone here show me how to add just the additional code needed to accomplish my goal? I have tried sporadically for two years to merge in code from scripts that use GDI+ calls to display text over alpha channels but the challenge has proven beyond me.
      #include <ButtonConstants.au3> #include <MsgBoxConstants.au3> #include <StructureConstants.au3> #include <WinAPIConstants.au3> #include <GDIPlus.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <WinAPISysWin.au3> _GDIPlus_Startup() Global Const $SC_DRAGMOVE = 0xF012 Global $iW, $iH, $hImage, $hBitmap, $hGUI $hImage = _GDIPlus_BitmapCreateFromFile("Using-Note.png") $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage) $iW = _GDIPlus_ImageGetWidth($hImage) $iH = _GDIPlus_ImageGetHeight($hImage) $hGUI = GUICreate("", $iW, $iH, -1, -1, $WS_POPUP, BitOR($WS_EX_LAYERED,$WS_EX_TOPMOST)) GUISetState() _WinAPI_BitmapDisplayTransparentInGUI($hBitmap, $hGUI) GUIRegisterMsg($WM_LBUTTONDOWN, "_WM_LBUTTONDOWN") Do Until GUIGetMsg() = $GUI_EVENT_CLOSE _WinAPI_DeleteObject($hBitmap) _GDIPlus_BitmapDispose($hImage) _GDIPlus_Shutdown() GUIDelete() Func _WinAPI_BitmapDisplayTransparentInGUI(ByRef $hHBitmap, ByRef $hGUI, $iOpacity = 0xFF, $bReleaseGDI = True) If Not BitAND(GUIGetStyle($hGUI)[1], $WS_EX_LAYERED) = $WS_EX_LAYERED Then Return SetError(1, 0, 0) Local $tDim = DllStructCreate($tagBITMAP) If Not _WinAPI_GetObject($hHBitmap, DllStructGetSize($tDim), DllStructGetPtr($tDim)) Then Return SetError(2, 0, 0) Local $tSize = DllStructCreate($tagSIZE), $tSource = DllStructCreate($tagPOINT), $tBlend = DllStructCreate($tagBLENDFUNCTION) Local Const $hScrDC = _WinAPI_GetDC(0), $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC), $hOld = _WinAPI_SelectObject($hMemDC, $hHBitmap) $tSize.X = $tDim.bmWidth $tSize.Y = $tDim.bmHeight $tBlend.Alpha = $iOpacity $tBlend.Format = 1 _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, DllStructGetPtr($tSize), $hMemDC, DllStructGetPtr($tSource), 0, DllStructGetPtr($tBlend), $ULW_ALPHA) _WinAPI_ReleaseDC(0, $hScrDC) _WinAPI_SelectObject($hMemDC, $hOld) _WinAPI_DeleteDC($hMemDC) If $bReleaseGDI Then _WinAPI_DeleteObject($hHBitmap) Return True EndFunc Func _WM_LBUTTONDOWN($hWnd, $iMsg, $wParam, $lParam) _SendMessage($hGUI, $WM_SYSCOMMAND, $SC_DRAGMOVE, 0) EndFunc ;==>_WM_LBUTTONDOWN  
×
×
  • Create New...