Gadget bewegen per Maus
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)
- Hroudtwolf
- Beiträge: 1416
- Registriert: 30.10.2004 23:33
- Kontaktdaten:
Das Fernster behält jetzt seinen Focus.
Bitte schön:
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
Ich habe hier mal schnell einen Teil aus einem meiner CodesNeptunar hat geschrieben:ich möchte ein Gadget mit der maus bewegen,
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
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
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
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.
Code: Alles auswählen
ResizeGadget(GetWindowLong_(hWnd,#GWL_ID),x,y,-1,-1)
Gadgets verschwinden beim Bewegen (Problem gelöst)
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
- 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:
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
Löschen geht jetzt übrigens nimma

{Home}.:|:.{Codes}.:|:.{Downloads}.:|:.{History Viewer Online}.:|:.{Bier spendieren}
- Tafkadasom2k5
- Beiträge: 1578
- Registriert: 13.08.2005 14:31
- Kontaktdaten:
@Edel:
Schöne Lösung
Subclassing 4 the win!
Schöne Lösung

Subclassing 4 the win!

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!
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
AddGagdet reagiert nicht auf TextGadget
@ 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.
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.