Laufschrift Transparent machen ?

Anfängerfragen zum Programmieren mit PureBasic.
Dristar
Beiträge: 72
Registriert: 13.09.2004 12:46

Laufschrift Transparent machen ?

Beitrag 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
PB 4.61 Beta 1 , Linux Ubuntu 11.10 ...
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Laufschrift Transparent machen ?

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
hörmi
Beiträge: 106
Registriert: 10.07.2007 15:20
Kontaktdaten:

Re: Laufschrift Transparent machen ?

Beitrag 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
Zuletzt geändert von hörmi am 06.03.2010 11:26, insgesamt 1-mal geändert.
BildBild Bild
Dristar
Beiträge: 72
Registriert: 13.09.2004 12:46

Re: Laufschrift Transparent machen ?

Beitrag 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
PB 4.61 Beta 1 , Linux Ubuntu 11.10 ...
Benutzeravatar
hörmi
Beiträge: 106
Registriert: 10.07.2007 15:20
Kontaktdaten:

Re: Laufschrift Transparent machen ?

Beitrag 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
BildBild Bild
Dristar
Beiträge: 72
Registriert: 13.09.2004 12:46

Re: Laufschrift Transparent machen ?

Beitrag 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
PB 4.61 Beta 1 , Linux Ubuntu 11.10 ...
Benutzeravatar
hörmi
Beiträge: 106
Registriert: 10.07.2007 15:20
Kontaktdaten:

Re: Laufschrift Transparent machen ?

Beitrag 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
BildBild Bild
Antworten