Countdown-Anzeige im Systray

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Countdown-Anzeige im Systray

Beitrag von Helle »

Hier ein kleines Programm, dass die verbleibende Zeit eines Timers (oder sonstwas) im Systray anzeigt (oben: Stunden, unten Minuten).

Code: Alles auswählen

;-------- Tages-Timer mit Anzeige der verbleibenden Restzeit (Stunden und Minuten) im Systray
;-------- "Helle" K.Helbing, 30.04.2006
;-------- PureBasic V4.00 Beta 11

Global *MEMDATA.l = 0
Global IDATA.b = 0
Global ZIFFER.b = 0
Global ZIFFERWO.l = 0
Global ZIFFERART.l = 0

Global ZIFFER0.l = 198
Global ZIFFER1.l = 205
Global ZIFFER2.l = 212
Global ZIFFER3.l = 219
Global ZIFFER4.l = 226
Global ZIFFER5.l = 233
Global ZIFFER6.l = 240
Global ZIFFER7.l = 247
Global ZIFFER8.l = 254
Global ZIFFER9.l = 261

Global ZIFFERLO.l = 170        ;1.Ziffer links oben:   170, 174, 178, 182, 186, 190, 194   
Global ZIFFERRO.l = 171        ;2.Ziffer rechts oben:  171, 175, 179, 183, 187, 191, 195    
Global ZIFFERLU.l = 134        ;3.Ziffer links unten:  134, 138, 142, 146, 150, 154, 158          
Global ZIFFERRU.l = 135        ;4.Ziffer rechts unten: 135, 139, 143, 147, 151, 155, 159          

Global MINUTE.l = 0
Global OLDMINUTE.l = 0
Global STUNDE.l = 0

Global AUSM.l = 00  ;<======== Timer-Ende Minute, frei einstellbar z.B. über ein Menü
Global AUSH.l = 20  ;<======== Timer-Ende Stunde, Timer-Ereignis hier also 20:00 Uhr 

Global TIME1.l = 0
Global TIME2.l = 0
Global TIME3.l = 0

Global FILEL.l = 0

;-------- TIME1 berechnen, evtl. Plausibilitätsprüfung  
TIME1 = AUSH
TIME1 * 60
TIME1 + AUSM
      
;-------- Wird nur benötigt, wenn Shutdown des Systems das Ziel sein soll       
       SystemDir$ = Space(255) 
       FILEL = GetSystemDirectory_(SystemDir$, 255) 
       SystemDir$ = Left(SystemDir$, FILEL) 
       ShutDown$ = SystemDir$ + "\Shutdown.exe"

;--------
OpenWindow(0, 0, 2000,0, 0, "Countdown läuft...")   ;Window ab ins Nirwana   

*MEMDATA = AllocateMemory(268)         ;198 Bytes komplettes Icon plus 10x7 Bytes für die 10 Ziffern

;-------- Alle Daten einlesen
Restore ICONDATA

For x = 0 To 267
  Read IDATA
  PokeB(*MEMDATA + x , IDATA)
Next x
;--------  

;-------- Erstmal ein Icon anzeigen
Icon = CatchImage(0, *MEMDATA) ;Art und Grösse des Images werden aus den Header-Daten ermittelt
AddSysTrayIcon(0, WindowID(0), Icon) 
;--------

IMMERWIEDER:

       Delay(1000)                     ;belastet das System praktisch nicht

;----------------  Countdown-Anzeige
     MINUTE = Minute(Date())
 If MINUTE <> OLDMINUTE
     OLDMINUTE = MINUTE

     TIME2 = Hour(Date())
     TIME2 * 60
     TIME2 + Minute

     TIME3 = TIME1 - TIME2

  If TIME3 < 0
     TIME3 + 1440                      ;24*60
  EndIf   

    STUNDE = TIME3 / 60
    MINUTE = TIME3 - (STUNDE * 60)
 
       MINUTE$ = Str(MINUTE) 
           EM$ = Right(MINUTE$,1)
             Z = Val(EM$)
     Gosub ZIFFERIS                    ;liefert ZIFFERART
     ZIFFERWO = ZIFFERRU
     Gosub ZIFFERSETZ  
     Icon = CatchImage(0, *MEMDATA)  
     ChangeSysTrayIcon(0, Icon)

   If Len(MINUTE$) <> 1
           ZM$ = Left(MINUTE$,1)
             Z = Val(ZM$)
     Gosub ZIFFERIS
     ZIFFERWO = ZIFFERLU
     Gosub ZIFFERSETZ 
     Icon = CatchImage(0, *MEMDATA)
     ChangeSysTrayIcon(0, Icon) 
     
    Else
     ZIFFERART = ZIFFER0
     ZIFFERWO = ZIFFERLU
     Gosub ZIFFERSETZ
     Icon = CatchImage(0, *MEMDATA)
     ChangeSysTrayIcon(0, Icon)
   EndIf 
  
       STUNDE$ = Str(STUNDE) 
           EH$ = Right(STUNDE$,1)
             Z = Val(EH$)
     Gosub ZIFFERIS
     ZIFFERWO = ZIFFERRO
     Gosub ZIFFERSETZ
     Icon = CatchImage(0, *MEMDATA)   
     ChangeSysTrayIcon(0, Icon)

   If Len(STUNDE$) <> 1
           ZH$ = Left(STUNDE$,1)
             Z = Val(ZH$)
     Gosub ZIFFERIS
     ZIFFERWO = ZIFFERLO
     Gosub ZIFFERSETZ
     Icon = CatchImage(0, *MEMDATA)
     ChangeSysTrayIcon(0, Icon)
   
    Else 
     ZIFFERART = ZIFFER0
     ZIFFERWO = ZIFFERLO
     Gosub ZIFFERSETZ
     Icon = CatchImage(0, *MEMDATA)
     ChangeSysTrayIcon(0, Icon)
   EndIf      
  
 EndIf 
      
;-------- Test, ob Ausschalt-Zeit erreicht     
      If TIME3 = 0
          ;RunProgram(Shutdown$, " -s -f -t 0", "", 2)   ;bei Bedarf "scharfschalten"
      EndIf 

Goto IMMERWIEDER                       ;tuts für diesen Demo-Zweck

;-------- Unterprogramm in MEMDATA die richtige Ziffer an die richtige Stelle setzen
ZIFFERSETZ:
For x = 0 To 6
  ZIFFER = PeekB(*MEMDATA + ZIFFERART + x)
  PokeB(*MEMDATA + ZIFFERWO + (x * 4) , ZIFFER)
Next x
Return
;--------

;-------- Unterprogramm Ziffern-Zuordnung
ZIFFERIS:
If Z = 0 : ZIFFERART = ZIFFER0 : Return : EndIf
If Z = 1 : ZIFFERART = ZIFFER1 : Return : EndIf
If Z = 2 : ZIFFERART = ZIFFER2 : Return : EndIf
If Z = 3 : ZIFFERART = ZIFFER3 : Return : EndIf
If Z = 4 : ZIFFERART = ZIFFER4 : Return : EndIf
If Z = 5 : ZIFFERART = ZIFFER5 : Return : EndIf
If Z = 6 : ZIFFERART = ZIFFER6 : Return : EndIf
If Z = 7 : ZIFFERART = ZIFFER7 : Return : EndIf
If Z = 8 : ZIFFERART = ZIFFER8 : Return : EndIf
If Z = 9 : ZIFFERART = ZIFFER9 : Return : EndIf
 
;-----------------------------------------------------------------------

DataSection
;-------- Header eines 16x16-Icons mit 2 "Farben", bleibt konstant
ICONDATA:
  Data.b  0, 0, 1, 0, 1, 0, 16, 16, 2, 0 ,0 ,0, 0, 0, 176, 0  
  Data.b  0, 0, 22, 0, 0, 0, 40, 0, 0, 0, 16, 0, 0, 0, 32, 0
  Data.b  0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0
  Data.b  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b  0, 0, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 
  Data.b  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b  0, 0, 0, 0, 0, 0
;-------- Ab hier den "Rest" der Icon-Datei mit Null auffüllen, nimmt dann die Bit-Muster
;-------- der Ziffern auf bzw. füllt den Abstand zwischen obere und untere Ziffern (255) aus
;-------- Auffüllen mit Null, weil die Ziffern-Werte durch Null-Words getrennt werden  
  Data.b  0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b  0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b  0, 0, 0, 0, 0, 0

;-------- Bit-Muster der Ziffern 0 bis 9, beginnt ab Offset 134 des Icons.   
;-------- Hier kann sich jeder künstlerisch betätigen          
  Data.b  195, 189, 189, 189, 189, 189, 195    ;Ziffer 0 ab Adresse 198 im Speicher 
  Data.b  247, 247, 247, 247 ,247, 247, 231    ;Ziffer 1
  Data.b  129, 191, 191, 129, 253, 253, 129    ;Ziffer 2 
  Data.b  131, 253, 253, 193, 253, 253, 131    ;Ziffer 3
  Data.b  247, 247, 247, 129, 183, 183, 191    ;Ziffer 4   
  Data.b  129, 253, 253, 129, 191, 191, 129    ;Ziffer 5
  Data.b  195, 189, 189, 131, 191, 191, 193    ;Ziffer 6
  Data.b  239, 247, 247, 251, 253, 189, 129    ;Ziffer 7
  Data.b  195, 189, 189, 129, 189, 189, 195    ;Ziffer 8
  Data.b  195, 253, 253, 193, 189, 189, 195    ;Ziffer 9

EndDataSection
Man beachte: Keine Zeile Assembler :mrgreen: !
Und bitte nicht das GOTO anmeckern!

Gruss
Helle