• eine binäruhr wurde zwar schon in autoit umgesetzt und eigentlich sollte ich fürs abi lernen, aber mir war gerade langweilig :D somit stelle ich mal meine binäruhr vor...kritik, lob und vorschläge zur verbesserung sind erwünscht :)

    Update1:
    kleine anpassungen

    Update2:
    -jetzt auch als bildschirmschoner nutzbar
    -code gekürzt


    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Outfile_x64=Binäruhr.exe
    #AutoIt3Wrapper_Res_Fileversion=1.0.0.2
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GDIPlus.au3>

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

    HotKeySet("{ESC}", "_Binaeruhr_Terminate")

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

    Global $x_schwarz = 0x000000, $x_on = 0xF61A00, $x_off = 0xF0F0F0, $s_type = _FileGetType()
    Global $a_ellipse_hour[5][2] = [[115, 380], [115, 300], [115, 220], [35, 380], _
    [35, 300]]
    Global $a_ellipse_min[6][2] = [[300, 380], [300, 300], [300, 220], [220, 380], _
    [220, 300], [220, 220]]
    Global $a_ellipse_sec[6][2] = [[480, 380], [480, 300], [480, 220], [400, 380], _
    [400, 300], [400, 220]]

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

    Global $a_length[3] = [6, 6, 5]
    Global $a_SMHellipse[3] = [$a_ellipse_sec, $a_ellipse_min, $a_ellipse_hour]

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

    _GDIPlus_StartUp()

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

    Global $h_stift = _GDIPlus_PenCreate(0xFF000000 + $x_schwarz, 1)
    Global $h_on = _GDIPlus_BrushCreateSolid(0xFF000000 + $x_on)
    Global $h_off = _GDIPlus_BrushCreateSolid(0xFF000000 + $x_off)

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

    Global $h_GUI = GUICreate("Binäruhr", 600, 480, -1, -1, BitOR($WS_MINIMIZEBOX,$WS_POPUP,$WS_GROUP),$WS_EX_TOPMOST)
    GUISetOnEvent(-3, "_Binaeruhr_Terminate")
    GUISetBkColor($x_schwarz, $h_GUI)
    Global $h_graphic = _GDIPlus_GraphicsCreateFromHWND($h_GUI)
    _GDIPlus_GraphicsSetSmoothingMode($h_graphic, 2)
    Global $h_UhrzeitDigital = GUICtrlCreateLabel(@HOUR & ":" & @MIN & ":" & @SEC, 45, 50, 500, 150)
    GUICtrlSetBkColor($h_UhrzeitDigital, $GUI_BKCOLOR_TRANSPARENT)
    GUICtrlSetFont($h_UhrzeitDigital, 95, 400, 0, "Arial")
    GUICtrlSetColor($h_UhrzeitDigital, $x_on)
    GUISetCursor(16, 1, $h_GUI)

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

    Global $h_trans = GUICreate("", @DesktopWidth + 5, @DesktopHeight + 5, -5, -5, $WS_POPUP, $DS_MODALFRAME)
    GUISetBkColor($x_schwarz)
    WinSetTrans($h_trans, "", 100)
    GUISetCursor(16, 1, $h_trans)

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

    GUISetState(@SW_SHOW, $h_trans)
    GUISetState(@SW_SHOW, $h_GUI)

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

    If $s_type = "scr" Then
    Global $a_pos_start = MouseGetPos(), $a_pos_run
    While True
    _Binaeruhr_Update()
    Sleep(100)
    $a_pos_run = MouseGetPos()
    If $a_pos_run[0] <> $a_pos_start[0] Or $a_pos_run[1] <> $a_pos_start[1] Then _Binaeruhr_Terminate()
    WEnd
    Else
    While True
    _Binaeruhr_Update()
    Sleep(100)
    WEnd
    EndIf

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

    Func _Binaeruhr_Terminate()
    _GUIFadeInOut($h_GUI, False, 8)
    GUIDelete($h_GUI)
    GUIDelete($h_trans)
    _GDIPlus_GraphicsDispose($h_graphic)
    _GDIPlus_PenDispose($h_stift)
    _GDIPlus_BrushDispose($h_on)
    _GDIPlus_BrushDispose($h_off)
    _GDIPlus_Shutdown()
    Exit
    EndFunc

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

    Func _Binaeruhr_Update()
    If GUICtrlRead($h_UhrzeitDigital) <> @HOUR & ":" & @MIN & ":" & @SEC Then GUICtrlSetData($h_UhrzeitDigital, @HOUR & ":" & @MIN & ":" & @SEC)

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

    Local $a_SMH[3] = [@SEC, @MIN, @HOUR]
    Local $b_time, $a_time

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

    For $x = 0 To 2
    $b_time = _IntegerToBinary($a_SMH[$x])
    $b_time = _BinaerstringAuffuellen($b_time, $a_length[$x])
    $a_time = StringSplit($b_time, "")
    $a_time = _ArrayElementeTauschen($a_time)
    _PunkteFuellen($a_time, $a_SMHellipse[$x])
    Next
    EndFunc

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

    Func _PunkteFuellen($a_array, $a_ellipse)
    For $i = 1 To $a_array[0]
    If $a_array[$i] = 1 Then
    Local $h_farbe = $h_on
    Else
    Local $h_farbe = $h_off
    EndIf
    _GDIPlus_GraphicsFillEllipse($h_graphic, $a_ellipse[$i - 1][0], $a_ellipse[$i - 1][1], 70, 70, $h_farbe)
    _GDIPlus_GraphicsDrawEllipse($h_graphic, $a_ellipse[$i - 1][0], $a_ellipse[$i - 1][1], 70, 70, $h_stift)
    Next
    EndFunc

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

    Func _IntegerToBinary($v_number)
    $b_binary = ""
    Do
    $b_binary = Mod($v_number, 2) & $b_binary
    $v_number = Floor($v_number/2)
    Until $v_number = 0
    Return $b_binary
    EndFunc

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

    Func _ArrayElementeTauschen($a_array)
    Local $v_rubbish, $i_ubound

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

    If Mod($a_array[0], 2) = 0 Then
    $i_ubound = ($a_array[0] / 2)
    Else
    $i_ubound = (($a_array[0] - 1) / 2)
    EndIf

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

    For $i = 1 To $i_ubound
    $v_rubbish = $a_array[$i]
    $a_array[$i] = $a_array[$a_array[0] - $i + 1]
    $a_array[$a_array[0] - $i + 1] = $v_rubbish
    Next
    Return $a_array
    EndFunc

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

    Func _BinaerstringAuffuellen($s_binary, $i_length)
    If StringLen($s_binary) < $i_length Then
    Do
    $s_binary = "0" & $s_binary
    Until StringLen($s_binary) = $i_length
    EndIf
    Return $s_binary
    EndFunc

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

    Func _GUIFadeInOut($hGUI, $bFadeIn = True, $iSpeed = 12) ; by Marsi
    If Not (IsHWnd($hGUI) And IsBool($bFadeIn) And ($iSpeed > 0)) Then Return SetError(-1 * (Not IsHWnd($hGUI)) - 2 * (Not IsBool($bFadeIn)) - 4 * (Not ($iSpeed > 0)))
    If $bFadeIn Then GUISetState(@SW_SHOW + 0 * WinSetTrans($hGUI, "", 255 * (Not $bFadeIn)), $hGUI)
    For $i = 0 To 255 Step $iSpeed
    WinSetTrans($hGUI, "", (2 * $i - 255) * $bFadeIn + (255 - $i) + 0 * Sleep(10))
    Next
    WinSetTrans($hGUI, "", 255 * $bFadeIn) ; Korrigiert Fehler, wenn die Schleife nicht bei 0 oder 255 endet.
    If Not $bFadeIn Then GUISetState(@SW_HIDE, $hGUI)
    EndFunc

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

    Func _FileGetType($s_path = @ScriptFullPath)
    If StringRegExp(StringLeft($s_path, 1), "[a-zA-Z]") And StringMid($s_path, 2, 1) = ":" Then
    Local $a_path = StringSplit($s_path, ".")
    Return $a_path[$a_path[0]]
    Else
    Return SetError(-1)
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit]
  • Super Sache ! Das langsame Ausblenden ist echt genial :)

    Ein Spoiler im Spoiler im Spoiler...

    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen

    Die geheime Nachricht ist "Baum" !

  • Nett ;). Man kann sowas natürlich noch verbessern, indem man Doublebuffering benutzt [...]


    Hi!
    Ich habe nicht vor, diesen Threat zu "hijacken", aber wie benutzt man Doublebuffering?

    Ist es z.B. möglich, die Darstellung des Fensters in folgendem "Programm" flüssiger zu gestalten?

    Spoiler anzeigen
    [autoit]

    HotKeySet("{ESC}", "_Exit")

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

    $moveit = GUICreate("", 0, 0, 0, 0)

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

    GUISetState()

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

    $start = 0
    $ende = 1000
    $step = 1

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

    while 1
    For $i = $start To $ende Step $step
    WinMove($moveit, "", 10 + ($i/2), 10 + ($i/4), $i * (16 / 9), $i)
    Next
    If $step = 1 Then
    $start = 1000
    $ende = 0
    $step = -1
    Else
    $start = 0
    $ende = 1000
    $step = 1
    EndIf
    WEnd

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

    Func _Exit()
    Exit
    EndFunc

    [/autoit]

    RedHead: Ja, ganz gut, deine Uhr :thumbup:

  • Sieht gut aus. :thumbup:

    Friesel

    wie benutzt man Doublebuffering?

    Ist es z.B. möglich, die Darstellung des Fensters in folgendem "Programm" flüssiger zu gestalten?


    Du benutzt in deinem Skript kein GDI+, also wird dir double buffering da nichts bringen (bzw. nicht funktionieren, da du es nicht einbringen kannst).
    Zur ersten Frage: Du zeichnest nicht direkt auf die Grafik sondern auf einen Buffer, den du dann auf die Grafik zeichnest. Such' einfach mal im Forum, da solltest du genügend Beispiele finden. Hier auch nochmal ein Skript zur Verdeutlichung.

  • Hier auch nochmal ein Skript zur Verdeutlichung.


    Nichts für ungut, aber mit so nem Beispiel kann ich nicht viel anfangen :wacko:

    ...aber ich werd mich jetzt mal durch die Hilfe der GDIplus UDF wühlen, da ich damit noch nie "rumgespielt" habe...danke für den Hinweis.

    *edit*
    Mars: Danke, seh ich mir an...
    P.s.: wollte keinen neuen Beitrag erstellen, weil ich, wie schon gesagt, diesen Threat hier nicht "hijacken" will...daher *edit* ;)


  • Nichts für ungut, aber mit so nem Beispiel kann ich nicht viel anfangen :wacko:

    ...aber ich werd mich jetzt mal durch die Hilfe der GDIplus UDF wühlen, da ich damit noch nie "rumgespielt" habe...danke für den Hinweis.

    Hab mal in ein Skript einen Doppelpuffer eingebaut. Klick Mich
    Das Prinzipp ist ganz einfach:
    Ein Puffer steht mit fertigem Bild jederzeit zur Verfügung und kann bei unvorhersehbaren Ereignissen (z.B. WM_PAINT) angezeigt werden.
    Der Andere wird grade bemalt. Ist das Malen fertig wird die Speicheradresse der beiden Puffer getauscht.
    Somit ist für Anzeigefunktionen jederzeit ein aktuelles Bitmap vorhanden und für Zeichenfunktionen jederzeit ein beschreibbarer Puffer.

    Bei einem so kleinen Skript wird Mehrfachpufferung nicht viel bringen, da die Zeichenfunktionen so schnell abgeschlossen sind, dass die Wahrscheinlichkeit sehr gering ist beim Zeichenvorgang einen Interrupt zu bekommen

    lg
    Mars