Platforms to show: All Mac Windows Linux Cross-Platform

/Overlay/Overlay with controls/Overlay with controls


Required plugins for this example: MBS Overlay Plugin, MBS Images Plugin

You find this example project in your Plugins Download as a Xojo project file within the examples folder: /Overlay/Overlay with controls/Overlay with controls

This example is the version from Sun, 10th Dec 2016.

Project "Overlay with controls.xojo_binary_project"
Class App Inherits Application
Const kEditClear = "&Delete"
Const kFileQuit = "&Quit"
Const kFileQuitShortcut = ""
End Class
Class Window1 Inherits Window
Control PushButton1 Inherits PushButton
ControlInstance PushButton1 Inherits PushButton
EventHandler Sub Action() create End EventHandler
End Control
Control StaticText1 Inherits Label
ControlInstance StaticText1 Inherits Label
End Control
EventHandler Function KeyDown(Key As String) As Boolean Select case asc(key) case 28 'left move -10,0 Return true case 29 'right move 10,0 Return true case 30 'top move 0,-10 Return true case 31 'down move 0,10 Return true end Select End EventHandler
Sub Create() o=new MyOverlay(500,100,300,440) dim b as new oRectangle b.x=0 b.y=0 b.width=o.Width b.height=o.Height b.fillColor=&c777777 o.root.AddChild b dim f as FolderItem = FindFile("cubes.png") dim p as new oPicture(f) p.x = 0 p.y = 200 b.AddChild p dim r as new oRectangle r.x=30 r.y=30 r.width=100 r.height=50 r.fillColor=&cFF0000 b.AddChild r dim c as new oOval c.x=60 c.y=60 c.width=100 c.height=100 b.AddChild c dim u as new oButton u.x=180 u.y=150 u.width=100 u.height=30 u.NormalPicture=xNormal u.DownPicture=xDown b.AddChild u dim s as new oScrollCanvas s.x=10 s.y=140 s.width=100 s.height=50 b.AddChild s dim t as new otext t.text="Click to scroll" t.x=10 t.y=190 t.width=100 t.height=10 t.textsize=9 t.textFont="Courier" b.AddChild t o.redraw o.UpdateShow End Sub
Function FindFile(name as string) As FolderItem // Look for file in parent folders from executable on dim parent as FolderItem = app.ExecutableFile.Parent while parent<>Nil dim file as FolderItem = parent.Child(name) if file<>Nil and file.Exists then Return file end if parent = parent.Parent wend End Function
Private Sub move(x as integer, y as integer) o.Move o.Left+x,o.top+y End Sub
Property Private counter As Integer
Property Private m As picture
Property Private o As MyOverlay
Property Private p As picture
End Class
MenuBar MenuBar1
MenuItem FileMenu = "&File"
MenuItem FileQuit = "#App.kFileQuit"
MenuItem EditMenu = "&Edit"
MenuItem EditUndo = "&Undo"
MenuItem UntitledMenu1 = "-"
MenuItem EditCut = "Cu&t"
MenuItem EditCopy = "&Copy"
MenuItem EditPaste = "&Paste"
MenuItem EditClear = "#App.kEditClear"
MenuItem UntitledMenu0 = "-"
MenuItem EditSelectAll = "Select &All"
End MenuBar
Class MyOverlay Inherits OverlayMBS
EventHandler Function MouseDown(x as integer, y as integer, modifiers as integer) As boolean dim b as Boolean = root.MouseDown(x,y) if root.NeedRedraw then redraw Update end if Return b End EventHandler
EventHandler Function MouseUp(x as integer, y as integer, modifiers as integer) As boolean dim b as Boolean = root.MouseUp(x,y) if root.NeedRedraw then redraw Update end if Return b End EventHandler
EventHandler Sub WindowBoundsChanged() log "windowboundschanged" redraw End EventHandler
EventHandler Sub WindowClosed() log "windowclosed" End EventHandler
EventHandler Sub WindowHidden() log "windowhidden" End EventHandler
EventHandler Sub WindowShown() log "windowShown" End EventHandler
Sub Constructor(left As integer, top As integer, width As integer, height As integer) Super.Constructor(left, top, width, height) dim p,m as Picture p = new Picture(width,height,32) m = new Picture(width,height,32) me.Pict=p me.Mask=m dim r as new oControl r.x=0 r.y=0 r.width=width r.height=height me.root=r End Sub
Private Function Window1open() As Boolean dim i,c as integer c=WindowCount-1 for i=0 to c if window(i) isa window1 then Return true end if next End Function
Private Sub log(s as string) System.DebugLog s End Sub
Sub redraw() dim g as Graphics g=me.pict.Graphics g.ForeColor=&cFFFFFF g.FillRect 0,0,g.Width,g.Height root.draw g,0,0 g=me.Mask.Graphics g.ForeColor=&cFFFFFF g.FillRect 0,0,g.Width,g.Height root.drawmask g,0,0 End Sub
Property root As oControl
End Class
Class oControl
Sub AddChild(o as oControl) Children.Append o End Sub
Function MouseDown(mx as integer, my as integer) As Boolean for each c as oControl in Children dim xx as integer = mx-c.x dim yy as integer = my-c.y if c.inside(xx,yy) then dim b as Boolean = c.MouseDown(xx,yy) if c.NeedRedraw then NeedRedraw=true end if if b then Return true end if end if next Return false End Function
Function MouseUp(mx as integer, my as integer) As Boolean for each c as oControl in Children dim xx as integer = mx-c.x dim yy as integer = my-c.y if c.inside(xx,yy) then dim b as Boolean = c.MouseUp(xx,yy) if c.NeedRedraw then NeedRedraw=true end if if b then Return true end if end if next Return false End Function
Sub draw(g as Graphics, px as integer, py as integer) for each c as oControl in Children c.draw g,px+x,py+y next End Sub
Sub drawmask(g as Graphics, px as integer, py as integer) for each c as oControl in Children c.drawmask g,px+x,py+y next End Sub
Function inside(mx as integer, my as integer) As Boolean if mx<0 then Return false if my<0 then Return false if mx>=width then Return false if my>=height then Return false Return true End Function
Property Children() As oControl
Property NeedRedraw As Boolean
Property height As Integer
Property root As oControl
Property width As Integer
Property x As Integer
Property y As Integer
End Class
Class oRectangle Inherits oControl
Sub draw(g as Graphics, px as integer, py as integer) g.ForeColor=fillColor g.FillRect x+px,y+py,width,height super.draw(g,px,py) End Sub
Sub drawMask(g as Graphics, px as integer, py as integer) g.ForeColor=&c000000 g.FillRect x+px,y+py,width,height super.drawMask(g,px,py) End Sub
Property fillColor As color
End Class
Class oOval Inherits oControl
Sub draw(g as Graphics, px as integer, py as integer) g.ForeColor=fillColor g.FillOval x+px,y+py,width,height super.draw(g,px,py) End Sub
Sub drawMask(g as Graphics, px as integer, py as integer) g.ForeColor=&c000000 g.FillOval x+px,y+py,width,height super.drawmask(g,px,py) End Sub
Property fillColor As color
End Class
Class oButton Inherits oControl
Function MouseDown(mx as integer, my as integer) As Boolean down=True NeedRedraw=True Return super.MouseDown(mx,my) End Function
Function MouseUp(mx as integer, my as integer) As Boolean down=false NeedRedraw=True Return super.MouseDown(mx,my) End Function
Sub draw(g as Graphics, px as integer, py as integer) if down then g.DrawPicture DownPicture, px+x, py+y else g.DrawPicture NormalPicture, px+x, py+y end if super.draw(g,px,py) End Sub
Sub drawMask(g as Graphics, px as integer, py as integer) g.ForeColor=&c000000 g.FillRect x+px,y+py,width,height super.drawMask(g,px,py) End Sub
Property Down As Boolean
Property DownPicture As Picture
Property NormalPicture As Picture
End Class
ExternalFile xDown
End ExternalFile
ExternalFile xNormal
End ExternalFile
Class oScrollCanvas Inherits oControl
Sub Constructor() pic = new Picture(300,50,32) dim g as Graphics = pic.Graphics g.ForeColor=&cFFFFFF g.FillRect 0, 0, g.Width, g.Height dim f as color = &cFF0000 dim y as Double = 25.0 g.ForeColor=&c777777 g.DrawLine 0, 25, 299, 25 dim ly as Double for x=0 to 299 if x mod 10=0 then g.ForeColor=&c777777 g.DrawLine x,20,x,30 end if y=y+rnd*4.0-2.0 if y<=0 then y=0 elseif y>=50 then y=49 end if g.ForeColor=&cFF0000 g.DrawLine x-1, ly, x, y ly=Y next End Sub
Function MouseDown(mx as integer, my as integer) As Boolean NeedRedraw=True Return true End Function
Function MouseUp(mx as integer, my as integer) As Boolean if mx*2<width then if offset>0 then offset=offset-5 end if else if offset<pic.Width-width then offset=offset+5 end if end if NeedRedraw=True Return true End Function
Sub draw(g as Graphics, px as integer, py as integer) g.DrawPicture pic, x+px, y+py, width, height, offset, 0, width, height super.draw(g,px,py) End Sub
Sub drawMask(g as Graphics, px as integer, py as integer) g.ForeColor=&c000000 g.FillRect x+px,y+py,width,height super.drawMask(g,px,py) End Sub
Property offset As Integer
Property pic As Picture
End Class
Class oText Inherits oControl
Sub draw(g as Graphics, px as integer, py as integer) g.ForeColor=textColor g.TextFont=textFont g.TextSize=textsize dim textwidth as integer = g.StringWidth(text) dim textheight as integer = g.StringHeight(text,width) g.DrawString text, px+x+(me.width-textwidth)/2, py+y+(me.height-textheight)/2+textsize End Sub
Property text As string
Property textColor As color
Property textFont As String
Property textsize As Integer
End Class
Class oPicture Inherits oControl
Sub Constructor() End Sub
Sub Constructor(f as FolderItem) Constructor f.OpenAsPNGMBS(0) End Sub
Sub Constructor(p as PNGPictureMBS) pic = p.Pict mask = p.Mask End Sub
Sub Constructor(pic as Picture, mask as Picture) self.pic = pic self.mask = mask End Sub
Sub draw(g as Graphics, px as integer, py as integer) g.DrawPicture pic, px+x, py+y super.draw(g,px,py) End Sub
Sub drawMask(g as Graphics, px as integer, py as integer) g.DrawPicture mask, px+x, py+y super.drawMask(g,px,py) End Sub
Property mask As Picture
Property pic As Picture
End Class
End Project

See also:

The items on this page are in the following plugins: MBS Overlay Plugin.


The biggest plugin in space...