Seite 1 von 1

2DDrawing: Alphaimage in PB4.51

Verfasst: 17.09.2010 00:56
von Häns
Hallo, nach langer Zeit melde ich mal wieder...

Ich sitze z.Zt. am Projekt "Zeitschiene", in der -ähnlich wie beim EPG (Electronic Programming Guide)- auf Zeitschlitzen Balken verschiedener Länge mit Informationen dargestellt werden. Sie sollen auch bei bestimmten Situationen ihre Transparenz ändern. Da ich absoluter Beginner in Sache 2DDrawing und Alphakanal bin, möchte ich euch um Verbesserungsvorschläge bitten:

Code: Alles auswählen

;Test mit Alphakanal unter PB4.51
;dient nur zur Veranschaulichung und zum Testen
;DrawLBText aus PureBasic-Forum von TomS

Procedure DrawLBText(width, text.s)
    line.s=""
    y=20
    x=15
   
    k = CountString(text," ")

    For loop = 1 To k
      
      If TextWidth(line + StringField(text,loop," "))<width       
        line = line + StringField(text,loop," ")+" "
      Else
        DrawText(x,y,line,$FFFFFF)
        y+20
        line=StringField(text,loop," ")+" "
      EndIf
    Next
    
    line = line + StringField(text,loop," ")+" "
    DrawText(x,y,line,$FFFFFF)
                
  EndProcedure
  

If OpenWindow(0, 0, 0, 800, 600, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

  
  If CreateImage(0, 800, 600) And StartDrawing(ImageOutput(0))
    Box(0, 0, 800, 600, RGB(255, 255, 255))
      
    For x = 10 To 760 Step 50
       Line(x, 20, 1, 550, RGB(200, 200, 200))
    Next
    StopDrawing()
            
    ImageGadget(0, 0, 0, 0,0, ImageID(0))
          
  EndIf 
  
    
  If CreateImage(1, 300, 120,32) And StartDrawing(ImageOutput(1))

      DrawingMode(#PB_2DDrawing_AlphaChannel)
      Box(0, 0, 300, 120, $000000)

      DrawingMode(#PB_2DDrawing_AlphaBlend)
      RoundBox(0, 0, 300, 120, 20, 20,RGBA(0, 0, 0, 155))
       
      DrawingMode(#PB_2DDrawing_Gradient)      
      BackColor($B7C4FE)
      FrontColor($1944FA)
      LinearGradient(90, 10, 90, 40)    
      RoundBox(0, 0, 300, 120, 20, 20)

;       DrawAlphaImage(ImageID(1), 0, 0)  ??
  
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawLBText(220,"10:00 - 12:00 Uhr Irgendeine tolle Sendung Nummer auf Pro8 oder wo war das?")  

      StopDrawing()
      
      
      ImageGadget(1, 100, 130, 0,0, ImageID(1))
      
    EndIf 
    
    If CreateImage(2, 600, 100,32) And StartDrawing(ImageOutput(2))

      DrawingMode(#PB_2DDrawing_AlphaChannel)
      Box(0, 0, 600, 100, $000000)

      DrawingMode(#PB_2DDrawing_AlphaBlend)
      RoundBox(0, 0, 600, 100, 20, 20,RGBA(0, 0, 0, 128))
       
      DrawingMode(#PB_2DDrawing_Gradient)      
      BackColor($A1FE9B)
      FrontColor($00FF00)
      LinearGradient(90, 10, 90, 40)    
      RoundBox(0, 0, 600, 100, 20, 20)
      
;       DrawAlphaImage(ImageID(2), 0, 0)
      
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawLBText(420,"14:00 - 18:00 Uhr Sendung xy-aufgeklärt nicht verpassen!")
      
      StopDrawing()
      
      
      ImageGadget(2, 100, 300, 100,100, ImageID(2))
      
    EndIf 
    
    
    If CreateImage(3, 200, 100,32) And StartDrawing(ImageOutput(3))

      DrawingMode(#PB_2DDrawing_AlphaChannel)
      Box(0, 0, 200, 100, $000000)

      DrawingMode(#PB_2DDrawing_AlphaBlend)
      RoundBox(0, 0, 200, 100, 20, 20,RGBA(0, 0, 0, 255))
       
      DrawingMode(#PB_2DDrawing_Gradient)      
      BackColor($FEACAC)
      FrontColor($FF0000)
      LinearGradient(90, 10, 90, 40)    
      RoundBox(0, 0, 200, 100, 20, 20)
      
;       DrawAlphaImage(ImageID(3), 0, 0)
      
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawLBText(220,"20:00 - 20:15 Uhr Tagesschau gucken!")

      StopDrawing()
      
      
      ImageGadget(3, 100, 450, 100,100, ImageID(3))
      
    EndIf 
    
    
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow

EndIf
Ist der Code einigermaßen "sauber" :mrgreen: , oder ist da irgendwo des Guten zu viel oder im Ansatz falsch verstanden/programmiert worden?

Dankesgruß
Häns

Re: 2DDrawing: Alphaimage in PB4.51

Verfasst: 17.09.2010 15:00
von Darie
Sieht doch gut aus ! :wink:

Re: 2DDrawing: Alphaimage in PB4.51

Verfasst: 17.09.2010 15:41
von STARGÅTE
Kleiner Hinweis:
PureBasic Hilfe hat geschrieben:Der 'Tiefe'-Wert kann mit #PB_Image_Transparent kombiniert werden (mit dem bitweisen oder dem '|' Operator), um ein Bild zu erstellen, bei dem der Alpha-Kanal auf völlige Transparenz gesetzt ist.
Somit wird aus:

Code: Alles auswählen

  If CreateImage(1, 300, 120,32) And StartDrawing(ImageOutput(1))

      DrawingMode(#PB_2DDrawing_AlphaChannel)
      Box(0, 0, 300, 120, $000000)
vereinfacht das hier:

Code: Alles auswählen

  If CreateImage(1, 300, 120,32|#PB_Image_Transparent) And StartDrawing(ImageOutput(1))

Re: 2DDrawing: Alphaimage in PB4.51

Verfasst: 17.09.2010 21:06
von Häns
Danke Darie fürs Reinschauen!

Und danke an StargÅte für den Tipp! Gerade diese Kombinationen haben mir Kopfschmerzen verursacht, als ich versucht habe, den Roundbox die Modi Gradient und Transparenz zu kombinieren, so wie in Hilfe beschrieben:
Um mehrere Modi auf einmal zu nutzen, müssen Sie den '|' (OR) Operator verwenden. Das folgende ist ein Beispiel für umrissene Flächen, die im XOR-Modus verschmolzen werden:
DrawingMode(#PB_2DDrawing_Outlined | #PB_2DDrawing_XOr)
Und ich versuchte:

Code: Alles auswählen

DrawingMode(#PB_2DDrawing_Gradient | #PB_2DDrawing_Transparent)   
      BackColor($A1FE9B)
      FrontColor($00FF00)
      LinearGradient(90, 10, 90, 40)   
      RoundBox(0, 0, 600, 100, 20, 20)
     
Es will einfach nicht funktionieren...

Gibt es da eine (elegante) Lösung, oder liege ich irgendwo mit meinen Gedanken falsch?

Häns