Wie animiertes Trayicon zur Laufzeit?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Wie animiertes Trayicon zur Laufzeit?

Beitrag von Ghosty1967 »

Hallo zusammen...

Ich habe folgendes Problem... In meinem Programm wird die animierte Grafik einer analogen Uhr zur Laufzeit mittels der Grafikbefehle erstellt. Nun möchte ich gerne dieses Image (16x16) als "animiertes Trayicon" verwenden. Da aber eine Bitmap und ein Icon so ziemlich nichts mit einander zu tun haben, kann ich dieses Image ja nicht einfach so als Icon verwenden und damit das Trayicon des Programms updaten (ChangeSysTrayicon). Es gibt zwar hier im Forum Hinweise (Siehe Beispiel von srod im englischen Forum), wie man eine Bitmap als Icon speichern kann, allerdings wäre dies ein recht umständlicher Weg, wenn ich das Image erst als Icon speichern und danach wieder laden würde um das richtige Format für mein Trayicon zu haben. :shock:
Kennt Ihr einen Weg, wie ich dies innerhalb des Programms zur Laufzeit ohne diesen Umweg realisieren kann (also quasi im Speicher)?
Für Lösungen des Problems wäre ich sehr dankbar!
Benutzeravatar
roherter
Beiträge: 1407
Registriert: 10.04.2005 18:58
Kontaktdaten:

Beitrag von roherter »

Habe mal ein Beispiel aus der Hilfe ein wenig umgebaut so das du siehst wie man das mit den Icons macht.

Code: Alles auswählen

;-Mit dieser Procedure wird das Image in ein Icon umgewandelt

Procedure.l IconCreate(Icon.l, image.l, mask.l) 
  Protected *Bitmap.Long 
 
  If CreateImage(Icon, ImageWidth(image), ImageHeight(image)) 
    *Bitmap = IsImage(Icon) 
     DeleteObject_(*Bitmap\l) 
     NewIcon.ICONINFO 
    NewIcon\fIcon = #True 
    NewIcon\hbmMask = ImageID(mask) 
    NewIcon\hbmColor = ImageID(image) 
    *Bitmap\l = CreateIconIndirect_(@NewIcon)    
    ProcedureReturn ImageID(Icon) 
  EndIf 
  
  ProcedureReturn 0 
EndProcedure 
;---------------------------------------------------------

;-Images werden erstellt

CreateImage(20,16,16)
CreateImage(21,16,16)
StartDrawing(ImageOutput(20))
  Box(0,0,16,16,RGB(100,100,100))
StopDrawing()
StartDrawing(ImageOutput(21))
  Box(0,0,16,16,RGB(200,200,200))
StopDrawing()
CreateImage(22, 16, 16)    
StartDrawing(ImageOutput(22)) 
  Box(2, 2, 12, 12, $FFFFFF) 
 StopDrawing() 
;-Und umgewandelt
IconCreate(20,22,22)
;------------------------

If OpenWindow(0, 100, 150, 300, 100, "PureBasic - SysTray Example", #PB_Window_SystemMenu)
  
  AddSysTrayIcon(1, WindowID(0), ImageID(20))
  AddSysTrayIcon(2, WindowID(0),ImageID(20))
  SysTrayIconToolTip(1, "Icon 1")
  SysTrayIconToolTip(2, "Icon 2")
  
  Repeat
    event = WaitWindowEvent()
    
    If event = #PB_Event_SysTray
      If EventType() = #PB_EventType_LeftDoubleClick
        MessageRequester("SysTray", "Left DoubleClick on SysTrayIcon "+Str(EventGadget()),0)
        
        ChangeSysTrayIcon (EventGadget(), LoadImage(0, "Data\CdPlayer.ico"))
        SysTrayIconToolTip(EventGadget(), "Changed !")
      EndIf
      
    EndIf
  Until event = #PB_Event_CloseWindow
  
EndIf 
Purebasic 5.0 32bit und 64 bit

I'm back from hell
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Beitrag von Ghosty1967 »

Danke Dir erst einmal...
Werde ich mal ausprobieren und das Ergebnis mitteilen. :D
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Beitrag von Ghosty1967 »

Für alle die es interessiert...

Hab den source mal an meine Bedürfnisse angepasst und siehe da, es funktioniert. Ist vielleicht für Anfänger wie mich interessant um den Umgang mit Trayicons zu lernen.
Es wird eine kleine analoge Uhr im SystemTray dargestellt. Die Anzeige wird jede Sekunde aktualisiert. Wer den Sekundenzeiger sehen will, muß das Semikolon vor dem Line-Befehl entfernen ;)
Nochmals Danke für die Hilfe!

Code: Alles auswählen

Global Dim secx.l(60)
Global Dim secy.l(60)
Global Dim minx.l(60)
Global Dim miny.l(60)
Global Dim hrsx.l(60)
Global Dim hrsy.l(60)

Procedure LowResTimer(num,time)  
  SetTimer_(WindowID(0),num,time,0)  
EndProcedure  

Procedure.l modulo(x,y) 
  ProcedureReturn x-(x/y)*y 
EndProcedure 

Procedure.l IconCreate(Icon.l, image.l, mask.l)
  Protected *Bitmap.Long
  If CreateImage(Icon, ImageWidth(image), ImageHeight(image))
    *Bitmap = IsImage(Icon)
    DeleteObject_(*Bitmap\l)
    NewIcon.ICONINFO
    NewIcon\fIcon = #True
    NewIcon\hbmMask = ImageID(mask)
    NewIcon\hbmColor = ImageID(image)
    *Bitmap\l = CreateIconIndirect_(@NewIcon)   
    ProcedureReturn ImageID(Icon)
  EndIf
  ProcedureReturn 0
EndProcedure

Procedure CreateSystrayIcon()
  h.l=modulo(Hour(Date()),12)*5+(Minute(Date())/12)
  m.l=Minute(Date()): s.l=Second(Date())
  If StartDrawing(ImageOutput(1))
    DrawImage(ImageID(0),0,0)
    LineXY(7,7,hrsx(h),hrsy(h),RGB(0,0,0))
    LineXY(7,7,minx(m),miny(m),RGB(0,0,0))
    ;LineXY(7,7,secx(s),secy(s),RGB(255,0,0))
    StopDrawing()
  EndIf
  If StartDrawing(WindowOutput(0))
    DrawImage(ImageID(1),50,20,64,64)
    StopDrawing()
  EndIf
  IconCreate(20,1,1)
  SetGadgetState(0,ImageID(1))
EndProcedure


;Hier wird ein Ziffernblatt als Hintergrund für die Uhr geladen (Bitte anpassen)
LoadImage(0,"Z:\Programmierung\PureBasic V4.2\Projekte\Analoguhr\main.bmp")
CreateImage(1,16,16,32)
;Erstellen der Koordinaten für die Zeiger
radius.l=8: p.f=3.141594
For i=0 To 59
  secx(i)=7+Sin(p)*radius*0.8 : secy(i)=7+Cos(p)*radius*0.8
  minx(i)=7+Sin(p)*radius*0.65: miny(i)=7+Cos(p)*radius*0.65
  hrsx(i)=7+Sin(p)*radius*0.5 : hrsy(i)=7+Cos(p)*radius*0.5
  p-0.1047198
Next

If OpenWindow(0, 100, 150, 300, 100, "PureBasic - SysTray Example", #PB_Window_SystemMenu)
  If CreateGadgetList(WindowID(0))
    ImageGadget(0,20,20,16,16,0)
  EndIf
  CreateSystrayIcon()
  AddSysTrayIcon(1, WindowID(0), ImageID(20))
  LowResTimer(1,1000)
  
  Repeat
    Event = WindowEvent()
    Select Event
      Case #WM_TIMER  
        Select EventwParam()  
          Case 1
            CreateSystrayIcon()
            ChangeSysTrayIcon(1,ImageID(20))
            Debug "CHANGED"
        EndSelect    
    EndSelect
  Until Event = #PB_Event_CloseWindow
EndIf 
Antworten