• name22, sieht gut aus :thumbup: sehr geschmeidig animiert!

    Jeahaha

    Zitat

    OMG 300 Zeilen Code für ne Uhr

    und wo ist deine Uhr?
    Und bevor du mich fragst, wo meine ist...

    Spoiler anzeigen
    [autoit]

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

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

    Dim $ws[12] = [0, 0, 10, -7, 50, -7, 60, 0, 50, 7, 10, 7] ;Koordinaten Polygonzug: von links nach rechts WAAGRECHTER Balken, von rechts nach links SENKRECHTER Balken
    Dim $ziffer[10] = [239, 10, 118, 94, 154, 220, 253, 14, 254, 222] ;alle gesetzten bits des Indexes in der 7-segmentanzeige ergeben die Ziffer
    Dim $balkenpos[8] = [0, "60.0", "0.0", "60.60", "0.60", "0.60", "0.120", "0.0"] ;position der Leuchtbalken der 7-Segmentanzeige innerhalb der Ziffer
    Dim $p[7][2] ;nimmt die polygonzug-koordinaten zum Zeichnen auf
    $p[0][0] = 6 ;6 Punkte im Polygonzug

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

    Global $hgui = GUICreate('Uhr', 620, 175, -1, -1, $WS_POPUP, $WS_EX_CONTROLPARENT) ;GUI erstellen ohne Rahmen
    GUISetBkColor(0x000000) ;Hintergrund der GUI schwarz
    WinSetTrans($hgui, "", 205) ;transparenz
    GUISetState() ;GUI anzeigen

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

    _GDIPlus_Startup()
    Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hgui) ;"Leinwand" erstellen, auf der gezeichnet werden kann
    ;_time()
    _Timer_SetTimer($hgui, 1000, "_TIMER_CALLBACK")

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

    Do ;Endlosschleife, solange bis..
    Until GUIGetMsg() = -3 ;..ESC gedrückt wird

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

    _Timer_KillAllTimers($hgui)
    _GDIPlus_GraphicsDispose($hGraphic) ;freigeben
    _GDIPlus_Shutdown()

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

    Func _TIMER_CALLBACK($hWnd, $Msg, $iIDTimer, $dwTime)
    ;Uhrzeit anzeigen :o)
    For $k = 1 To 6 ;die 6 Ziffern der Uhrzeit
    $setbits = $ziffer[StringMid(String(@HOUR & @MIN & @SEC), $k, 1)] ;gesetzte Bits in der siebensegmentanzeige anhand der Ziffer in der Uhrzeit holen
    For $bitnr = 7 To 1 Step -1 ;alle Bits durchlaufen
    _drawpolygon(BitAND($setbits, 128), $k * 100 - 80 + ($k = 1 Or $k = 3 Or $k = 5) * 20, $bitnr) ;parameter: bit gesetzt ja/nein, position der gesamten ziffer,nummer des bits(gerade=waagrechter balken, ungerade=senkrechter balken)
    $setbits = BitShift($setbits, -1) ;nächstes Bit holen
    Next
    Next
    $brush = _GDIPlus_BrushCreateSolid(0xFF440000 + (@SEC / 2 = Int(@SEC / 2)) * 0xBB0000) ;Pinsel erstellen, wenn Ziffer gerade, dann farbig, ansonsten schwarz
    _GDIPlus_GraphicsFillEllipse($hGraphic, 202, 55, 15, 15, $brush) ;Punkte zeichnen
    _GDIPlus_GraphicsFillEllipse($hGraphic, 402, 55, 15, 15, $brush)
    _GDIPlus_GraphicsFillEllipse($hGraphic, 202, 105, 15, 15, $brush)
    _GDIPlus_GraphicsFillEllipse($hGraphic, 402, 105, 15, 15, $brush)
    _GDIPlus_BrushDispose($brush) ;Pinsel auflösen
    EndFunc ;==>_TIMER_CALLBACK

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

    Func _drawpolygon($bit, $xpos, $bitnr) ;zeichnet einen polygonzug ("Balken") an die entsprechende Position
    $split = StringSplit($balkenpos[$bitnr], ".", 3) ;x- und y-koordinaten des Balkens innerhalb der Ziffer holen
    $b = (($bitnr / 2) = Int($bitnr / 2)) ;$bit gerade => $b = true => Balken waagrecht, ansonsten Balken senkrecht
    $step = -1 + 2 * $b ;schrittweite durch das $WS-Array
    For $i = 11 - 11 * $b To 11 * $b Step 2 * $step ;array mit waagrechten (bit=gerade) oder (Bit=ungerade) senkrechten Balken füllen
    $r = Int(Abs((11 * (Not ($b))) - $i) / 2) + 1 ;abhängig von der Reihenfolge, egal ob $i von 0 bis 11 oder von 11 bis 0, $r muss immer 1,2,3,4,5,6
    $p[$r][0] = $ws[$i] + $split[0] + $xpos ;x- und
    $p[$r][1] = $ws[$i + $step] + $split[1] + 30 ;y-position in das polygonarray schreiben
    Next
    $brush = _GDIPlus_BrushCreateSolid(0xFF440000 + ($bit <> 0) * 0xBB0000) ;wenn bit gesetzt, dann farbig, ansonsten schwarz
    _GDIPlus_GraphicsFillPolygon($hGraphic, $p, $brush) ;Balken zeichnen
    _GDIPlus_BrushDispose($brush)
    EndFunc ;==>_drawpolygon

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

    sind auch "nur" 50 Zeilen Code...

  • Sehr effizient gecodet! :thumbup:

    Fehlt "nur" noch eine Zeile, z.B. in Zeile 19:

    [autoit]


    _GDIPlus_GraphicsSetSmoothingMode($hGraphic, 2)

    [/autoit]

    Dann sieht's richtig "rund" aus, ;)

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • [autoit]

    $k * 100 - 80 + ($k = 1 Or $k = 3 Or $k = 5) * 20

    [/autoit]


    Wusste garnicht, dass das überhaupt geht^^
    In einer Rechenoperation noch Logische Abfragen unterbringen.. geil !

    Das würde fast alle Skripte von mir um 20% reduzieren...^^
    (Normal regel ich sowas mit If. Da dann aber ein Else gebraucht wird oder ne Variable braucht man min. 3-5 statt eine Zeile).

    Wenn noch jemand so "Tricks" drauf hat, nur her damit^^
    Ich war damals schon beeindruckt, dass man Logische Operationen per Return verarbeiten kann :D
    (Kollisionsprüfung zweier Körper in einem Einzeiler)

    lg
    M