The windows XP theme ads 7 pixels to the caption of the window.
So mouse positions are not correct.
just test this, it works here even when switching theme when app is running.
Code: Select all
Global XP
XP = 4+GetSystemMetrics_(#SM_CYSIZE)
Structure boxjes
x.l
y.l
EndStructure
Dim selpoint.boxjes(8)
Structure gdgets
id.l
type.l
x.l
y.l
w.l
h.l
t.s
EndStructure
Dim db.gdgets(10)
num=1
db(num)\id=num
db(num)\type=1 ;textgadget
db(num)\x=20
db(num)\y=10
db(num)\w=100
db(num)\h=20
db(num)\t="Hoegaarden"
num+1
db(num)\id=num
db(num)\type=2 ;stringgadget
db(num)\x=20
db(num)\y=40
db(num)\w=200
db(num)\h=20
db(num)\t="Goedendag allemaal, voor mij een pintje"
num+1
db(num)\id=num
db(num)\type=3 ;buttongadget
db(num)\x=150
db(num)\y=190
db(num)\w=100
db(num)\h=20
db(num)\t="Beer Here"
num+1
db(num)\id=num
db(num)\type=4 ;panelgadget
db(num)\x=250
db(num)\y=20
db(num)\w=150
db(num)\h=150
db(num)\t=""
num+1
db(num)\id=num
db(num)\type=5 ;frame3dgadget
db(num)\x=10
db(num)\y=250
db(num)\w=300
db(num)\h=100
db(num)\t="Empty Bottle"
Global numgadget, SelectedGadget, BoxW, MouseDown, SelectedPoint, imagehandle
numgadget=5
#Color=$F5080A
#ColorS=$1351EC
BoxW=7
Global hwnd
hwnd=OpenWindow(0,100,350,400,400, #PB_Window_SystemMenu ,"BeerGUI")
Procedure Clear_screen()
b.RECT
b\right=WindowWidth()
b\bottom=WindowHeight()
InvalidateRect_(hwnd,@b,1)
sendmessage_(hwnd,#WM_PAINT,0,0)
EndProcedure
Procedure redraw()
For s=1 To numgadget
Select db(s)\type
Case 1
TextGadget (db(s)\id, db(s)\x, db(s)\y, db(s)\w, db(s)\h, db(s)\t)
Case 2
StringGadget (db(s)\id, db(s)\x, db(s)\y, db(s)\w, db(s)\h, db(s)\t)
Case 3
ButtonGadget (db(s)\id, db(s)\x, db(s)\y, db(s)\w, db(s)\h, db(s)\t)
Case 4
PanelGadget (db(s)\id, db(s)\x, db(s)\y, db(s)\w, db(s)\h)
Case 5
Frame3DGadget (db(s)\id, db(s)\x, db(s)\y, db(s)\w, db(s)\h, db(s)\t, 0)
EndSelect
Next s
EndProcedure
Procedure draw_sizer()
If SelectedGadget
StartDrawing(WindowOutput())
DrawingMode(4)
Box(db(SelectedGadget)\x-1,db(SelectedGadget)\y-1,db(SelectedGadget)\w+2,db(SelectedGadget)\h+2,#Color)
selpoint(1)\x = db(SelectedGadget)\x-BoxW
selpoint(1)\y = db(SelectedGadget)\y-BoxW
selpoint(2)\x = db(SelectedGadget)\x+db(SelectedGadget)\w
selpoint(2)\y = db(SelectedGadget)\y-BoxW
selpoint(3)\x = db(SelectedGadget)\x+db(SelectedGadget)\w
selpoint(3)\y = db(SelectedGadget)\y+db(SelectedGadget)\h
selpoint(4)\x = db(SelectedGadget)\x-BoxW
selpoint(4)\y = db(SelectedGadget)\y+db(SelectedGadget)\h
selpoint(5)\x = db(SelectedGadget)\x+(db(SelectedGadget)\w/2)-BoxW/2
selpoint(5)\y = db(SelectedGadget)\y-BoxW
selpoint(6)\x = db(SelectedGadget)\x+(db(SelectedGadget)\w/2)-BoxW/2
selpoint(6)\y = db(SelectedGadget)\y+db(SelectedGadget)\h
selpoint(7)\x = db(SelectedGadget)\x+(db(SelectedGadget)\w)
selpoint(7)\y = db(SelectedGadget)\y+(db(SelectedGadget)\h/2)-BoxW/2
selpoint(8)\x = db(SelectedGadget)\x-BoxW
selpoint(8)\y = db(SelectedGadget)\y+(db(SelectedGadget)\h/2)-BoxW/2
DrawingMode(0)
Box(selpoint(1)\x, selpoint(1)\y, BoxW, BoxW, #ColorS)
Box(selpoint(2)\x, selpoint(2)\y, BoxW, BoxW, #Color)
Box(selpoint(3)\x, selpoint(3)\y, BoxW, BoxW, #Color)
Box(selpoint(4)\x, selpoint(4)\y, BoxW, BoxW, #Color)
Box(selpoint(5)\x, selpoint(5)\y, BoxW, BoxW, #Color)
Box(selpoint(6)\x, selpoint(6)\y, BoxW, BoxW, #Color)
Box(selpoint(7)\x, selpoint(7)\y, BoxW, BoxW, #Color)
Box(selpoint(8)\x, selpoint(8)\y, BoxW, BoxW, #Color)
StopDrawing()
EndIf
EndProcedure
Procedure moved()
If MouseDown
XP=4+GetSystemMetrics_(#SM_CYSIZE)
x=WindowMouseX()-2
y=WindowMouseY()-XP ; looks like XP got wider borders
Select SelectedPoint
Case 1
;extra=db(SelectedGadget)\x - x
db(SelectedGadget)\x = x
;db(SelectedGadget)\w = db(SelectedGadget)\w + extra
;extra=db(SelectedGadget)\y - y
db(SelectedGadget)\y = y
;db(SelectedGadget)\h = db(SelectedGadget)\h + extra
Case 2
db(SelectedGadget)\w = x-db(SelectedGadget)\x
extra=db(SelectedGadget)\y - y
db(SelectedGadget)\y = y
db(SelectedGadget)\h = db(SelectedGadget)\h + extra
Case 3
db(SelectedGadget)\w = x-db(SelectedGadget)\x
db(SelectedGadget)\h = y-db(SelectedGadget)\y
Case 4
extra=db(SelectedGadget)\x - x
db(SelectedGadget)\x = x
db(SelectedGadget)\w = db(SelectedGadget)\w + extra
db(SelectedGadget)\h = y-db(SelectedGadget)\y
Case 5
extra=db(SelectedGadget)\y - y
db(SelectedGadget)\y = y
db(SelectedGadget)\h = db(SelectedGadget)\h + extra
Case 6
db(SelectedGadget)\h = y-db(SelectedGadget)\y
Case 7
db(SelectedGadget)\w = x-db(SelectedGadget)\x
Case 8
extra=db(SelectedGadget)\x - x
db(SelectedGadget)\x = x
db(SelectedGadget)\w = db(SelectedGadget)\w + extra
EndSelect
If selectedpoint>0 And selectedpoint=selpoint(s)\x And x=selpoint(s)\y And y<=selpoint(s)\y+BoxW
SelectedPoint=s
MouseDown=1
s=9
result=0
DisableGadget(SelectedGadget,1)
EndIf
Next s
If MouseDown=0
For s=1 To numgadget
If ChildWindowFromPoint_(hwnd,x,y) = GadgetID(db(s)\id)
SelectedGadget = db(s)\id
s=NumGadget
Clear_screen()
draw_sizer()
result = 0
EndIf
Next s
EndIf
Case #WM_MOUSEMOVE
Moved()
Case #WM_LBUTTONUP
If MouseDown
If SelectedGadget
ResizeGadget(db(SelectedGadget)\id, db(SelectedGadget)\x, db(SelectedGadget)\y, db(SelectedGadget)\w, db(SelectedGadget)\h)
Clear_screen()
draw_sizer()
DisableGadget(SelectedGadget,0)
EndIf
EndIf
MouseDown=0
SelectedPoint=0
Case #WM_PAINT
;draw_sizer()
Default
;Debug message
EndSelect
ProcedureReturn Result
EndProcedure
If CreateGadgetList(WindowID())
redraw()
SetWindowCallback(@myCallback())
Repeat
EventID=WaitWindowEvent()
If EventID = #PB_EventGadget
SelectedGadget=EventGadgetID()
Clear_screen()
draw_sizer()
EndIf
Until EventID = #PB_EventCloseWindow
EndIf