Seite 1 von 1

[erledigt] Image-Hintergrund transparent statt schwarz ?

Verfasst: 14.02.2008 13:31
von scholly
moin, moin...

Meine Suchschwäche führt mal wieder nicht zum Ziel :(

Was muß ich ändern, damit der Gitter-Hintergrund transparent wird und ich den Text sehen kann ?

Code: Alles auswählen

#main_win = 0
#main_win_width = 660
#main_win_height = 230

#text_image = 1
#text_image_Gadget = 2
#gitter_image = 3
#gitter_image_Gadget = 4
#image_width = 640
#image_height = 200

#spingadget_4_height = 5
#spingadget_4_width = 6

#text_gadget_height = 7
#text_gadget_width = 8

Procedure change_gitter()
  HideGadget(#gitter_image_Gadget,1)
   
  If StartDrawing(ImageOutput(#gitter_image))
    Box(0, 0, #image_width, #image_height)
    DrawingMode(#PB_2DDrawing_Transparent)
    x_start = 0
    While x_start < #image_width
      x_start + GetGadgetState(#spingadget_4_width) 
      Line(x_start, 0, 0, #image_height, RGB(255,255,255)) 
    Wend
  
    y_start = 0
    While y_start < #image_height
      y_start + GetGadgetState(#spingadget_4_height) 
      Line(0,y_start, #image_width,0, RGB(255,255,255)) 
    Wend 
  
    StopDrawing()
  EndIf
  SetGadgetText(#spingadget_4_height, Str(GetGadgetState(#spingadget_4_height)))
  SetGadgetText(#spingadget_4_width, Str(GetGadgetState(#spingadget_4_width)))
  
  HideGadget(#gitter_image_Gadget,0)
EndProcedure

If OpenWindow(#main_win, 100, 200, #main_win_width, #main_win_height, "Font Gitter Test")

  LoadFont(1, "FixedSys", 32)
  If CreateImage(#text_image, #image_width, #image_height)
    If StartDrawing(ImageOutput(#text_image))
      
      DrawingFont(FontID(1)) 
      DrawingMode(#PB_2DDrawing_Transparent)
      FrontColor(RGB(255,0,0)) 
      DrawText(0,0,"Hello, this is a test")
      StopDrawing()
    EndIf
  EndIf
  
  If CreateImage(#gitter_image, #image_width, #image_height)
    If StartDrawing(ImageOutput(#gitter_image))
      DrawingMode(#PB_2DDrawing_Transparent)
      
      x_start = 0
      While x_start < #image_width
        x_start + 20
        Line(x_start, 0, 0, #image_height, RGB(255,255,255)) 
      Wend
      y_start = 0
      While y_start < #image_height
        y_start + 20
        Line(0,y_start, #image_width,0, RGB(255,255,255)) 
      Wend
      
      StopDrawing()
    EndIf
  EndIf 
 
  CreateGadgetList(WindowID(#main_win))
  TextGadget     (#text_gadget_height,   0, 3, 30, 20,"Höhe:")
  SpinGadget     (#spingadget_4_height, 35, 0, 50, 20, 0, 100)
  SetGadgetState (#spingadget_4_height, 20) : SetGadgetText(#spingadget_4_height, "20")
  
  TextGadget     (#text_gadget_width,  120, 3, 40, 20,"Breite:")
  SpinGadget     (#spingadget_4_width, 155, 0, 50, 20, 0, 100)
  SetGadgetState (#spingadget_4_width, 20) : SetGadgetText(#spingadget_4_width, "20")
    
  ImageGadget(#text_image_Gadget, 0, 25, 0, 0, ImageID(#text_image))
  ImageGadget(#gitter_image_Gadget, 0, 25, 0, 0, ImageID(#gitter_image))
  
  Repeat
    EventID = WaitWindowEvent()
    If EventID = #PB_Event_Gadget
      EventGadgetID = EventGadget()
      Select EventGadgetID
        Case #spingadget_4_height : change_gitter()
        Case #spingadget_4_width  : change_gitter()
      EndSelect
    EndIf
  Until EventID = #PB_Event_CloseWindow   
  
EndIf

End
@Fluid:
mit dem bitblt_() komm ich nich klar, deswegen habbichs so versucht.

mDv... scholly

Verfasst: 14.02.2008 16:12
von tobe
hallo scholly,

ich würde einfach alles auf ein image malen

Code: Alles auswählen

#main_win_width = 660
#main_win_height = 230
#image_width = 640
#image_height = 200


Enumeration
#main_win
#gitter_image
#gitter_image_Gadget
#spingadget_4_height
#spingadget_4_width
#text_gadget_height
#text_gadget_width
EndEnumeration

Procedure change_gitter()
  HideGadget(#gitter_image_Gadget,1)
  
  If StartDrawing(ImageOutput(#gitter_image))
      Box(0, 0, #image_width, #image_height)
      DrawingMode(#PB_2DDrawing_Transparent)
      FrontColor(RGB(255,0,0))
      x_start = 0
      While x_start < #image_width
        x_start + GetGadgetState(#spingadget_4_width)
        Line(x_start, 0, 0, #image_height, RGB(255,255,255))
      Wend
      
      y_start = 0
      While y_start < #image_height
        y_start + GetGadgetState(#spingadget_4_height)
        Line(0,y_start, #image_width,0, RGB(255,255,255))
      Wend
      DrawingFont(FontID(1))
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawText(0,0,"Hello, this is a test")
      
    StopDrawing()
  EndIf
  SetGadgetText(#spingadget_4_height, Str(GetGadgetState(#spingadget_4_height)))
  SetGadgetText(#spingadget_4_width, Str(GetGadgetState(#spingadget_4_width)))
  SetGadgetState(#gitter_image_Gadget, ImageID(#gitter_image))
  HideGadget(#gitter_image_Gadget,0)
EndProcedure

If OpenWindow(#main_win, 100, 200, #main_win_width, #main_win_height, "Font Gitter Test")
  
  CreateGadgetList(WindowID(#main_win))
  TextGadget     (#text_gadget_height,   0, 3, 30, 20,"Höhe:")
  SpinGadget     (#spingadget_4_height, 35, 0, 50, 20, 0, 100)
  SetGadgetState (#spingadget_4_height, 20) : SetGadgetText(#spingadget_4_height, "20")
  
  TextGadget     (#text_gadget_width,  120, 3, 40, 20,"Breite:")
  SpinGadget     (#spingadget_4_width, 155, 0, 50, 20, 0, 100)
  SetGadgetState (#spingadget_4_width, 20) : SetGadgetText(#spingadget_4_width, "20")

  ImageGadget(#gitter_image_Gadget, 0, 25, 0, 0, 0)
  CreateImage(#gitter_image, #image_width, #image_height)
  LoadFont(1, "FixedSys", 32)
  change_gitter()
  Repeat
    EventID = WaitWindowEvent()
    If EventID = #PB_Event_Gadget
      EventGadgetID = EventGadget()
      Select EventGadgetID
        Case #spingadget_4_height : change_gitter()
        Case #spingadget_4_width  : change_gitter()
      EndSelect
    EndIf
  Until EventID = #PB_Event_CloseWindow   
  
EndIf

End
mfG
tobe

Verfasst: 14.02.2008 16:50
von scholly
Zu einem ähnlichen Code bin ich auch gekommen, aber wenn ich die Spingadgets exessiv beklicke, flackerts doch etwas.
Fluid hatte mich schon auf mögliches Flickern hingewiesen, das man verhindern könne, wenn man das Gitter per BitBlt_() anzeigen würde.
Dafür bin ich aber mal wieder zu doof :freak:

Verfasst: 14.02.2008 19:22
von Fluid Byte
Guckst du hier:

Code: Alles auswählen

Global GW = 16, GH = 16

CreateImage(0,320,240)
StartDrawing(ImageOutput(0))
For i=0 To 239
	Box(0,i,320,1,RGB(255,50 + (205 * i / 239),0))
Next
StopDrawing()

Procedure WindowCallback(hWnd,uMsg,wParam,lParam)
    Select uMsg
        Case #WM_PAINT        
        hdcMain = BeginPaint_(hwnd,ps.PAINTSTRUCT)
                       
        ; -> create temporary image for output
        IW = ImageWidth(0) : IH = ImageHeight(0)
        
 		hbmBitmap = CreateCompatibleBitmap_(hdcMain,IW,IH)
 		
 		; -> prepare output device context
 		hdcOutput = CreateCompatibleDC_(hdcMain) 		
 		SelectObject_(hdcOutput,hbmBitmap)
 		 		 		
 		; -> draw input image
		hdcInput = CreateCompatibleDC_(hdcOutput)
		SelectObject_(hdcInput,ImageID(0))
		BitBlt_(hdcOutput,0,0,IW,IH,hdcInput,0,0,#SRCCOPY)
		DeleteDC_(hdcInput)
		
		; -> draw grid
		hPenGrid = CreatePen_(#PS_SOLID,0,#White)
		
		SelectObject_(hdcOutput,hPenGrid)		
		
		For GX=0 To (IW / GW) - 1
			MoveToEx_(hdcOutput,GX * GW + GW - 1,0,0)
			LineTo_(hdcOutput,GX * GW + GW - 1,ImageHeight(0))
		Next		

		For GY=0 To (IH / GH) - 1
			MoveToEx_(hdcOutput,0,GY * GH + GH - 1,0)
			LineTo_(hdcOutput,ImageWidth(0),GY * GH + GH- 1)	
		Next
		
		DeleteObject_(hPenGrid)		

 		; -> draw output image
		BitBlt_(hdcMain,0,0,IW,IH,hdcOutput,0,0,#SRCCOPY)
		DeleteDC_(hdcOutput)
 		
		; -> clean up
 		DeleteObject_(hbmBitmap)
 		
 		EndPaint_(hwnd,ps)
    EndSelect
     
    ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

OpenWindow(0,0,0,400,300,"Bitmap Grid",#WS_OVERLAPPEDWINDOW | 1 | #WS_CLIPCHILDREN)
CreateGadgetList(WindowID(0))
TrackBarGadget(0,10,250,200,40,8,64,#TBS_BOTH)
TrackBarGadget(1,340,10,40,200,8,64,#TBS_VERT | #TBS_BOTH)

SetGadgetState(0,GW)
SetGadgetState(1,GH)

SetWindowCallback(@WindowCallback())

Repeat
	EventID = WaitWindowEvent()

	If EventID = #PB_Event_Gadget
		Select EventGadget()
			Case 0
			GW = GetGadgetState(0)
			InvalidateRect_(WindowID(0),0,0)
			
			Case 1
			GH = GetGadgetState(1)
			InvalidateRect_(WindowID(0),0,0)			
		EndSelect
	EndIf
Until EventID = #PB_Event_CloseWindow

Verfasst: 14.02.2008 20:45
von scholly
Puhhhh...
...ganz schön starker Tobak (für meinereiner) :oops:
...guck ich gaaanz schnell wieda wech :pfeiff:

Still und heimlich hatte ich gehofft, das wäre ein leicht verständlicher 2-10-Zeiler, aber das geht doch heftig über das hinaus, was ich auf Anhieb verstehe.

Ich hab den Code aber für eine stille Stunde schon gut abgelegt <)

:allright: danke... scholly

Verfasst: 14.02.2008 20:54
von Fluid Byte
Naja, ich bin schon nen kleiner API Junkie. <)

Ich kann ja vielleicht noch mal ne neue Variante mit weniger API basteln.

Verfasst: 14.02.2008 21:52
von scholly
So sind's, die API-Junkies :lol:

Kann sein, daß ich da allein steh, aber ich bin bei PB hängengeblieben, weil es eigentlich recht einfach ist.
Sobald dann welche wie Deinereiner daherkommen und mein schön zurechtgmachtes (ProGrammier-)Wohnzimmer mit hWnd, uMsg, wParam, lParam und ähnlichem Abstrakten dekorieren, wird mir ganz anders.
Ich benutz lieber FMPOV "aussagekräftige" Variablen, damit ich auch verstehe, was ich mir da mal zusammengecodet habe und immer nur 1:1 von Euch Spezis zu übernehmen, macht mir nicht wirklich Spaß.

Auf der anderen Seite hat hier aber manch ähnlicher Code 3-4 Wochen 'rumgelegen und dann ist auch bei mir der letzte Pfennig des Groschens gefallen und ich hab ihn so verstanden, daß ich ihn auf meinen Bedarf ummodeln konnte.

Also für mich brauchste Dich nicht unbedingt weiter damit zu beschäftigen, ich stehl nich gern anderer Leute Zeit.

Erzähl mir lieber mal, ob es einen 2-3 Zeiler gibt, mit dem man feststellen kann, ob in einem schwarzen Rechteck ein andersfarbiger Buchstabe steht :lol:

sehnsüchtig auf die Welsh Open wartend... scholly

Verfasst: 15.02.2008 15:13
von Xaby
Zu einem ähnlichen Code bin ich auch gekommen, aber wenn ich die Spingadgets exessiv beklicke, flackerts doch etwas.
Der Code von tobe beinhaltet:

Code: Alles auswählen

HideGadget(#gitter_image_Gadget,1) 
Das hat da nichts verloren.

Das Gadget muss doch nicht ausgeschaltet werden oder versteckt werden.
Das Bild auf dem Gadget wird erst erneuert, wenn man SetGadgetState()
benutzt.

Wenn du also HideGadget(#gitter_image_Gadget,1) entfernst, dann blinkt es auch nicht mehr :roll:

Code: Alles auswählen


CreateImage(1,320,240)

;/ Hintergrund-Bild
CreateImage(0,320,240)
StartDrawing(ImageOutput(0))
For i=0 To 239
   Box(0,i,320,1,RGB(255,50 + (205 * i / 239),0))
Next
StopDrawing()



Procedure ZeichneNeu(xBreite,yHoehe)
  CopyImage(0,1)
    StartDrawing(ImageOutput(1))
    
      For i=0 To 320 / xBreite
        LineXY(xBreite*i,0,xBreite*i,240,RGB(255,255,255))
      Next
    
      For i=0 To 240 / yHoehe
        LineXY(0,yHoehe*i,320,yHoehe*i,RGB(255,255,255))
      Next
    
      DrawingMode(#PB_2DDrawing_Transparent)    
       DrawText(100, 120, "H A L L O   F R E U N D E",RGB(255,255,0))
       DrawText(101, 121, "H A L L O   F R E U N D E",RGB(0,0,0))

    StopDrawing()
  SetGadgetState(2,ImageID(1))
EndProcedure

OpenWindow(0,0,0,400,300,"Bitmap Grid",#WS_OVERLAPPEDWINDOW | 1 | #WS_CLIPCHILDREN)
CreateGadgetList(WindowID(0))


ImageGadget(2,0,0,300,300,ImageID(1))
ZeichneNeu(20,20)

TrackBarGadget(0,10,250,200,40,8,64)
TrackBarGadget(1,340,10,40,200,8,64,#PB_TrackBar_Vertical)

SetGadgetState(0,20)
SetGadgetState(1,20)


Repeat
   EventID = WaitWindowEvent()

   If EventID = #PB_Event_Gadget
      GadgetNr= EventGadget()
      
      ZeichneNeu(GetGadgetState(0),GetGadgetState(1))      
      
   EndIf
Until EventID = #PB_Event_CloseWindow

Verfasst: 15.02.2008 16:02
von scholly
Auch ein netter Schnipsel :)
Aaaber:
in Deinem code rufst Du ZeichneNeu(20,20) vor ImageGadget(2,0,0,300,300,ImageID(1)) auf, das gibt einen (Error) #Gadget object not initialized.

:allright: Danke für den Hinweis bezüglich HideGadget(), da hatte ich wohl was falsches in der vorletzten Gehirnzelle abgelegt....