Page 1 of 1
Window with rounded corners
Posted: Sat Jan 16, 2016 8:06 am
by deseven
Hello.
What is the correct way to do that?
I tried to implement it with this method:
Code: Select all
CocoaMessage(0,WindowID(0),"setBackgroundColor:",CocoaMessage(0,0,"NSColor colorWithPatternImage:",ImageID(0)))
I've generated the background image with two different approaches i found on this forum.
First one uses NSBezierPath bezierPathWithRoundedRect:
Code: Select all
CreateImage(0,300,200,32,#PB_Image_Transparent)
StartDrawing(ImageOutput(0))
ColorWhite = CocoaMessage(0,0,"NSColor whiteColor")
CocoaMessage(0,ColorWhite,"setFill")
Rect.NSRect
Rect\origin\x = 5
Rect\origin\y = 5
Rect\size\width = 290
Rect\size\height = 190
RadiusX.CGFloat = 20
RadiusY.CGFloat = 20
Path = CocoaMessage(0,0,"NSBezierPath bezierPathWithRoundedRect:@",@Rect,"xRadius:@",@RadiusX,"yRadius:@",@RadiusY)
CocoaMessage(0,Path,"fill")
StopDrawing()
If OpenWindow(0,0,0,300,200,"Drawing",#PB_Window_BorderLess|#PB_Window_ScreenCentered)
CocoaMessage(0,WindowID(0),"setOpaque:",#NO)
CocoaMessage(0,WindowID(0),"setBackgroundColor:",CocoaMessage(0,0,"NSColor colorWithPatternImage:",ImageID(0)))
CocoaMessage(0,WindowID(0),"setMovableByWindowBackground:",#NO)
CocoaMessage(0,WindowID(0),"setHasShadow:",#YES)
Repeat
ev = WaitWindowEvent()
Until ev = #PB_Event_CloseWindow
EndIf
Second one uses the internal vector drawing library. However, in both cases the result looks like that:
I've also found
this example, but don't know how to port it to PB.
Can anyone help?
Re: Window with rounded corners
Posted: Sat Jan 16, 2016 10:30 am
by Danilo
deseven wrote:I've also found
this example, but don't know how to port it to PB.
The following produces a white window with rounded corners (thanks to your link!). You can also control the AntiAliasing of the corners, and add a border.
But if you enable shadow, you get something like a "shadow frame" around the window. Try it.
Code: Select all
If OpenWindow(0,0,0,300,200,"Drawing",#PB_Window_BorderLess|#PB_Window_ScreenCentered)
CocoaMessage(0,WindowID(0),"setOpaque:",#NO)
CocoaMessage(0,WindowID(0),"setBackgroundColor:",CocoaMessage(0,0,"NSColor clearColor")) ; clearColor = transparent
CocoaMessage(0,WindowID(0),"setMovableByWindowBackground:",#YES)
CocoaMessage(0,WindowID(0),"setHasShadow:",#NO)
view = CocoaMessage(0,WindowID(0),"contentView")
If view
CocoaMessage(0,view,"setWantsLayer:",#True)
layer = CocoaMessage(0,view,"layer")
If layer
radius.d = 30
CocoaMessage(0,layer,"setCornerRadius:@",@radius)
CocoaMessage(0,layer,"setMasksToBounds:",#True)
CocoaMessage(0,layer,"setBackgroundColor:",CocoaMessage(0,CocoaMessage(0,0,"NSColor whiteColor"),"CGColor")) ; background color
; Draw Border
;CocoaMessage(0,layer,"setBorderColor:",CocoaMessage(0,CocoaMessage(0,0,"NSColor orangeColor"),"CGColor")) ; border color
;borderWidth.d = 5
;CocoaMessage(0,layer,"setBorderWidth:@",@borderWidth)
; Set Antialiasing for Window edges
;CocoaMessage(0,layer,"setEdgeAntialiasingMask:",0) ; Disable AntiAliasing for all edges
CocoaMessage(0,layer,"setEdgeAntialiasingMask:",%1111) ; Enable AntiAliasing for all edges
EndIf
;CocoaMessage(0,view,"updateLayer")
EndIf
CocoaMessage(0,WindowID(0),"invalidateShadow")
;CocoaMessage(0,WindowID(0),"update")
Repeat
ev = WaitWindowEvent()
Until ev = #PB_Event_CloseWindow
EndIf
Re: Window with rounded corners
Posted: Sat Jan 16, 2016 10:50 am
by deseven
Thank you very much Danilo, you saved me once again

As for the "shadow frame" - i think that's okay, it seems that every rounded window in OS X have it (Finder, for example).
Re: Window with rounded corners
Posted: Mon Jan 18, 2016 10:16 pm
by Wolfram
Hi,
I found this example which has a perfect shadow.
Maybe someone can translate it.
http://www.cocoawithlove.com/2008/12/dr ... -os-x.html
Re: Window with rounded corners
Posted: Tue Jan 19, 2016 11:03 am
by deseven
Check this.
Also, it seems that using NSImage directly solves the drawing problems.
So here is a correct way to create rounded corners with NSBezierPath based on wilbert example:
Code: Select all
Rect.NSRect
Rect\origin\x = 0
Rect\origin\y = 0
Rect\size\width = 300
Rect\size\height = 200
RadiusX.CGFloat = 20
RadiusY.CGFloat = 20
ImageID = CocoaMessage(0,CocoaMessage(0,0,"NSImage alloc"),"initWithSize:@",@Rect\size)
CocoaMessage(0,ImageID,"lockFocus")
Path = CocoaMessage(0,0,"NSBezierPath bezierPathWithRoundedRect:@",@Rect,"xRadius:@",@RadiusX,"yRadius:@",@RadiusY)
ColorWhite = CocoaMessage(0,0,"NSColor whiteColor")
CocoaMessage(0,ColorWhite,"setFill")
CocoaMessage(0,Path,"fill")
CocoaMessage(0,ImageID,"unlockFocus")
If OpenWindow(0,0,0,300,200,"Drawing",#PB_Window_BorderLess|#PB_Window_ScreenCentered)
CocoaMessage(0,WindowID(0),"setOpaque:",#NO)
CocoaMessage(0,WindowID(0),"setBackgroundColor:",CocoaMessage(0,0,"NSColor colorWithPatternImage:",ImageID))
CocoaMessage(0,WindowID(0),"setMovableByWindowBackground:",#NO)
CocoaMessage(0,WindowID(0),"setHasShadow:",#YES)
Repeat
ev = WaitWindowEvent()
Until ev = #PB_Event_CloseWindow
EndIf
Re: Window with rounded corners
Posted: Tue Jan 19, 2016 5:43 pm
by Wolfram
Hi Deseven,
I don't know why, but the corners are not total transparent.

Re: Window with rounded corners
Posted: Tue Jan 19, 2016 6:13 pm
by deseven
What OS X version are you using?
Try to add
Code: Select all
CocoaMessage(0,WindowID(0),"invalidateShadow")
Re: Window with rounded corners
Posted: Tue Jan 19, 2016 6:34 pm
by Wolfram
deseven wrote:What OS X version are you using?
Try to add
Code: Select all
CocoaMessage(0,WindowID(0),"invalidateShadow")
I already tried that, but here, on 10.7.5 and 10.9.4, it doesn't work.
Re: Window with rounded corners
Posted: Tue Jan 19, 2016 8:13 pm
by deseven
Well, i'm out of ideas then. Probably there is another method to create rounded shadow for older OS X versions.
Re: Window with rounded corners
Posted: Wed Jan 20, 2016 8:55 pm
by Wolfram
I got it

I have to open the window invisible...
Code: Select all
Rect.NSRect
Rect\origin\x = 0
Rect\origin\y = 0
Rect\size\width = 300
Rect\size\height = 200
RadiusX.CGFloat = 20
RadiusY.CGFloat = 20
ImageID = CocoaMessage(0,CocoaMessage(0,0,"NSImage alloc"),"initWithSize:@",@Rect\size)
CocoaMessage(0,ImageID,"lockFocus")
Path = CocoaMessage(0,0,"NSBezierPath bezierPathWithRoundedRect:@",@Rect,"xRadius:@",@RadiusX,"yRadius:@",@RadiusY)
ColorWhite = CocoaMessage(0,0,"NSColor whiteColor")
CocoaMessage(0,ColorWhite,"setFill")
CocoaMessage(0,Path,"fill")
CocoaMessage(0,ImageID,"unlockFocus")
If OpenWindow(0,0,0,300,200,"Drawing",#PB_Window_BorderLess|#PB_Window_ScreenCentered|#PB_Window_Invisible)
Close = ButtonGadget(#PB_Any, 100, 50, 100, 25, "close")
ID = WindowID(0)
CocoaMessage(0,ID,"setOpaque:",#NO)
CocoaMessage(0,ID,"setBackgroundColor:",CocoaMessage(0,0,"NSColor colorWithPatternImage:",ImageID))
CocoaMessage(0,ID,"setHasShadow:",#YES)
CocoaMessage(0,ID,"setMovableByWindowBackground:",#NO)
HideWindow(0, 0)
Repeat
ev = WaitWindowEvent()
If EventGadget() = Close
Break
EndIf
Until ev = #PB_Event_CloseWindow
End
EndIf