Seite 1 von 1

Countdown-Anzeige im Systray

Verfasst: 30.04.2006 13:08
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