Seite 1 von 1

PanelGadget auf Hintergrundbild: Transparenzprobleme

Verfasst: 24.11.2013 20:08
von SBond
Hi Leute,

gibt es eine Möglichkeit den Hintergrund eines PanelGadgets transparent zu machen?
Ich bin nicht in der Lage das Problem zu lösen.

Ich denke es wird über eine API-Funktion möglich sein, aber ich habe dahingehend noch zu wenig Erfahrung.
Könnt ihr mir helfen?

oben: wie es jetzt ist; unten: so würde ich es gerne haben
Bild


aktueller Beispielcode.

Code: Alles auswählen

UsePNGImageDecoder()
UsePNGImageEncoder()

Enumeration
	#GUI
	#Reiter
	#Image
	#Canvas
EndEnumeration

OpenWindow(#GUI, 0, 0, 400, 200, "Test-GUI", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

LoadImage(#Image, "test.png")
CanvasGadget(#Canvas,0, 0, 400, 200)
StartDrawing(CanvasOutput(#Canvas))
DrawAlphaImage(ImageID(#Image), 0, 0) 
StopDrawing()
DisableGadget( #Canvas, #True)

PanelGadget(#Reiter, 20, 20, 360,160)
AddGadgetItem(#Reiter, -1, "Reiter 1")
AddGadgetItem(#Reiter, -1, "Reiter 2")
AddGadgetItem(#Reiter, -1, "Reiter 3")

Repeat
	
	Select WaitWindowEvent(100)
		
	Case #PB_Event_CloseWindow
		End

	EndSelect

ForEver
lg
SBond

Re: PanelGadget auf Hintergrundbild: Transparenzprobleme

Verfasst: 24.11.2013 23:46
von Bisonte
Da es unter Windows laufen soll (entnehme ich aus deinem Wunsch auch API einsetzen zu wollen), kann ich Dir
empfehlen, das Hintergrundbild eines Fensters nicht mit einem Canvas zu erstellen. Da Purebasic keine z-Order bei Gadgets
kennt, geht es entweder nur mit dem DisableGadget "Trick" eines ImageGadgets oder per WinAPI mit

Code: Alles auswählen

Procedure SetWindowBackGround(Window, Image)
  
  Protected hBrush
  Protected hImage = #False
  
  If IsWindow(Window)
    hWnd = WindowID(Window)
    If IsImage(Image)
      hImage = ImageID(Image)
    Else
      If Image : hImage = Image : EndIf
    EndIf
    
    If hWnd And hImage
      hBrush = CreatePatternBrush_(hImage)
      SetClassLongPtr_(hWnd, #GCL_HBRBACKGROUND, hBrush)
      InvalidateRect_(hWnd, #Null, #True)
      UpdateWindow_(hWnd)
      ProcedureReturn #True
    EndIf
  EndIf

  ProcedureReturn #False
  
EndProcedure
Wobei ich die API Methode vorziehe. Ansonsten kenne ich gerade keine (auch in RSBasics WINAPI Library nichts gefunden)
Möglichkeit, den PanelGadget-Hintergrund auf Trasnparent zu setzen. Daher mein Vorschlag ein Canvas Gadget für die Tabs zu nehmen,
die dann einen Container ein/ausblenden. So ähnlich wie Stargate's TabBarGadget (<- suchbegriff) wie du sie auch in der IDE
laufend benutzt.

Dazu muss man beim Canvas halt immer nur die Groesse anzeigen (ResizeGadget), die gerade durch die Tabs gebraucht wird,
oder man kopiert per GrabImage den bereich des Hintergrundbildes in das Canvas, den es überdeckt.

(Achtung: Das CanvasGadget muss immer mit der maximalen Grösse erstellt werden (die man später per ResizeGadget() verkleinern kann,
da es zwar möglich ist ein Canvas kleiner zu machen, aber nicht grösser (Es ist zwar möglich, aber es wird nicht angezeigt.)
(im englischen Forum ist eine Bugmeldung)

Re: PanelGadget auf Hintergrundbild: Transparenzprobleme

Verfasst: 25.11.2013 20:50
von SBond
super ;)

das sieht ja ganz interessant aus :)
danke dir.

..ach ja... kann es sein dass abends immer die Foren offline sind?


lg
SBond

Re: PanelGadget auf Hintergrundbild: Transparenzprobleme

Verfasst: 25.11.2013 20:56
von RSBasic
Nein, die Foren waren bis jetzt immer rund um die Uhr (bzw. 9-0 Uhr auf jeden Fall) online.
Vielleicht hast du dieses Problem.
Wenn ja: Proxy nutzen, z.B. mit Hilfe eines Browser-Addons.

Re: PanelGadget auf Hintergrundbild: Transparenzprobleme

Verfasst: 25.11.2013 21:33
von SBond
gut zu wissen ;)

vielen Dank

lg
SBond

Re: PanelGadget auf Hintergrundbild: Transparenzprobleme

Verfasst: 01.12.2013 19:18
von SBond
Hi Leute,

also "TabBarGadget" von STARGÅTE war genau das richtige ;)
Allerdings muss es noch etwas angepasst werden. Ich habe es erstmal 'quick and dirty' angepasst, um es zu testen.

Bild

Das Prinzip ist ganz einfach...
Ich kopiere einfach aus dem Hintergrundbild die Bereiche aus und zeichne diese dann in die jeweiligen Canvas-Gadgets ein.
sieht in etwa so aus:

Code: Alles auswählen

LoadImage(#Wallpaper, "Wallpaper.png")
...
GrabImage(#Wallpaper, #TabBackgroundImage, GadgetX(#Panel), GadgetY(#Panel), GadgetWidth(#Panel), GadgetHeight(#Panel))
DrawAlphaImage(ImageID(#TabBackgroundImage), 0, 0) 

Re: PanelGadget auf Hintergrundbild: Transparenzprobleme

Verfasst: 01.12.2013 19:49
von RSBasic
Gute Idee und sieht gut aus. :allright: