Gadget bewegen per Maus

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

Alles schön und nett, aber das Fenster verliert den Focus wenn man das Gadget zieht. Normalerweise setzt das Child Window als aktuelles Fenster immer das Parent window. Ist vielleicht nur ein Detail aber ich hasse es, wenn der Focus vom Fenster genommen wird und man es erstmal wieder anklicken muss. Lässt sich aber vielleicht noch ausbessern? (Ansonsten sehr kompakte und schöne Variante)
Benutzeravatar
Hroudtwolf
Beiträge: 1416
Registriert: 30.10.2004 23:33
Kontaktdaten:

Beitrag von Hroudtwolf »

Das Fernster behält jetzt seinen Focus.

Bitte schön:

Code: Alles auswählen

;Hroudtwolf 2005(c)
;Move Gadgets
If OpenWindow(0, 0, 0, 800, 600,#PB_Window_SystemMenu | #PB_Window_ScreenCentered , "Move Gadgets")

If OpenWindow(1, 10, 10, 80, 80, #pb_window_borderless|#PB_Window_Invisible|#WS_CHILD|#WS_CLIPCHILDREN, "") 
SetParent_(WindowID(1),WindowID(0)) 
SetWindowLong_(WindowID(),#GWL_EXSTYLE,#WS_EX_TOOLWINDOW)   
ShowWindow_(WindowID(),#SW_SHOW) 
  If CreateGadgetList(WindowID(1))
    TextGadget (1,0,0,80,80,"test",#pb_text_border)
  EndIf
EndIf  
  Repeat
   
    EventID = WaitWindowEvent()
       



                         
 
         
Select eventid

  Case #PB_EventCloseWindow 
    Quit = 1
  Case #wm_lbuttondown
     If EventWindowID() =1
           ReleaseCapture_() 
           SendMessage_(WindowID(1), #WM_SYSCOMMAND, #SC_MOVE + #HTCAPTION, 0) 
           If GetFocus_()<>WindowID(0)
            SetFocus_(WindowID(0))
           EndIf 
     EndIf 
EndSelect 

     
   

   
  Until Quit = 1
  
  EndIf 
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Gadget bewegen per Maus

Beitrag von Danilo »

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.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
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.
Antworten