Neptunar hat geschrieben:ich möchte ein Gadget mit der maus bewegen,
Ich habe hier mal schnell einen Teil aus einem meiner Codes
ausgeschnitten:
Code: Alles auswählen
;//////////////////////////////////////////////
Structure SubClassGadget
hWnd.l
oldWndProc.l
mouseDown.l
mouseOffX.l
mouseOffY.l
EndStructure
NewList gadgets.SubClassGadget()
;//////////////////////////////////////////////
Procedure GadgetCallback(hWnd,Msg,wParam,lParam)
Select Msg
Case #WM_LBUTTONDOWN
ForEach gadgets()
If gadgets()\hWnd = hWnd
gadgets()\mouseOffX = lParam & $FFFF
gadgets()\mouseOffY = (lParam>>16) & $FFFF
gadgets()\mouseDown = 1
SetFocus_(hWnd)
SetCursor_(LoadCursor_(0,#IDC_SIZEALL))
ProcedureReturn 0
EndIf
Next
Case #WM_MOUSEMOVE
If wParam & #MK_LBUTTON
ForEach gadgets()
If gadgets()\hWnd = hWnd And gadgets()\mouseDown
GetCursorPos_(p.POINT)
MapWindowPoints_(0,WindowID(0),@p,1)
x = p\x - gadgets()\mouseOffX
y = p\y - gadgets()\mouseOffY
If x < 0 : x = 0 : EndIf
If y < 0 : y = 0 : EndIf
GetClientRect_(hWnd,rect.RECT)
GetClientRect_(WindowID(0),rect2.RECT)
If x > rect2\right - rect\right : x = rect2\right - rect\right : EndIf
If y > rect2\bottom - rect\bottom : y = rect2\bottom - rect\bottom : EndIf
ResizeGadget(GetWindowLong_(hWnd,#GWL_ID),x,y,-1,-1)
SetCursor_(LoadCursor_(0,#IDC_SIZEALL))
SetCapture_(hWnd)
ProcedureReturn 0
EndIf
Next
ElseIf wParam = 0
SetCursor_(LoadCursor_(0,#IDC_SIZEALL))
EndIf
Case #WM_LBUTTONUP
ForEach gadgets()
If gadgets()\hWnd = hWnd
gadgets()\mouseDown = 0
EndIf
Next
SetCursor_(LoadCursor_(0,#IDC_SIZEALL))
SetCapture_(0)
ProcedureReturn 0
EndSelect
ForEach gadgets()
If gadgets()\hWnd = hWnd
ProcedureReturn CallWindowProc_(gadgets()\oldWndProc,hWnd,Msg,wParam,lParam)
EndIf
Next
EndProcedure
;//////////////////////////////////////////////
Procedure AddGadget(hGadget)
If IsGadget(hGadget)
hWnd = GadgetID(hGadget) ; for #PB_Any
Else
hWnd = hGadget
EndIf
If hWnd
LastElement(gadgets())
AddElement(gadgets())
gadgets()\hWnd = hWnd
gadgets()\oldWndProc = SetWindowLong_(hWnd,#GWL_WNDPROC,@GadgetCallback())
EndIf
ProcedureReturn hGadget
EndProcedure
;//////////////////////////////////////////////
If OpenWindow(0,0,0,400,300,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"test")
CreateGadgetList(WindowID())
AddGadget(ButtonGadget (#PB_Any,10, 10,100,20,"Button"))
AddGadget(CheckBoxGadget(#PB_Any,10, 40,100,20,"Checkbox"))
AddGadget(ComboBoxGadget(#PB_Any,10, 80,100,150))
Addgadget(SpinGadget (#PB_Any,10,120,100,20,0,100))
Addgadget(StringGadget (#PB_Any,10,160,100,20,"Stringfield"))
AddGadget(TrackBarGadget(#PB_Any,10,200,100,20,0,100))
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
If EventWindowID()=0
If MessageBox_(0,"Wirklich beenden ?","WinDesigner - Beenden",#MB_YESNO|#MB_ICONQUESTION|#MB_DEFBUTTON2|#MB_TASKMODAL)=#IDYES
Break
EndIf
EndIf
EndSelect
ForEver
EndIf
Dabei kann man die Gadgets nur innerhalb des Fensters
bewegen. Diese Abfrage bei #WM_MOUSEMOVE kann man
aber rausmachen wenn man es nicht braucht.