Seite 1 von 1

Ticker Window machen

Verfasst: 22.10.2008 19:11
von rudolfo
Ich möchte text in einem ticker window durchlaufen lassen. Bei den existierenden tickern wird der desktop gestaucht und in dem frei gewordenen platz oben ein fenster eingeblendet mit dem ticker text.

Nach einigem Suchen hab ich trotzdem noch keinen Plan, wie ich das desktop stauche und dann ein fenster plaziere. In den API gibt es nur eine funktion GetDesktopWindow, wenn ich aber versuche mit dem handle was anzufangen passiert nix.

Kann man das machen? Wenn ja - wie?

Re: Ticker Window machen

Verfasst: 22.10.2008 20:15
von Kiffi
rudolfo hat geschrieben:Wenn ja - wie?
folgendes Beispiel mal eben an PB4.2 angepasst:

Code: Alles auswählen

; Original von Stefan
; http://www.purebasic-lounge.com/viewtopic.php?t=2268

Procedure CreateAPPBar(Edge,Size); unterstützt #ABE_LEFT,#ABE_RIGHT,#ABE_TOP,#ABE_BOTTOM für Edge
  *APPBD.APPBARDATA=AllocateMemory(SizeOf(APPBARDATA))
  TBD.APPBARDATA
  SHAppBarMessage_(#ABM_GETTASKBARPOS,TBD)
  
  TBEdge=TBD\uEdge
  
  SHAppBarMessage_(#ABM_NEW,*APPBD)
  
  *APPBD\uEdge=Edge
  
  Select Edge
    Case #ABE_LEFT
      
      If TBEdge=Edge
        *APPBD\rc\left=TBD\rc\right
        *APPBD\rc\right=TBD\rc\right+Size
        *APPBD\rc\top=0
        *APPBD\rc\bottom=GetSystemMetrics_(#SM_CYSCREEN)
      Else
        *APPBD\rc\left=0
        *APPBD\rc\right=Size
        *APPBD\rc\top=0
        *APPBD\rc\bottom=GetSystemMetrics_(#SM_CYSCREEN)
      EndIf
      
    Case #ABE_RIGHT
      
      If TBEdge=Edge
        *APPBD\rc\left=TBD\rc\left-Size
        *APPBD\rc\right=TBD\rc\left
        *APPBD\rc\top=0
        *APPBD\rc\bottom=GetSystemMetrics_(#SM_CYSCREEN)
      Else
        *APPBD\rc\left=GetSystemMetrics_(#SM_CXSCREEN)-Size
        *APPBD\rc\right=GetSystemMetrics_(#SM_CXSCREEN)
        *APPBD\rc\top=0
        *APPBD\rc\bottom=GetSystemMetrics_(#SM_CYSCREEN)
      EndIf
      
      
    Case #ABE_TOP
      
      If TBEdge=Edge
        *APPBD\rc\left=0
        *APPBD\rc\right=GetSystemMetrics_(#SM_CXSCREEN)
        *APPBD\rc\top=TBD\rc\bottom
        *APPBD\rc\bottom=TBD\rc\bottom+Size
      Else
        *APPBD\rc\left=0
        *APPBD\rc\right=GetSystemMetrics_(#SM_CXSCREEN)
        *APPBD\rc\top=0
        *APPBD\rc\bottom=Size
      EndIf
      
    Case #ABE_BOTTOM
      
      If TBEdge=Edge
        *APPBD\rc\left=0
        *APPBD\rc\right=GetSystemMetrics_(#SM_CXSCREEN)
        *APPBD\rc\top=TBD\rc\top-Size
        *APPBD\rc\bottom=TBD\rc\top
      Else
        *APPBD\rc\left=0
        *APPBD\rc\right=GetSystemMetrics_(#SM_CXSCREEN)
        *APPBD\rc\top=GetSystemMetrics_(#SM_CYSCREEN)-Size
        *APPBD\rc\bottom=GetSystemMetrics_(#SM_CYSCREEN)
      EndIf
  EndSelect
  
  SHAppBarMessage_(#ABM_SETPOS,*APPBD)
  
  ProcedureReturn *APPBD
EndProcedure
    
Procedure RemoveAPPBar(*APPBD.APPBARDATA)
  SHAppBarMessage_(#ABM_REMOVE,*APPBD)
  FreeMemory(*APPBD)
EndProcedure
    
Procedure APPBarX(*APPBD.APPBARDATA)
  ProcedureReturn *APPBD\rc\left
EndProcedure
    
Procedure APPBarY(*APPBD.APPBARDATA)
  ProcedureReturn *APPBD\rc\top
EndProcedure
    
Procedure APPBarWidth(*APPBD.APPBARDATA)
  ProcedureReturn *APPBD\rc\right-*APPBD\rc\left
EndProcedure
    
Procedure APPBarHeight(*APPBD.APPBARDATA)
  ProcedureReturn *APPBD\rc\bottom-*APPBD\rc\top
EndProcedure
    
    ;Beispiel:
*APPBD.APPBARDATA=CreateAPPBar(#ABE_TOP,80) ; AppBar am oberen Rand erstellen
    
x=APPBarX(*APPBD)
y=APPBarY(*APPBD)
width=APPBarWidth(*APPBD)
height=APPBarHeight(*APPBD)
    
OpenWindow(1,x,y,width,height,"AppBar", #PB_Window_BorderLess)
SetWindowPos_(WindowID(1),#HWND_TOPMOST,0,0,0,0,#SWP_NOSIZE|#SWP_NOMOVE)
CreateGadgetList(WindowID(1))
    
TextGadget(1,5,5,200,20,"My AppBar")
    
ButtonImageGadget(5, 0, 30, 50, 40, LoadIcon_(0,103))
    
Repeat
  Event=WaitWindowEvent()
  
  If Event=#PB_Event_Gadget
    
    If EventGadget()=5:Quit=1:EndIf
  EndIf
  
Until Quit

RemoveAPPBar(*APPBD) ; AppBar entfernen

Grüße ... Kiffi

Verfasst: 22.10.2008 21:35
von rudolfo
Da hab ich mich wohl an etwas rangewagt, was zur fortgeschrittenen Programmierung gehört.
Aber es funktioniert und bei der Anpassung werde ich sicher was dazu lernen.
Danke - auch an Stefan.