Tranparentes Fenster und Alphablending

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Hoto
Beiträge: 294
Registriert: 01.09.2004 22:51

Tranparentes Fenster und Alphablending

Beitrag 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?
Zuletzt geändert von Hoto am 01.07.2008 14:27, insgesamt 1-mal geändert.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag 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
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
Hoto
Beiträge: 294
Registriert: 01.09.2004 22:51

Beitrag 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.
Benutzeravatar
Hoto
Beiträge: 294
Registriert: 01.09.2004 22:51

Beitrag von Hoto »

Niemand noch einen Tipp?
Benutzeravatar
Hoto
Beiträge: 294
Registriert: 01.09.2004 22:51

Beitrag 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.
Benutzeravatar
Deluxe0321
Beiträge: 336
Registriert: 19.05.2006 00:31
Kontaktdaten:

Beitrag 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 
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Es gibt doch diese Lib von Danilo in PBOSL, SkinWinDings oder so.
Vielleicht reicht dir das ja schon.
Benutzeravatar
Hoto
Beiträge: 294
Registriert: 01.09.2004 22:51

Beitrag 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.
Benutzeravatar
Deluxe0321
Beiträge: 336
Registriert: 19.05.2006 00:31
Kontaktdaten:

Beitrag 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
Benutzeravatar
Hoto
Beiträge: 294
Registriert: 01.09.2004 22:51

Beitrag 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.
Antworten