Page 1 of 1

PB5.2 : set windows transparency (cross-platform)

Posted: Mon Jul 22, 2013 10:17 am
by eddy
This function makes your window transparent.
It returns #TRUE if windows opacity has been changed.

I aggregate some past tips into a function :arrow: source1 + source2

@Fred
It could be a futur PB command :wink:

Code: Select all

; PB 5.2 - set windows transparency (Mac,Linux,Windows)
CompilerIf #PB_Compiler_OS=#PB_OS_Linux
   ImportC "-gtk"
      gtk_window_set_opacity(*Window.i, Opacity.d);
      gtk_widget_is_composited(*Widget)
   EndImport
   
   Procedure.i SetWindowTransparency(Window, Transparency=255)
      Protected *windowID=WindowID(Window), alpha.d=Transparency/255.0
      If Transparency>=0 And Transparency<=255
         If gtk_widget_is_composited(*windowID)
            gtk_window_set_opacity(*windowID, alpha.d)
            ProcedureReturn #True
         EndIf
      EndIf
   EndProcedure
CompilerElseIf #PB_Compiler_OS=#PB_OS_MacOS
   Procedure.i SetWindowTransparency(Window, Transparency=255)
      Protected *windowID=WindowID(Window), alpha.CGFloat=Transparency/255.0
      If Transparency>=0 And Transparency<=255
         CocoaMessage(0, *windowID, "setOpaque:", #NO)
         If CocoaMessage(0, *windowID, "isOpaque")=#NO
            CocoaMessage(0, *windowID, "setAlphaValue:@", @alpha)
            ProcedureReturn #True
         EndIf
      EndIf
   EndProcedure
CompilerElseIf #PB_Compiler_OS=#PB_OS_Windows
   Procedure.i SetWindowTransparency(Window, Transparency=255)
      Protected *windowID=WindowID(Window), exStyle=GetWindowLongPtr_(*windowID, #GWL_EXSTYLE)
      If Transparency>=0 And Transparency<=255
         SetWindowLongPtr_(*windowID, #GWL_EXSTYLE, exStyle | #WS_EX_LAYERED)
         SetLayeredWindowAttributes_(*windowID, 0, Transparency, #LWA_ALPHA)
         
         ProcedureReturn #True
      EndIf
   EndProcedure
CompilerEndIf

Re: set windows transparency (cross-platform)

Posted: Mon Jul 22, 2013 10:29 am
by flaith
:D Thanks eddy

Re: set windows transparency (cross-platform)

Posted: Mon Jul 22, 2013 10:52 am
by eddy
updated
- fix window specific code (remove one useless "if" ...)

Re: set windows transparency (cross-platform)

Posted: Mon Jul 22, 2013 12:16 pm
by Little John
Smart, thank you!

//edit:
Better use Procedure.i

Re: set windows transparency (cross-platform)

Posted: Mon Jul 22, 2013 2:17 pm
by eddy
Little John wrote:Smart, thank you!
//edit:
Better use Procedure.i
Updated

Re: set windows transparency (cross-platform)

Posted: Tue Jul 23, 2013 3:43 pm
by eddy
updated
- fix linux : gtk_window_set_opacity(*windowID, alpha.d)
- fix mac : alpha.CGFloat