Seite 2 von 3

Gadgets verschwinden beim Bewegen (Problem gelöst)

Verfasst: 03.06.2007 12:12
von teachco
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

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

Verfasst: 03.06.2007 13:14
von HeX0R
Anstatt einen neuen Beitrag zu schreiben, hättest du auch editieren können, oder besser noch löschen, da eh nur dasselbe wie oben steht.

Löschen geht jetzt übrigens nimma ;)

Verfasst: 03.06.2007 13:18
von Tafkadasom2k5
@Edel:
Schöne Lösung ;)
Subclassing 4 the win! :mrgreen:

Verfasst: 03.06.2007 13:50
von Kaeru Gaman
@teachco

ich hab jetzt deine überschüssigen posts mal gelöscht,
aber bitte in zukunft den Edit-Button benutzen.

AddGagdet reagiert nicht auf TextGadget

Verfasst: 03.06.2007 14:49
von teachco
@ Danilo Code-Beispiel

Leider reagiert die Funktion AddGagdet() nicht auf ein TextGadget. Wäre für einen Hinweis dankbar.

@ Kaeru

Sorry, war ein Versehen. Werde zukünftig mehr edit benutzen. Danke für's löschen.

Verfasst: 03.06.2007 15:19
von edel
Als flag #SS_Notify uebergeben.

Weitere nicht verschiebbare Gadgets

Verfasst: 03.06.2007 18:29
von teachco
@ edel
Perfekt, so funktioniert es mit dem TextGadget.

Inzwischen war ich neugierig und habe weitere Gadgets gefunden, bei denen man wohl nachhelfen muss, bevor die sich bewegen lassen.

- ScrollAreaGadget
- WebGadget
- PanelGadget
- Frame3DGadget

Hier scheinen, falls möglich, noch andere Parameter oder Werte nötig zu sein.
Nicht verschiebbare Gadgets scheinen immer die zu sein, bei denen keine Interaktion mit dem User stattfindet. Allerdings ist das ImageGadget verschiebbar, vielleicht weil es Bestandteil des ImageButtons sein kann. Weiß jemand etwas zum Konzept, warum das so geregelt ist und welche Einstellungen beim Recst der Gadgets nötig sind? Eigene Recherchen waren leider nicht so erfolgreich.