Seite 2 von 3

Verfasst: 19.05.2005 00:46
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)

Verfasst: 19.05.2005 02:02
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 

Re: Gadget bewegen per Maus

Verfasst: 19.05.2005 06:49
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.

Verfasst: 19.05.2005 08:19
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

Verfasst: 03.06.2007 12:04
von edel

Code: Alles auswählen

ResizeGadget(GetWindowLong_(hWnd,#GWL_ID),x,y,-1,-1)
Statt -1 muss es #PB_Ignore heissen.

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.