Here's some code, it's pretty ancient, so probably not the best example but it should give you some sort of idea...
;Window Z order
Type window
Field win_id, win_title$
Field win_x, win_y, win_w, win_h
Field gad_num, gad_id[99]
End Type
Type gadget
Field parent, gad_id, gad_type, gad_state
Field gad_x, gad_y, gad_w, gad_h
Field gad_r, gad_g, gad_b
End Type
Graphics 800, 600, 0, 2
SetBuffer BackBuffer()
SeedRnd MilliSecs()
example_windows(10)
winfont = LoadFont("arial bold", 16)
SetFont winfont
omx = MouseX()
omy = MouseY()
drag = 0
focus = 1
w.window = Last window
Repeat
mx = MouseX()
my = MouseY()
lmb_click = MouseHit(1)
lmb_down = MouseDown(1)
; get focus
If lmb_click Or drag
If drag = 0
focus = update_windows_z(mx, my, lmb_down)
If focus
w.window = Last window
If (focus = 2)
drag = 1
EndIf
EndIf
Else
w\win_x = w\win_x + (mx - omx)
w\win_y = w\win_y + (my - omy)
If (Not lmb_down) Then drag = 0
EndIf
omx = mx
omy = my
EndIf
;get gadget
If focus = 1
g.gadget = update_gadgets(w, mx, my, lmb_down)
EndIf
If g <> Null Then gad_ret = g\gad_id
Cls
draw_windows(focus)
Color 0, 200, 0
Text 0, 0, "Window : " + w\win_id
Text 0, 10, "Focus : " + focus
Text 0, 30, "Down : " + lmb_down
Text 0, 50, "Clicked : " + gad_ret
Flip
Until KeyDown(1)
End
Function example_windows(num)
Local wh
For x = 1 To num
wh = create_window(Rand(600), Rand(400), 200, 200, "Window No " + x)
create_gadget(wh, 0, Rand(2, 138), Rand(20, 178), 60, 20)
Next
End Function
Function create_gadget(wh, gt, gx, gy, gw, gh)
Local g.gadget, w.window
g.gadget = New gadget
g\parent = wh
g\gad_id = Handle(g)
g\gad_type = gt
g\gad_x = gx
g\gad_y = gy
g\gad_w = gw
g\gad_h = gh
g\gad_state = 0
w.window = Object.window(wh)
w\gad_id[w\gad_num] = g\gad_id
w\gad_num = w\gad_num + 1
Return g\gad_id
End Function
Function update_gadgets.gadget(w.window, mx, my, l_down)
Local g.gadget, gc
If l_down
If w\gad_num
For gc=0 To w\gad_num - 1
g = Object.gadget(w\gad_id[gc])
If RectsOverlap(mx, my, 1, 1, w\win_x + g\gad_x, w\win_y + g\gad_y, g\gad_w, g\gad_h)
g\gad_state = 1
Else
g\gad_state = 0
EndIf
Next
EndIf
Else
If w\gad_num
For gc=0 To w\gad_num - 1
g = Object.gadget(w\gad_id[gc])
If g\gad_state = 1
g\gad_state = 0
Return g
EndIf
Next
EndIf
EndIf
End Function
Function draw_gadget(w.window, g.gadget)
Select g\gad_type
Case 0
If g\gad_state = 0
Color 75, 75, 75
Rect w\win_x + g\gad_x + 1, w\win_y + g\gad_y + 1, g\gad_w - 1, g\gad_h - 1, 0
Color 200, 200, 200
Rect w\win_x + g\gad_x, w\win_y + g\gad_y, g\gad_w - 1, g\gad_h - 1, 0
Color 150, 150, 150
Rect w\win_x + g\gad_x + 1, w\win_y + g\gad_y + 1, g\gad_w - 2, g\gad_h - 2, 1
Else
Color 75, 75, 75
Rect w\win_x + g\gad_x, w\win_y + g\gad_y, g\gad_w - 1, g\gad_h - 1, 0
Color 200, 200, 200
Rect w\win_x + g\gad_x + 1, w\win_y + g\gad_y + 1, g\gad_w - 1, g\gad_h - 1, 0
Color 145, 145, 145
Rect w\win_x + g\gad_x + 1, w\win_y + g\gad_y + 1, g\gad_w - 2, g\gad_h - 2, 1
EndIf
End Select
End Function
Function create_window(wx, wy, ww, wh, wt$)
Local w.window
w.window = New window
w\win_id = Handle(w)
w\win_title$ = wt$
w\win_x = wx
w\win_y = wy
w\win_w = ww
w\win_h = wh
w\gad_num = 0
Return w\win_id
End Function
Function draw_windows(f)
Local g, l.window
l.window = Last window
For w.window = Each window
Color 100, 100, 100
Rect w\win_x, w\win_y, w\win_w, w\win_h, 1
Color 75, 75, 75
Rect w\win_x + 1, w\win_y + 18, w\win_w - 1, w\win_h - 18, 0
Color 200, 200, 200
Rect w\win_x, w\win_y, w\win_w - 1, w\win_h - 1, 0
If (l = w) And (f > 0) ; top window and focus
Color 150, 150, 170
Rect w\win_x + 1, w\win_y + 1, w\win_w - 2, 17, 1
Color 220, 220, 220
Text w\win_x + 4, w\win_y + 1, w\win_title$
Else
Color 150, 150, 150
Rect w\win_x + 1, w\win_y + 1, w\win_w - 2, 17, 1
Color 120, 120, 120
Text w\win_x + 4, w\win_y + 1, w\win_title$
EndIf
If w\gad_num
For g=0 To w\gad_num - 1
draw_gadget(w, Object.gadget(w\gad_id[g]))
Next
EndIf
Next
End Function
Function update_windows_z(x, y, l_down)
Local w.window
w.window = Last window
While w <> Null
If RectsOverlap(x, y, 1, 1, w\win_x, w\win_y, w\win_w, w\win_h)
Insert w After Last window
If l_down
If (y >= w\win_y) And (y <= (w\win_y + 18))
Return 2 ; drag
Else
Return 1 ; focus
EndIf
EndIf
EndIf
w = Before w
Wend
End Function