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:

Bild

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.