Seite 1 von 1

Laufschrift Transparent machen ?

Verfasst: 05.03.2010 20:10
von Dristar
Hallo

Ich probiere schon eine ganze Weile. Den Hintergrund Transparent zu bekommen :cry:
Vielleicht kann mir jemand zeigen wo ich was einfügen muss :)

Hier mein code:

Code: Alles auswählen

;04/03/2010-20:08 Laufschrift Version 3
;
;ElapsedMilliseconds()
;

Procedure QueryCounterInit()
Global Freq.q     = 0
Ctr1.q             = 0
Ctr2.q             = 0
Calibrieren.q      = 0
  QueryPerformanceFrequency_(@Freq)
  QueryPerformanceCounter_(@Ctr1)
  QueryPerformanceCounter_(@Ctr2)
  Calibrieren = Ctr2 - Ctr1  / Freq
 ProcedureReturn Calibrieren
EndProcedure

Procedure Laufschrift(*wert)
#txt           =    0
#X             =   50      ;nach rechts
#Y             =   10      ;nach unten
#width         =  500
#height        =   37
Ctr1.q         =    0
Ctr2.q         =    0
Calibrieren.l  =    0
LoadFont(1,"Arial", 24,#PB_Font_Bold)


Define text.s = "                    Das ist eine Demo Laufschrift..."   
        text   + "                            Der Text soll lang sein damit man das Scrollen"
        text   + " auch sehen kann.  Grüsse gehen an alle die mir helfen   :-)"        

CreateImage(#txt, #width, #height,32)
StartDrawing(ImageOutput(#txt))
DrawingMode(#PB_2DDrawing_AlphaChannel|#PB_2DDrawing_Transparent)
Box(0, 0, #width, #height, $00000000)
DrawingFont(FontID(1))
Define length.l = TextWidth(text) + #width
StopDrawing()
Define pos.l = #width
Define speedX.f = 30000000
;Delay(10)
Calibrieren=QueryCounterInit()
Repeat

QueryPerformanceCounter_(@Ctr2)

If speedX < Ctr2 - Ctr1 - Calibrieren / Freq  

    Ctr2 = 0:Ctr1 = 0:QueryPerformanceCounter_(@Ctr1)
    StartDrawing(ImageOutput(#txt))
    DrawingFont(FontID(1))
      DrawText(pos,0,text,RGB(111,11,111),RGBA(0,0,0,0))
    StopDrawing()
    StartDrawing(WindowOutput(0))
      DrawImage(ImageID(#txt),#X,#Y)
    StopDrawing()
    pos - 1
    If pos < -length+#width
     pos = #width
    EndIf
EndIf
Delay(1)
ForEver
EndProcedure


;If InitSound() > 0
;  UseOGGSoundDecoder()
;   If CatchSound(0,?ogg_file, ?ende-?anfang)
;     PlaySound(0, #PB_Sound_Loop)
;   EndIf
;EndIf



Define event.l

If OpenWindow(0,0,0,600,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  HThread=CreateThread(@Laufschrift(),23)
  SetThreadPriority_(HThread,$100)
  SetClipboardText("Das ist ein TEST")
  Repeat 
    event = WindowEvent()
     Select event
       Case 0
         Delay(1)
       Case #PB_Event_CloseWindow
         End
     EndSelect
  ForEver
EndIf

DataSection
anfang:
ogg_file: 
ende:
EndDataSection

Re: Laufschrift Transparent machen ?

Verfasst: 06.03.2010 01:16
von STARGÅTE
keine ahnung was genau das code macht, aber!

Alpha-Werte werden nur bei ImageOutput() richtig benutzt, wenn du also ein Image auf ein Window "malst" dann wird der Alpha-Kanal ignoriert.

Nutze dafür ein ImageGadget in welchem das echte Image liegt, dann wird auch der Alpha-Kanal benutzt.
Das bild musst du dann mit SetGadgetState aktuallisieren.

Re: Laufschrift Transparent machen ?

Verfasst: 06.03.2010 02:52
von hörmi
Du solltest dir erst mal die examples anschauen die es in PB gibt und die leicht umändern und schauen was passiert.
Ich hab einen haufen fehler gefunden in deinem codeschnipsel so das es sich gar nicht gelohnt hätte die alle auszubessern bis es funktioniert
nur so die zwei die mir im hinterkopf geblieben sind
-dein QueryCounterInit() bewirkt gar nichts
->du solltest dir mal den unterschied von globalen und lokalen variablen nochmal anschauen

-schau dir nochmal an wie das mit dem alpha kanal geht, ich selbst habs am anfang auch nicht ganz verstanden aber wenn mans weiß is es ganz einfach dein erstes drawing macht - wie gewollt - den hintergrund transparent aber dann möchtest du einen auch transparenten text drauf schreiben
hier mal noch ein kleines 32bit bilder example

Code: Alles auswählen

CreateImage(0,100,20,32)
StartDrawing(ImageOutput(0))
  DrawingMode(#PB_2DDrawing_AlphaChannel)
  Box(0,0,100,20,RGBA(0,0,0,0))
  DrawText(0,0,"Nicht Rot aber sichtbar",RGBA(255,0,0,255),RGBA(0,255,0,128))
StopDrawing()

CreateImage(1,100,20,32)
StartDrawing(ImageOutput(1))
  DrawingMode(#PB_2DDrawing_AlphaChannel)
  Box(0,0,100,20,RGBA(0,0,0,0))
  DrawingMode(#PB_2DDrawing_AlphaBlend)
  DrawText(0,0,"Rot mit halb transparent grünen Hintergrund",RGBA(255,0,0,255),RGBA(0,255,0,128))
StopDrawing()

CreateImage(2,100,20,32)
StartDrawing(ImageOutput(2))
  DrawingMode(#PB_2DDrawing_Default)
  Box(0,0,100,20,RGBA(0,0,0,0))
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawText(0,0,"Rot mit schwarzem Hintergrund",RGBA(255,0,0,255),RGBA(0,255,0,128))
StopDrawing()

OpenWindow(0,0,0,400,400,"",1|#PB_Window_SystemMenu)
ImageGadget(0,10,10,100,20,ImageID(0))
ImageGadget(1,10,40,100,20,ImageID(1))
ImageGadget(2,10,70,100,20,ImageID(2))
Repeat
  event=WaitWindowEvent()
  
Until event=#PB_Event_CloseWindow
und hier der lauftext

Code: Alles auswählen

EnableExplicit

Structure Lauftext
  GadgetID.l
  ImageID.l
  GadgetX.l
  GadgetY.l
  Width.l
  Height.l
  PosX.l
  Text.s
  Delay.l
  Thread.l
  Loop.l
EndStructure
Procedure Laufschrift(*LT.Lauftext)
Define.l TextWidth
  Repeat
    StartDrawing(ImageOutput(*LT\ImageID))
      DrawingMode(#PB_2DDrawing_AlphaChannel)
      Box(0,0,*Lt\Width,*Lt\Height,0)
      DrawingMode(#PB_2DDrawing_AlphaBlend)
      DrawText(*lt\PosX,0,*lt\Text,RGBA(0,0,0,255),0)
      TextWidth=TextWidth(*lt\Text)
    StopDrawing()
    SetGadgetState(*Lt\GadgetID,ImageID(*lt\ImageID))
    *lt\posx-1
    If *lt\loop
      If *lt\posx<-TextWidth
        *lt\posx+TextWidth+*lt\Width
      EndIf
    EndIf
    Delay(*lt\Delay)
  ForEver
EndProcedure
Procedure CreateLaufschrift(*LT.Lauftext,x,y,Width,Height,Text.s,Delay,StartPos,Loop)
  *LT\Width=Width
  *LT\Height=Height
  *LT\Text=Text
  *LT\GadgetX=x
  *LT\GadgetY=y
  *LT\Delay=Delay
  *LT\PosX=StartPos
  *LT\Loop=Loop
  *LT\GadgetID=ImageGadget(-1,*LT\GadgetX,*LT\GadgetY,*LT\Width,*LT\Height,0)
  *LT\ImageID=CreateImage(-1,*LT\Width,*LT\Height,32)
  *LT\Thread=CreateThread(@Laufschrift(),*LT)
  ThreadPriority(*LT\Thread,32)
EndProcedure

Define text.s = "                    Das ist eine Demo Laufschrift..."   
Text   + "                            Der Text soll lang sein damit man das Scrollen"
Text   + " auch sehen kann.  Grüsse gehen an alle die mir helfen   :-)"        

Define event.l,HThread.l
Define LT.Lauftext

If OpenWindow(0,0,0,600,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
CreateLaufschrift(LT,50,10,500,34,Text,20,500,1)
  Repeat 
    event = WaitWindowEvent()
    Select event
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf
ps. ja mir war langweilig
Edit:Code verschlimmbessert

Re: Laufschrift Transparent machen ?

Verfasst: 06.03.2010 10:52
von Dristar
@hörmi

Danke , dass du dir die Mühe gemacht hast :allright:
Das mit dem Query Counter liegt woll auch am Delay. Kann ich meinem Programm
auch eine Maximale CPU last zuteilen ?

mfg Dristar

Re: Laufschrift Transparent machen ?

Verfasst: 06.03.2010 11:14
von hörmi
Im Grunde haben alle exe datein die du startest die selbe priority und im normalfall soweit ich weiß haben alle bereits die höchste (32 bin mir aber nicht sicher) du kannst eigentlich nur die priorität runterstellen
threads würd ich übrigens direkt mit pb-internen mitteln die priorität umstellen (ThreadPriority()) da ist 16 standart und 32 maximum

aber ich würd dir trozdem empfehlen die thread-schleife mit einem delay zu entlasten anstatt sie zig-millionen mal durchlaufen zu lassen und immer die zeitdifferenz zu untersuchen. Wenn dein programm was berechnen will macht es das auch. Außer natürlich dein ziel ist es eine hohe cpu auslastung zu erreichen.

und noch etwas: ich würde auch WaitWindowEvent() anstatt WindowEvent() nehmen. ist eigentlich auch cpu schonender und dank den neuen WindowTimer() hat das auch keine nachteile mehr

Re: Laufschrift Transparent machen ?

Verfasst: 06.03.2010 11:31
von Dristar
@ hörmi

Nur leider ruckeln die laufschriften leicht (auch deine). Wolte eine Laufschrift wo ich den speed stufenlos regeln kann. Die Laufschrift soll an bestimmten text abschnitten stoppen und langsam wieder loslaufen und das ganze ruckel frei.

mfg Dristar

Re: Laufschrift Transparent machen ?

Verfasst: 06.03.2010 11:56
von hörmi
ich glaube das ist mehr ein problem von den 32bit bildern. leider

hab hier ein programm von fluid byte gefunden
http://purebasic.fr/german/viewtopic.ph ... 57#p253757
teste das mal und dann nochmal nur das du das bild auf 32 statt auf 24 bit verwendest und du wirst den unterschied sehen

ist zwar nicht mehr transparent aber so gut wie^^

Code: Alles auswählen

Procedure Laufschrift(*LT.Lauftext)
Define.l TextWidth
  Repeat
    StartDrawing(ImageOutput(*LT\ImageID))
      Box(0,0,*Lt\Width,*Lt\Height,GetSysColor_(#COLOR_3DFACE))
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawText(*lt\PosX,0,*lt\Text,RGBA(0,0,0,255))
      TextWidth=TextWidth(*lt\Text)
    StopDrawing()
    SetGadgetState(*Lt\GadgetID,ImageID(*lt\ImageID))
    *lt\posx-1
    If *lt\loop
      If *lt\posx<-TextWidth
        *lt\posx+TextWidth+*lt\Width
      EndIf
    EndIf
    Delay(*lt\Delay)
  ForEver
EndProcedure
Procedure CreateLaufschrift(*LT.Lauftext,x,y,Width,Height,Text.s,Delay,StartPos,Loop)
  *LT\Width=Width
  *LT\Height=Height
  *LT\Text=Text
  *LT\GadgetX=x
  *LT\GadgetY=y
  *LT\Delay=Delay
  *LT\PosX=StartPos
  *LT\Loop=Loop
  *LT\GadgetID=ImageGadget(-1,*LT\GadgetX,*LT\GadgetY,*LT\Width,*LT\Height,0)
  *LT\ImageID=CreateImage(-1,*LT\Width,*LT\Height,24)
  *LT\Thread=CreateThread(@Laufschrift(),*LT)
  ThreadPriority(*LT\Thread,32)
EndProcedure