Jump to content

Hilfiker / MobaTime Swiss Railway Clock build 2019-07-07


UEZ
 Share

Recommended Posts

That's pretty amazing.  Thanks for posting.  It's mesmerizing to watch ... the smooth movement ... the shadow effects ... the slight bounce effect on the minute hand.  Excellent!

But I'm curious: do the real railway clocks have the momentary pause at :00?

Link to comment
Share on other sites

@qwert I was never in Switzerland but  this shows the clock

 

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!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Link to comment
Share on other sites

Indeed! ... and there's more to the story:

Quote

"The design of Swiss Railway Clock is very interesting."

Another YouTube link led me to this.  (... where you have to SHOW MORE)

Maybe it's widely known ... but I never knew of such a system.

Thanks.

Edited by qwert
Link to comment
Share on other sites

Made some small modifications and added brushed steel texture for the clock frame . Thanks to Eukalyptus for the _CreateBrushedAluminum() function.

For those who are interested, have a look to post #1.

 

Btw, if you are running lower AutoIt version than  3.3.14.3, it will crash in x64 mode due to the bug in _GDIPlus_EffectCreate()!

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!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Link to comment
Share on other sites

  • 2 weeks later...

Nice work, an impressive demonstration of the capabilities of autoit,  i've just implemented a popup style windows (without borders) witch can be moved and a context menu with exit and about, if someone knows how we can cancel the white square of the popup (transparency does'nt work) it would be interresting for exemple...

;the Hilfiker / MobaTime Swiss Railway Clock
;coded by UEZ build 2018-02-16
;thanks to Eukalyptus for the _CreateBrushedAluminum() function!

#pragma compile(Icon, "c:\Program Files (x86)\AutoIt3\Icons\au3.ico")
#AutoIt3Wrapper_Run_Au3Stripper=y
#Au3Stripper_Parameters=/so /pe /rm
#AutoIt3Wrapper_Run_After=del /f /q "%scriptdir%\%scriptfile%_stripped.au3"
#AutoIt3Wrapper_UseX64=n

#include <GDIPlus.au3>
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <SendMessage.au3> ;---------------------------added by margforce----------------------

_GDIPlus_Startup()
Global $hGUI, $iFPS = 0, $iShowFPS = 0, $bExit
Global Const $iW = 500, $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
Global $fMin_next, $hDC, $hCanvas, $hBitmap_Clock, $fDiameter, $hDC_backbuffer, $fShadowAngle
Global Const $SC_DRAGMOVE = 0xF012
Global Const $margin = 12; distance from edge of window where dragging is possible---------------------------added by margforce----------------------

AutoItSetOption("GUIOnEventMode", 1)

GDIPlus_SwissRailwayClock()

AutoItSetOption("GUIOnEventMode", 0)
_GDIPlus_Shutdown()

;---------------------------added by margforce----------------------
GUIRegisterMsg($WM_LBUTTONDOWN, "WM_LBUTTONDOWN")

func _context_menu()
     Local $idContextmenu = GUICtrlCreateContextMenu()
     Local $idNewsubmenu_exit = GUICtrlCreateMenuItem("Exit", $idContextmenu)
     Local $idNewsubmenu_info = GUICtrlCreateMenuItem("A propos", $idContextmenu)
     GUICtrlSetOnEvent($idNewsubmenu_exit,"_Exit_about")
     GUICtrlSetOnEvent($idNewsubmenu_info,"_Apropos")
EndFunc 
Func _move_clock()
      _SendMessage($hGUI, $WM_SYSCOMMAND, $SC_DRAGMOVE, 0)
EndFunc
;---------------------------added by margforce----------------------
Func GDIPlus_SwissRailwayClock()
    $bExit = False
    $hGUI = GUICreate($sTitle, $iW, $iH, -1, -1, $WS_POPUP)
    GUICtrlSetResizing(-1,$GUI_DOCKWIDTH)
    GUISetBkColor(0xFFFFFF, $hGUI)
    ;_WinAPI_SetLayeredWindowAttributes( $hGUI, 0xFFFFFF, 255)
    GUISetState(@SW_SHOW, $hGUI)
;~  GUISetCursor(16, 1)

    ;create canvas elements
                $hDC = _WinAPI_GetDC($hGUI)
    Local Const $hHBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $iW, $iH)
                $hDC_backbuffer = _WinAPI_CreateCompatibleDC($hDC)
    Local Const $DC_obj = _WinAPI_SelectObject($hDC_backbuffer, $hHBitmap)
                $hCanvas = _GDIPlus_GraphicsCreateFromHDC($hDC_backbuffer)
    _GDIPlus_GraphicsSetSmoothingMode($hCanvas, $GDIP_SMOOTHINGMODE_HIGHQUALITY)
    _GDIPlus_GraphicsSetPixelOffsetMode($hCanvas, $GDIP_PIXELOFFSETMODE_HIGHQUALITY)

    Local Const $hBrush_Clr = _GDIPlus_BrushCreateSolid(0xFF000000), _
                $hBrush_FPS = _GDIPlus_BrushCreateSolid(0xF0808080), _
                $hFormat_FPS = _GDIPlus_StringFormatCreate(), _
                $hFamily_FPS = _GDIPlus_FontFamilyCreate("Arial"), _
                $hFont_FPS = _GDIPlus_FontCreate($hFamily_FPS, 8), _
                $tLayout_FPS = _GDIPlus_RectFCreate(0, 0, 60, 16)
    $fDiameter = $iW
                $hBitmap_Clock = GenerateClockBg($fDiameter)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit_About")
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "_move_clock");---------------------------added by margforce----------------------
    GUISetOnEvent($GUI_EVENT_SECONDARYDOWN, "_context_menu");---------------------------added by margforce----------------------

    $fMin_next = @MIN


    GUIRegisterMsg($WM_TIMER, "Draw") ;$WM_TIMER = 0x0113
    DllCall("User32.dll", "int", "SetTimer", "hwnd", $hGUI, "int", 0, "int", $iTimer, "int", 0)

    Do
        If $bExit Then ExitLoop
    Until Not Sleep(100)

    ;release resources
    GUIRegisterMsg($WM_TIMER, "")
    _GDIPlus_FontDispose($hFont_FPS)
    _GDIPlus_FontFamilyDispose($hFamily_FPS)
    _GDIPlus_StringFormatDispose($hFormat_FPS)
    _GDIPlus_BrushDispose($hBrush_Clr)
    _GDIPlus_BrushDispose($hBrush_FPS)
    _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()
    _GDIPlus_GraphicsDrawImageRect($hCanvas, $hBitmap_Clock, 0, 0, $fDiameter, $fDiameter)
    UpdateClock($hCanvas, $fDiameter)
    _WinAPI_BitBlt($hDC, 0, 0, $iW, $iH, $hDC_backbuffer, 0, 0, $SRCCOPY)
EndFunc

Func _Exit_About()
       $bExit = True
EndFunc   ;==>_Exit_About

Func UpdateClock($hGfx, $fDiameter)
    Local Const $fRadius = $fDiameter / 2, $hBrush_Shadow = _GDIPlus_BrushCreateSolid(0x18A8A8A8)
    Local $fSec, $fMin, $fHr
    Static $bBounce = 0, $f = 0, $fAmplitude = 3
    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 Const $hBrush = _GDIPlus_BrushCreateSolid(0xFF101010)
    Local $iWidth1 = $fDiameter * 0.0375, _
          $iHeight1 = $fDiameter / 2.5, _
          $iWidth12 = $iWidth1 / 2, _
          $fPosY = $fDiameter * 0.2, $iWidth2, $iWidth22, $fPosY2

    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, _
                           "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, _
                           "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, 0xF8C01010)
    DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hGfx, "handle", $hBrush, _
                           "float", $fRadius - $iWidth12, _
                           "float", $fPosY, _
                           "float", $iWidth1, "float", $iHeight1)
    DllCall($__g_hGDIPDll, "int", "GdipFillEllipse", "handle", $hGfx, "handle", $hBrush, _
                           "float", $fRadius - $iWidth22, _
                           "float", $fPosY2, _
                           "float", $iWidth2, "float", $iWidth2)
    _GDIPlus_GraphicsResetTransform($hGfx)

    Local Const $hPen = _GDIPlus_PenCreate(0xFFA02020)
    DllCall($__g_hGDIPDll, "int", "GdipFillEllipse", "handle", $hGfx, "handle", $hBrush, _
                           "float", $fRadius - $iWidth1, _
                           "float", $fRadius - $iWidth1, _
                           "float", 2 * $iWidth1, "float", 2 * $iWidth1)
    DllCall($__g_hGDIPDll, "int", "GdipDrawEllipse", "handle", $hGfx, "handle", $hPen, _
                           "float", $fRadius - $iWidth1, _
                           "float", $fRadius - $iWidth1, _
                           "float", 2 * $iWidth1, "float", 2 * $iWidth1)

    _GDIPlus_PenDispose($hPen)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_BrushDispose($hBrush_Shadow)
EndFunc

Func GenerateClockBg($fDiameter)
    Local Const $hBitmap = _GDIPlus_BitmapCreateFromScan0($fDiameter, $fDiameter), $hGfx = _GDIPlus_ImageGetGraphicsContext($hBitmap), _
                $hBrush = _GDIPlus_BrushCreateSolid(0xFF000000), $hPen = _GDIPlus_PenCreate(0xFF000000), _
                $hEffect = _GDIPlus_EffectCreateBlur(10.5, 0), $fBorderSize = $fDiameter * 0.03333
    _GDIPlus_GraphicsSetSmoothingMode($hGfx, 4)
    _GDIPlus_GraphicsSetPixelOffsetMode($hGfx, 4)
    _GDIPlus_GraphicsSetTextRenderingHint($hGfx, 4)
    _GDIPlus_GraphicsClear($hGfx, 0xFFFFFFFF)
    _GDIPlus_PenSetColor($hPen, 0xA0000000)
    _GDIPlus_PenSetWidth($hPen, $fBorderSize)
    Local Const $fSize = $fDiameter * 0.95 - $fBorderSize / 2, $fRadius = $fDiameter / 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+fPXi1luryubOOeKqPBpKQiilLAMhBAwEw7x3RN9jFImPIhTR8TjPQghFvZY2s7wY pkmc'
    $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+5CpklVqcvVmHwFM1TVBTU5GRNwiBnLDcfVjpIHB6bMAbVaQqNeQ8RQVcBRmCGnHWYYWZ5jEoGraDoTP6WpEYKK 91YV'
    $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+VZVlpZq6izA4pBsd9dg5H kDZn'
    $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+BbVVinIjUVpcXL816O826 13Zd'
    $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
;---------------------------added by margforce----------------------
Func GetMousePosType()
    Local $cp = GUIGetCursorInfo()
    Local $wp = WinGetPos($hGUI)
    Local $side = 0
    Local $TopBot = 0
    Local $curs
    If $cp[0] < $margin Then $side = 1
    If $cp[0] > $wp[2] - $margin Then $side = 2
    If $cp[1] < $margin Then $TopBot = 3
    If $cp[1] > $wp[3] - $margin Then $TopBot = 6

    Return $side + $TopBot

EndFunc ;==>GetMousePosType
func _Apropos()
    Msgbox(64,"The Hilfiker / MobaTime Swiss Railway Clock", "Coded by UEZ build 2018-02-16" & @CRLF & "Thanks to Eukalyptus for the _CreateBrushedAluminum() function! " & @CRLF & "Popup style & context menu by Marcgforce")

EndFunc

Func WM_LBUTTONDOWN($hWnd, $iMsg, $StartWIndowPosaram, $lParam)

      Local $drag = GetMousePosType()
    If $drag > 0 Then
        MSGBOX(0,'',"test")
        DllCall("user32.dll", "long", "SendMessage", "hwnd", $hWnd, "int", $WM_SYSCOMMAND, "int", 0xF000 + $drag, "int", 0)
    EndIf

EndFunc ;==>WM_LBUTTONDOWN
;---------------------------added by margforce----------------------

 

Edited by marcgforce
Link to comment
Share on other sites

See post #1 for the widget version.

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!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Link to comment
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
 Share

×
×
  • Create New...