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