Gadgets verschwinden beim Bewegen (Problem gelöst)
Verfasst: 03.06.2007 12:12
Problem gerade gelöst. Bei ResizeGadget muss man die alten -1 Werte durch #PB_Ignore ersetzen. (Anm. : Das ist im Code unten schon geschehen) Dann ist alles bestens.
@ Danilo
Ich habe ein paar Anpassungen gemacht, damit Dein Code unter V.4 compiliert werden kann. Zu meiner Überraschung muss ich feststellen, dass die Gadgets einfach verschwinden, nachdem man sie etwas bewegt hat. Rätsel ? Wer kann helfen oder hat eine Idee ?
Andi
@ Danilo
Ich habe ein paar Anpassungen gemacht, damit Dein Code unter V.4 compiliert werden kann. Zu meiner Überraschung muss ich feststellen, dass die Gadgets einfach verschwinden, nachdem man sie etwas bewegt hat. Rätsel ? Wer kann helfen oder hat eine Idee ?
Andi
Code: Alles auswählen
;//////////////////////////////////////////////
Structure SubClassGadget
hWnd.l
oldWndProc.l
mouseDown.l
mouseOffX.l
mouseOffY.l
EndStructure
Global 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,#PB_Ignore,#PB_Ignore)
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,"test",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
If CreateGadgetList(WindowID(0))
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))
EndIf
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
If EventWindow()=0
If MessageBox_(0,"Wirklich beenden ?","WinDesigner - Beenden",#MB_YESNO|#MB_ICONQUESTION|#MB_DEFBUTTON2|#MB_TASKMODAL)=#IDYES
Break
EndIf
EndIf
EndSelect
ForEver
EndIf