Wenn möglich könntest du auch etwas einbauen, damit unter Windows 7 die Uhr nicht ausgeblendet wird, wenn ich in die rechte untere Ecke klicke, um alle Fenster schnell zu minimieren.
GDIPlus Digitaluhr
-
-
name22, sieht gut aus sehr geschmeidig animiert!
ZitatOMG 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>
[/autoit] [autoit][/autoit] [autoit]
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <Timers.au3>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
[/autoit] [autoit][/autoit] [autoit]
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 PolygonzugGlobal $hgui = GUICreate('Uhr', 620, 175, -1, -1, $WS_POPUP, $WS_EX_CONTROLPARENT) ;GUI erstellen ohne Rahmen
[/autoit] [autoit][/autoit] [autoit]
GUISetBkColor(0x000000) ;Hintergrund der GUI schwarz
WinSetTrans($hgui, "", 205) ;transparenz
GUISetState() ;GUI anzeigen_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]
Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hgui) ;"Leinwand" erstellen, auf der gezeichnet werden kann
;_time()
_Timer_SetTimer($hgui, 1000, "_TIMER_CALLBACK")Do ;Endlosschleife, solange bis..
[/autoit] [autoit][/autoit] [autoit]
Until GUIGetMsg() = -3 ;..ESC gedrückt wird_Timer_KillAllTimers($hgui)
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_GraphicsDispose($hGraphic) ;freigeben
_GDIPlus_Shutdown()Func _TIMER_CALLBACK($hWnd, $Msg, $iIDTimer, $dwTime)
[/autoit] [autoit][/autoit] [autoit]
;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_CALLBACKFunc _drawpolygon($bit, $xpos, $bitnr) ;zeichnet einen polygonzug ("Balken") an die entsprechende Position
[/autoit] [autoit][/autoit] [autoit][/autoit]
$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 ;==>_drawpolygonsind auch "nur" 50 Zeilen Code...
-
Cheater Dieter: Wird gemacht, gute Idee.
AndyOMG 50 Zeilen Code für ne UhrDanke, deine Uhr sieht aber auch gut aus (allerdings ist der Code beeindruckender als die Uhr selbst ^^) :D. -
name22, sieht gut aus sehr geschmeidig animiert!
und wo ist deine Uhr?
Und bevor du mich fragst, wo meine ist...Spoiler anzeigen
[autoit]#include <GDIPlus.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <Timers.au3>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
[/autoit] [autoit][/autoit] [autoit]
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 PolygonzugGlobal $hgui = GUICreate('Uhr', 620, 175, -1, -1, $WS_POPUP, $WS_EX_CONTROLPARENT) ;GUI erstellen ohne Rahmen
[/autoit] [autoit][/autoit] [autoit]
GUISetBkColor(0x000000) ;Hintergrund der GUI schwarz
WinSetTrans($hgui, "", 205) ;transparenz
GUISetState() ;GUI anzeigen_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]
Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hgui) ;"Leinwand" erstellen, auf der gezeichnet werden kann
;_time()
_Timer_SetTimer($hgui, 1000, "_TIMER_CALLBACK")Do ;Endlosschleife, solange bis..
[/autoit] [autoit][/autoit] [autoit]
Until GUIGetMsg() = -3 ;..ESC gedrückt wird_Timer_KillAllTimers($hgui)
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_GraphicsDispose($hGraphic) ;freigeben
_GDIPlus_Shutdown()Func _TIMER_CALLBACK($hWnd, $Msg, $iIDTimer, $dwTime)
[/autoit] [autoit][/autoit] [autoit]
;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_CALLBACKFunc _drawpolygon($bit, $xpos, $bitnr) ;zeichnet einen polygonzug ("Balken") an die entsprechende Position
[/autoit] [autoit][/autoit] [autoit][/autoit]
$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 ;==>_drawpolygonsind auch "nur" 50 Zeilen Code...
Sehr effizient gecodet!
Fehlt "nur" noch eine Zeile, z.B. in Zeile 19:
[autoit]
[/autoit]
_GDIPlus_GraphicsSetSmoothingMode($hGraphic, 2)Dann sieht's richtig "rund" aus,
Gruß,
UEZ -
UEZ Deinen Post bezüglich des Fonts hab ich doch glatt überlesen... Das wäre auch eine Idee, das Font einfach per MemFont ins Script zu packen. Aber davor möchte ich lieber erstmal eine freie Auswahl des Fonts ermöglichen ;).
-
[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
(Kollisionsprüfung zweier Körper in einem Einzeiler)lg
M -