[erledigt] Image-Hintergrund transparent statt schwarz ?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

[erledigt] Image-Hintergrund transparent statt schwarz ?

Beitrag 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
Zuletzt geändert von scholly am 17.05.2008 15:58, insgesamt 1-mal geändert.
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
tobe
Beiträge: 146
Registriert: 14.09.2006 17:33
Wohnort: Oktoberfest

Beitrag 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
PureBasic 4.40 (Windows - x86)
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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:
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Naja, ich bin schon nen kleiner API Junkie. <)

Ich kann ja vielleicht noch mal ne neue Variante mit weniger API basteln.
Zuletzt geändert von Fluid Byte am 14.06.2009 18:12, insgesamt 1-mal geändert.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag 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
Zuletzt geändert von Xaby am 15.02.2008 18:11, insgesamt 1-mal geändert.
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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....
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Antworten