Gadget bewegen per Maus

Anfängerfragen zum Programmieren mit PureBasic.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

EasyWayToMakeGuiBuilder(In den alten Zeiten mal wahrscheinlich auf der Resourcesite[Das waren noch Zeiten, aber zum Glück gibts noch PureArea.Net] gefunden):

Code: Alles auswählen

If OpenWindow(0, 10, 10, 450, 450, #PB_Window_SystemMenu, "Test")
  CreateGadgetList(WindowID())
  ButtonGadget(0, 10, 10, 150, 25, "Resize Mode= Off",#PB_Button_Default|#PB_Button_Toggle)
  ButtonGadget(1, 200, 100, 120, 25, "Drag Me")
  ComboBoxGadget(2,160,60,80,75,"Combobox5")
  MessageRequester("Info","Click the gadget that you want to resize and the push the design button",0)

  Repeat
    EventID = WaitWindowEvent()
    
    Select EventID
        
      Case #PB_EventGadget
        Select EventGadgetID()
          Case 0
          
            If Selected = 0
               Selected = 1
            EndIf
            
            Style = GetWindowLong_(GadgetID(Selected),#GWL_STYLE)
    
            If OldStyle <> 0
              SetWindowLong_(GadgetID(Selected),#GWL_STYLE,OldStyle)
              SetWindowPos_(GadgetID(Selected),0,GadgetX(Selected),GadgetY(Selected),GadgetWidth(Selected),GadgetHeight(Selected),#SWP_SHOWWINDOW)
              OldStyle = 0
              HideGadget(Selected,1);Neccesary to dissapear the frame of the button (why?)
              HideGadget(Selected,0)
              SetGadgetText(Selected,"Drag Me")
              SetGadgetText(0,"Resize Mode= Off")
              SetWindowText_(WindowID(),"Resize Mode: OFF")
            Else
              OldStyle.l = Style
              Style = Style + #WS_THICKFRAME
              SetWindowLong_(GadgetID(Selected),#GWL_STYLE,Style)
              SetWindowPos_(GadgetID(Selected),0,0,0,0,0,#SWP_NOZORDER | #SWP_NOSIZE | #SWP_NOMOVE | #SWP_DRAWFRAME)
              SetGadgetText(Selected,"Resize Me")
              SetGadgetText(0,"Resize Mode= On")
              SetWindowText_(WindowID(),"Resize Mode: ON")
            EndIf
         Default
          If EventGadgetID() >= 1;Just can resize both controls
            Selected.l = EventGadgetID()
          Else
            Selected = 1
          EndIf

          
        EndSelect
        Case #WM_MOUSEMOVE
          GetCursorPos_(mouse.POINT)
          Handle = ChildWindowFromPoint_(WindowID(),mouse\x-5,mouse\y-30);the handle of the gadget that has the mouse over
          If Handle = GadgetID(1); Just drag the designeable butto
            ReleaseCapture_()
            SendMessage_(GadgetID(1), #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
          ElseIf Handle = GadgetID(2); Just drag the designeable button
            DisableGadget(2,0)
            ReleaseCapture_()
            SendMessage_(GadgetID(2), #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
          
          EndIf
    EndSelect
    
  Until EventID = #PB_EventCloseWindow
EndIf
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Code: Alles auswählen

ResizeGadget(GetWindowLong_(hWnd,#GWL_ID),x,y,-1,-1)
Statt -1 muss es #PB_Ignore heissen.
teachco
Beiträge: 48
Registriert: 12.07.2005 19:44

Gadgets verschwinden beim Bewegen (Problem gelöst)

Beitrag 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
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag 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 ;)
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

@Edel:
Schöne Lösung ;)
Subclassing 4 the win! :mrgreen:
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

@teachco

ich hab jetzt deine überschüssigen posts mal gelöscht,
aber bitte in zukunft den Edit-Button benutzen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
teachco
Beiträge: 48
Registriert: 12.07.2005 19:44

AddGagdet reagiert nicht auf TextGadget

Beitrag 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.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Als flag #SS_Notify uebergeben.
teachco
Beiträge: 48
Registriert: 12.07.2005 19:44

Weitere nicht verschiebbare Gadgets

Beitrag 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.
Antworten