Seite 1 von 3
Tranparentes Fenster und Alphablending
Verfasst: 29.06.2008 15:34
von Hoto
Ist es möglich einem Windowed Screen Transparenz zu verleihen, so das lediglich die Sprites angezeigt werden, jedoch der eigentliche Hintergrund (schwarz) nicht zu sehen ist, statt dessen sieht man dort was hinter dem Window liegt. Geht sowas irgendwie?
Verfasst: 29.06.2008 16:49
von Bisonte
screen transparent
war es was ich in die Boardsuche tippte und...
http://www.purebasic.fr/german/viewtopi ... 247#170247 kam dabei raus
MfG
Verfasst: 29.06.2008 18:59
von Hoto
Das hat mir jetzt nicht wirklich geholfen, in dem Beispielcode kann man in dem transparenten Bereich nichts mehr anzeigen lassen. Und den Hintergrund zu faken, war mir schon vorher klar, aber das hilft mir nicht wirklich weiter.
Verfasst: 30.06.2008 13:59
von Hoto
Niemand noch einen Tipp?
Verfasst: 01.07.2008 14:34
von Hoto
Ich hab den Thread mal umbenannt, um nicht noch ein Thread zu öffnen.
Inzwischen bin ich vom Windowedscreen abgekommen und will nun ein transparentes Fenster in Verbindung mit GDI+ nutzen. Das funktioniert soweit auch, doch da leider nur eine Farbe transparent gesetzt wird geht scheinbar kein richtiges Alphablending, daher sieht das Ergebnis dann so aus:
Ich nutze folgenden Code um das Fenster transparent zu schalten und dafür die Farbe Lila:
Code: Alles auswählen
SetWindowLong_(WindowID(#W_Main), #GWL_EXSTYLE, GetWindowLong_(WindowID(#W_Main),#GWL_EXSTYLE)|#WS_EX_LAYERED)
SetLayeredWindowAttributes_(WindowID(#W_Main), RGB(255,0,255), 0, 1)
Eine wirkliche Lösung für das Problem will mir nicht einfallen. Vielleicht hat ja Jemand anderes hier eine Idee.
Verfasst: 01.07.2008 21:16
von Deluxe0321
Code: Alles auswählen
;http://www.purebasic.fr/english/viewtopic.php?p=211814#211814
;netmaestro [Sat Sep 29, 2007]
Procedure StringToBStr (string$) ; By Zapman Inspired by Fr34k
Protected Unicode$ = Space(Len(String$)* 2 + 2)
Protected bstr_string.l
PokeS(@Unicode$, String$, -1, #PB_Unicode)
bstr_string = SysAllocString_(@Unicode$)
ProcedureReturn bstr_string
EndProcedure
ProcedureDLL LoadDecodedImage(Filename$)
CompilerIf Defined(GdiplusStartupInput, #PB_Structure) = 0
Structure GdiplusStartupInput
GdiPlusVersion.l
*DebugEventCallback.Debug_Event
SuppressBackgroundThread.l
SuppressExternalCodecs.l
EndStructure
CompilerEndIf
OpenLibrary(0, "gdiplus.dll")
input.GdiplusStartupInput
input\GdiPlusVersion = 1
CallFunction(0, "GdiplusStartup", @*token, @input, #Null)
CallFunction(0, "GdipCreateBitmapFromFile", StringToBStr(Filename$), @*image)
CallFunction(0, "GdipGetImageWidth", *image, @Width.l)
CallFunction(0, "GdipGetImageHeight", *image, @Height.l)
CallFunction(0, "GdipCreateHBITMAPFromBitmap", *image, @imageid.l, -1)
CallFunction(0, "GdipDisposeImage", *image)
CallFunction(0, "GdiplusShutdown", *token)
CloseLibrary(0)
return_imagenumber = CreateImage(#PB_Any, width, height, 32)
StartDrawing(ImageOutput(return_imagenumber))
DrawAlphaImage(imageid,0,0)
StopDrawing()
ProcedureReturn return_imagenumber
EndProcedure
img = LoadDecodedImage("Documents.png")
OpenWindow(0,0,0,300,300,"",#PB_Window_ScreenCentered|#PB_Window_BorderLess|#PB_Window_Invisible)
SetWindowLong_(WindowID(0),#GWL_EXSTYLE,GetWindowLong_(WindowID(0),#GWL_EXSTYLE)|#WS_EX_LAYERED)
CreateGadgetList(WindowID(0))
hDC = StartDrawing(ImageOutput(img))
sz.SIZE
sz\cx = ImageWidth(img)
sz\cy = ImageHeight(img)
ContextOffset.POINT
BlendMode.BLENDFUNCTION
BlendMode\SourceConstantAlpha = 255
BlendMode\AlphaFormat = 1
UpdateLayeredWindow_(WindowID(0), 0, 0, @sz, hDC, @ContextOffset, 0, @BlendMode, 2)
StopDrawing()
ImageGadget(0,0,0,0,0,ImageID(img))
HideWindow(0,0)
Repeat:E=WaitWindowEvent():Delay(5):Until(E=#PB_Event_CloseWindow):End
Verfasst: 01.07.2008 23:24
von edel
Es gibt doch diese Lib von Danilo in PBOSL, SkinWinDings oder so.
Vielleicht reicht dir das ja schon.
Verfasst: 02.07.2008 01:53
von Hoto
@Deluxe0321: thx, funktioniert soweit, merkwürdig ist nur, dass mein schwarzer durchsichtiger Schatten nun bläulich ist, die restlichen Farben stimmen aber. Jemand ne Idee wo das her kommen könnte?
@edel: hatte ich bereits probiert.
Verfasst: 02.07.2008 02:34
von Deluxe0321
kommt mir komisch vor. Ich habe es mit einigen PNG's versucht, alle hatten den gewünschten Schatten in richtiger Farbe.
Liegt es daher vll am Bild? Kannst es ja mal hochladen.
Gruß Marvin
Verfasst: 02.07.2008 03:04
von Hoto
Wenn ich die -1 am Ende in 0 oder eine positive Zahl ändere ist die Farbe perfekt und die Transparenz auf den ersten Blick in Ordnung.
Code: Alles auswählen
CallFunction(0, "GdipCreateHBITMAPFromBitmap", *image, @imageid.l, -1)
http://hoto.ath.cx/box.png
Funktioniert so auch auf meinem EeePC 900 unter Win XP Home.