GDI+ Digitaluhr und Drag & Drop Alternative

  • Das hier habe ich aus Langeweile geschrieben :D. Das mit der Uhrzeit ist nicht wirklich besonders, aber das "Drag & Drop" System könnte vielleicht jemandem nützlich sein :).
    Das Script ist natürlich sehr anpassungsfähig.

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #include <Misc.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    $iGUIWidth = 600 ;Breite der Grafik
    $iGUIHeight = 600 ;Höhe der Grafik

    [/autoit] [autoit][/autoit] [autoit]

    $iX = Random(1, $iGUIWidth -100, 1) ;Startposition X
    $iY = Random(1, $iGUIHeight -50, 1) ;Startposition Y
    $vX = 0 ;Startbewegung X
    $vY = 0 ;Startbewegung Y
    $Resistance = 0.95 ;Stärke des "Luftwiederstands" (Wert zwischen 0 und 1, je geringer der Wert desto größer der Wiederstand).

    [/autoit] [autoit][/autoit] [autoit]

    $hWnd = GUICreate("Test", @DesktopWidth + 2, @DesktopHeight + 2, -1, -1, $WS_POPUP)
    GUISetBkColor(0x000000) ;Hintergrundfarbe der GUI
    GUISetState(@SW_MAXIMIZE)
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    $iX_Graphic = @DesktopWidth / 2 - $iGUIWidth / 2 ;Platziert die Grafik in der Mitte der GUI
    $iY_Graphic = @DesktopHeight / 2 - $iGUIHeight / 2

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iGUIWidth, $iGUIHeight, $hGraphic)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsSetSmoothingMode($hBuffer, 2)

    [/autoit] [autoit][/autoit] [autoit]

    $hFormatTime = _GDIPlus_StringFormatCreate()
    $hFamilyTime = _GDIPlus_FontFamilyCreate("Arial") ;Hier kann der Name jeder beliebigen installierten Schriftart eingetragen werden
    $hFontTime = _GDIPlus_FontCreate($hFamilyTime, 20) ;Hier kann die Schriftgröße angepasst werden

    [/autoit] [autoit][/autoit] [autoit]

    $sTime = @HOUR & ":" & @MIN & ":" & @SEC ;Man könnte natürlich auch einen Text o.Ä.verwenden
    $aInfo = _GDIPlus_GraphicsMeasureString($hBuffer, $sTime, $hFontTime, _GDIPlus_RectFCreate(), $hFormatTime) ;Misst die Größe des Strings
    $iWidth = DllStructGetData($aInfo[0], "width")
    $iHeight = DllStructGetData($aInfo[0], "height")

    [/autoit] [autoit][/autoit] [autoit]

    $hBrushTime = _GDIPlus_BrushCreateSolid(0xFFFF0000) ;Hier kann die Schriftfarbe der Uhrzeit angepasst werden

    [/autoit] [autoit][/autoit] [autoit]

    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "_ClickEvent")

    [/autoit] [autoit][/autoit] [autoit]

    While Sleep(10)
    _ReDraw()
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _ReDraw()
    If $sTime <> @HOUR & ":" & @MIN & ":" & @SEC Then
    $sTime = @HOUR & ":" & @MIN & ":" & @SEC
    $aInfo = _GDIPlus_GraphicsMeasureString($hBuffer, $sTime, $hFontTime, _GDIPlus_RectFCreate(), $hFormatTime)
    $iWidth = DllStructGetData($aInfo[0], "width")
    $iHeight = DllStructGetData($aInfo[0], "height")
    EndIf
    If ($vX > 0 And $iX >= $iGUIWidth - $iWidth) Or ($vX < 0 And $iX <= 0) Then $vX *= -0.9
    If ($vY > 0 And $iY >= $iGUIHeight - $iHeight) Or ($vY < 0 And $iY <= 0) Then $vY *= -0.9
    $iX += $vX
    $iY += $vY
    $vX *= $Resistance
    $vY *= $Resistance
    _GDIPlus_GraphicsClear($hBuffer, 0xFF080808) ;Hintergrundfarbe der Grafik
    ;~ _GDIPlus_GraphicsFillRect($hBuffer, $iX, $iY, $iWidth, $iHeight)
    $tLayoutTime = _GDIPlus_RectFCreate(Floor($iX), Floor($iY), $iWidth, $iHeight)
    _GDIPlus_GraphicsDrawStringEx($hBuffer, $sTime, $hFontTime, $tLayoutTime, $hFormatTime, $hBrushTime)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, $iX_Graphic, $iY_Graphic, $iGUIWidth, $iGUIHeight)
    EndFunc ;==>_ReDraw

    [/autoit] [autoit][/autoit] [autoit]

    Func _ClickEvent()
    $aMousePos = GUIGetCursorInfo($hWnd)
    If _PtIsInRect($aMousePos[0] - $iX_Graphic, $aMousePos[1] - $iY_Graphic, $iX, $iY, $iWidth, $iHeight) Then
    $iDistX = $aMousePos[0] - $iX_Graphic - $iX
    $iDistY = $aMousePos[1] - $iY_Graphic - $iY
    While _IsPressed("01") ;Das hier ist für den "Drag & Drop" Effekt zuständig
    Sleep(10)
    $aMousePos = GUIGetCursorInfo($hWnd)
    $iDiffX = $aMousePos[0] - $iX_Graphic - $iX - $iDistX
    $iDiffY = $aMousePos[1] - $iY_Graphic - $iY - $iDistY
    $vX = $iDiffX / 8
    $vY = $iDiffY / 8
    _ReDraw()
    WEnd
    EndIf
    EndFunc ;==>_ClickEvent

    [/autoit] [autoit][/autoit] [autoit]

    Func _PtIsInRect($iXPoint, $iYPoint, $iXRect, $iYRect, $iWidthRect, $iHeightRect) ;Überprüft ob ein Punkt innerhalb eine Rechtecks ist ;)
    If $iXPoint >= $iXRect And $iYPoint >= $iYRect And $iXPoint <= $iXRect + $iWidthRect And $iYPoint <= $iYRect + $iHeightRect Then Return 1
    Return 0
    EndFunc ;==>_PtIsInRect

    [/autoit] [autoit][/autoit] [autoit]

    Func _Exit() ;Aufräumen...
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_FontDispose($hFontTime)
    _GDIPlus_FontFamilyDispose($hFamilyTime)
    _GDIPlus_StringFormatDispose($hFormatTime)
    _GDIPlus_BrushDispose($hBrushTime)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

    [/autoit]
  • Ist gut gemacht. :thumbup:
    Auchschön ist es, das die Zeit von der Wand zurückprallt.
    Hat leider nur den nebeneffekt, das es unschöne srünge gibt wenn man die Maus ausserhalb des Kastens bewegt (bei gedrückter Maustaste)

    mfg Ubuntu

  • Zitat

    Hat leider nur den nebeneffekt, das es unschöne srünge gibt wenn man die Maus ausserhalb des Kastens bewegt (bei gedrückter Maustaste)


    Das könnte ich auch ändern und das habe ich auch schon in anderen Scripts hingekriegt, aber ich war einfach zu faul :whistling: .

  • Was richtig geil wär, wenn GUI transparent wär und man nur die Uhrzeit sieht und die dann einfach aufem Desktop "rumwerfen" kann :D
    Man tippt gerade an einem Script, die Uhr ist einem im Weg und man pfeffert sie einfach ins nächste Eck :D:D:D

    [autoit]


    While $Life = True
    $nMSG = BrainGetMsg()
    Switch $nMSG
    Case $Idea
    _Convert_Idea2Code()
    EndSwitch
    WEnd

    [/autoit]
  • HAMMER!!
    stimme GE IXI TIM zu das wäre geil^^

    Zitat

    GE IXI TIM
    Was richtig geil wär, wenn GUI transparent wär und man nur die Uhrzeit sieht und die dann einfach aufem Desktop "rumwerfen" kann :D
    Man tippt gerade an einem Script, die Uhr ist einem im Weg und man pfeffert sie einfach ins nächste Eck :D:D:D

    nicht schlecht ehrlich!
    nur das rechteck für die uhr sollte größer sein! aber sonst top arbeit!

  • Sieht wirklich gut aus.

    Alizame: Man kann das Fenster ja größer machen, allerdings fängt es dann an zu hängen (bei mir zumindest). Kannst es ja mal testen.

  • Nimm doch anstelle der Uhr eine Kugel, die du in der GUI "rumwerfen" kannst, natürlich mit Gravitation. ;)

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Transparente gui die Klicks durchlässt (gibts irgendwo nen thread dazu ^^ )

    mfg Ubuntu

  • UEZ
    hast du nicht noch ne idee wie man das ganze transparent machen kann?also das die zeit dann aufm desktop ist und man die dortrumwerfen kann?

    Also, mein Desktop hat die Auflösung 1920x1200 -> kann langsam werden, wenn man "double buffering" benutzt!

    Ja, ich hatte doch mal was mit "Rotating Letters Transparent" veröffentlicht! Dort werden die Buchstaben transparent auf den Desktop dargestellt (nur eine Illusion)!

    Schau' mal in meiner Signatur.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯