Transparent Window Backgrounds

BlitzMax Forums/Brucey's Modules/Transparent Window Backgrounds

GA(Posted 2008) [#1]
Hello, I have recently been messing around with customized windows on Mac OS.

A good example is found on the apple development website:

http://developer.apple.com/samplecode/RoundTransparentWindow/index.html

However I seem to have stumbled into a small problem while using wxMax. While the window backgound colour can be set, I have been unable to clear it entirely. Is this possible within wxMax?

I have been able to, crudely, hack this functionality into MaxGUI using the following functions inserted after a window is created (within NSInitGadget, cocoa.macos.m):

[window setOpaque:NO];
[window setBackgroundColor: [NSColor clearColor]];
[window setHasShadow: YES];

But I am at a loss as where to include them within the wxMax module for a similar effect.

Any insight into this matter would be greatly appreciated.


Brucey(Posted 2008) [#2]
Is this what you are after?
SuperStrict
 
Framework wx.wxApp
Import wx.wxFrame
 
New MyApp.Run()
 
Type MyApp Extends wxApp

	Method OnInit:Int()
	
		Local sim:Simple = Simple(New Simple.Create(Null, wxID_ANY, ..
			"Simple", -1, -1, 250, 150))
		
		' set alpha transparency
		sim.SetTransparent(128)
		
		sim.Show(True)
 
		Return True
	End Method

End Type

Type Simple Extends wxFrame
 
	Method OnInit()
		
		Centre()
 
	End Method
	
End Type




GA(Posted 2008) [#3]
Not quite, while the transparency is exactly what I am after, the background colour itself remains and the effect covers any image that is drawn to it.

This is a quick example (replace circle.png with an alpha enabled png):

SuperStrict
 
Framework wx.wxApp
Import wx.wxFrame
Import wx.wxImage
 
New MyApp.Run()
 
Type MyApp Extends wxApp

	Method OnInit:Int()
		wxImage.AddHandler(New wxPNGHandler)

		Local txt:Example = Example(New Example.Create(Null, wxID_ANY, ..
			"Example", -1, -1, 300, 300))
		txt.Show(True)
 
		Return True
	End Method

End Type

Type Example Extends wxFrame
 
	Method OnInit()
		
		ConnectAny(wxEVT_PAINT, OnPaint)
		Centre()
		SetTransparent(100)
 
	End Method
	
	Function OnPaint(event:wxEvent)
		
		Local dc:wxPaintDC = New wxPaintDC.Create(wxWindow(event.parent))

		Local m_Image2:wxImage = wxImage.CreateFromFile("circle.png", wxBITMAP_TYPE_PNG)
		dc.DrawBitmap(wxBitmap.CreateFromImage(m_Image2),0,0,True)	

		dc.Free()
	End Function
	
End Type 


What I am aiming for is a Opaque image drawn to the window, with the desktop shown in the background and the areas where the image has alpha.


Brucey(Posted 2008) [#4]
Okay... I think I'm getting the hang of it now...

How's about :

and supporting image...


And, here's a zip of the above two files for convenience : shape_example.zip

Left-click and drag.... Cmd-Q to quit... Just the basics.

You will need to update your wxMax to the latest in SVN, for a wee fix/update to wxRegion.

And apologies for the purple haze around the edge of the donut... I just threw it all together 10 mins ago.

:-)


Brucey(Posted 2008) [#5]
Main caveat is of course a lack of Alpha support... Not sure if it can do it this way, since it's Carbon, not Cocoa..


DavidDC(Posted 2008) [#6]
Yay! A shaped frame demo...