• [Blockierte Grafik: http://fs1.directupload.net/images/141215/8bcq6qym.png]

    Ich habe eine grafische Uhr in AutoIt programmiert.

    Das ganze ist nichts großes. Allerdings ist es mein erstes Programm wo ich den Vorgang als Video für YouTube aufgenommen habe. Also mein erstes YouTube-Video :).
    Hier die Links.
    Teil 1: https://www.youtube.com/watch?v=1c53XnOzsq8
    Teil 2: https://www.youtube.com/watch?v=VJTN44uo7HM
    Freue mich über Kritik.

    Hier der Code:

    [autoit]

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

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

    Global $window
    Global $window_size = 500
    Global $window_title = "Uhr"
    Global $window_timer

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

    Global $graphics
    Global $bitmap
    Global $buffer
    Global $pen
    Global $pen_minute, $pen_hour, $pen_second

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

    Global $PI = 3.14159265359

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

    init()

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

    func init()
    $window = GUICreate($window_title,$window_size,$window_size)

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

    _GDIPlus_Startup()

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

    $graphics = _GDIPlus_GraphicsCreateFromHWND($window)
    $bitmap = _GDIPlus_BitmapCreateFromGraphics($window_size,$window_size,$graphics)
    $buffer = _GDIPlus_ImageGetGraphicsContext($bitmap)
    $pen = _GDIPlus_PenCreate(0xFF333333,10)
    $pen_minute = _GDIPlus_PenCreate(0xFFDDDDDD,3)
    $pen_hour = _GDIPlus_PenCreate(0xFF666666,3)
    $pen_second = _GDIPlus_PenCreate(0xFFFF0000,2)

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

    _GDIPlus_GraphicsSetSmoothingMode($buffer,2)

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

    GUISetState(@SW_SHOW,$window)

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

    $window_timer = TimerInit()

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

    main()
    EndFunc

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

    func main()
    Do
    if TimerDiff($window_timer) >= 30 then
    $window_timer = TimerInit()

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

    update()
    EndIf
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

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

    close()
    EndFunc

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

    func close()
    _GDIPlus_PenDispose($pen)
    _GDIPlus_PenDispose($pen_minute)
    _GDIPlus_PenDispose($pen_hour)
    _GDIPlus_PenDispose($pen_second)
    _GDIPlus_GraphicsDispose($graphics)
    _GDIPlus_BitmapDispose($bitmap)
    _GDIPlus_GraphicsDispose($buffer)

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

    _GDIPlus_Shutdown()

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

    GUIDelete($window)
    EndFunc

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

    Func update()
    _GDIPlus_GraphicsClear($buffer,0xFFFFFFFF)

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

    _GDIPlus_GraphicsDrawEllipse($buffer,50,50,$window_size-100,$window_size-100,$pen)

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

    $rad = 0
    $diff = ($PI*2) / 12
    Do
    _GDIPlus_GraphicsDrawLine($buffer,$window_size/2+sin($rad)*180,$window_size/2+cos($rad)*180,$window_size/2+sin($rad)*200,$window_size/2+cos($rad)*200,$pen)

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

    $rad += $diff
    Until $rad >= $PI*2

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

    ;minute
    $rad = -(($PI*2) / 60) *@MIN-$PI
    $value = 150
    _GDIPlus_GraphicsDrawLine($buffer,$window_size/2,$window_size/2,$window_size/2+sin($rad)*$value,$window_size/2+cos($rad)*$value,$pen_minute)

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

    ;hour
    $rad = -(($PI*2) / 12) *@HOUR-$PI
    $value = 80
    _GDIPlus_GraphicsDrawLine($buffer,$window_size/2,$window_size/2,$window_size/2+sin($rad)*$value,$window_size/2+cos($rad)*$value,$pen_hour)

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

    ;second
    $rad = -(($PI*2) / 60) *@SEC-$PI
    $value = 170
    _GDIPlus_GraphicsDrawLine($buffer,$window_size/2,$window_size/2,$window_size/2+sin($rad)*$value,$window_size/2+cos($rad)*$value,$pen_second)

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

    _GDIPlus_GraphicsDrawImage($graphics,$bitmap,0,0)
    EndFunc

    [/autoit]
  • Hey gem,

    schöne Idee mit dem Youtube Tutorial. Beim schnellen drüber schauen sind mir ein/zwei Dinge aufgefallen die man in Autoit meiner Meinung nach etwas eleganter schreiben kann. Aber sieh selbst... :)
    Durch Menschen wie dich, die sich hinsetzen und Tutorials erarbeiten wird die Zahl der Programmierbegeisterten immer größer. Weiter so! :)

    Spoiler anzeigen
    [autoit]

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

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

    Global $iWindowSize = 500
    Global $sWindowTitle = "Uhr"
    Global $iFrameRate = 30

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

    Global $hGraphics
    Global $hBitmap
    Global $hBuffer
    Global $hPen, $hPen_hour, $hPen_minute, $hPen_second

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

    Global $PI = 3.14159265359

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

    init()

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

    func init()
    Local $hWindow

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

    _GDIPlus_Startup()
    $hWindow = GUICreate($sWindowTitle, $iWindowSize, $iWindowSize)
    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hWindow)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWindowSize, $iWindowSize, $hGraphics)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsSetSmoothingMode($hBuffer,2)
    GUISetState(@SW_SHOW)

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

    $hPen = _GDIPlus_PenCreate(0xFF333333,10)
    $hPen_minute = _GDIPlus_PenCreate(0xFFDDDDDD,3)
    $hPen_hour = _GDIPlus_PenCreate(0xFF666666,3)
    $hPen_second = _GDIPlus_PenCreate(0xFFFF0000,2)

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

    AdlibRegister("update",1000/$iFrameRate) ; $iFrameRate mal pro Sekunde die Funktion "update()" aufrufen

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

    main()
    EndFunc

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

    Func main()
    While (GUIGetMsg() <> $GUI_EVENT_CLOSE)
    Sleep(50)
    WEnd
    close()
    EndFunc

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

    Func close()
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_PenDispose($hPen_minute)
    _GDIPlus_PenDispose($hPen_hour)
    _GDIPlus_PenDispose($hPen_second)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_Shutdown()
    Exit
    EndFunc

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

    Func update()
    Local $dRad

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

    _GDIPlus_GraphicsClear($hBuffer,0xFFFFFFFF)
    _GDIPlus_GraphicsDrawEllipse($hBuffer,50,50,$iWindowSize-100,$iWindowSize-100,$hPen)

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

    $dRad = 0
    $diff = ($PI*2) / 12
    Do
    _GDIPlus_GraphicsDrawLine($hBuffer,$iWindowSize/2+sin($dRad)*180,$iWindowSize/2+cos($dRad)*180,$iWindowSize/2+sin($dRad)*200,$iWindowSize/2+cos($dRad)*200,$hPen)
    $dRad += $diff
    Until $dRad >= $PI*2

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

    ; minute
    $dRad = -(($PI*2) / 60) *@MIN-$PI
    drawPointer($dRad, 150, $hPen_minute)

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

    ; hour
    $dRad = -(($PI*2) / 12) *@HOUR-$PI
    drawPointer($dRad, 80, $hPen_hour)

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

    ; second
    $dRad = -(($PI*2) / 60) *@SEC-$PI
    drawPointer($dRad, 170, $hPen_second)

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

    _GDIPlus_GraphicsDrawImage($hGraphics,$hBitmap,0,0)
    EndFunc

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

    Func drawPointer($dRad, $iLength, $hPen)
    _GDIPlus_GraphicsDrawLine($hBuffer, $iWindowSize/2, $iWindowSize/2, ($iWindowSize/2+sin($dRad)*$iLength), ($iWindowSize/2+cos($dRad)*$iLength), $hPen)
    EndFunc

    [/autoit]

    LG
    Christoph :)

  • Du hast einen nicht ganz unwichtigen Punkt, der eine Uhr ausmacht, vergessen. Der Stundenzeiger springt nicht stündlich weiter, sondern dreht sich langsam mit... Was bedeutet, dass man die Minuten prozentual mit zu den Stunden addieren muss.

    Das kann man so realisieren:

    [autoit]

    ; hour
    $dRad = -(($PI*2) / 12) *(@HOUR + (@MIN / 60))-$PI

    [/autoit]
  • @Christoph54

    Danke :)
    Den Code hätte man natürlich optimieren können allerdings hatte ich mir vor dem Video keine wirklichen Gedanken drüber gemacht und wollte nicht im Video zeigen wie ich versuch den Code zu optimieren.

    @KloMeister

    Danke.
    Entweder habe ich davor nie wirklich hingeguckt oder ich habe sowelche Uhren schonmal gesehen :) Interessant.