Seite 1 von 1
Mouse Events
Verfasst: 13.08.2015 22:58
von The_Dark_Zim-.-
Hey Ho,
ich vermisse leider einige Maus-Events für verschiedene Gadgets. Ich bräuchte eigentlich einen LeftMouseButtonDown, LeftMouseButtonUp und einen RightMouseButtonClicked Event.
Unter Windows kann ich da bestimmt die Win Api bemühen, aber wie Händel ich so etwas unter Linux?
Das Canvas Gadget hat diese Events zwar, aber ich wüsste nicht, wie ich die jeweils System-spezifischen Gadgets mit einem Canvas nachzeichnen kann oder Gadgets über dieses legen könnte und gleichzeitig die Events vom Canvas abfragen kann.
Ich möchte in meiner Software dem Benutzer die Möglichkeit geben einige Gadgets auf das Fenster zu legen und diese dann in der Position und Größe mit der Maus ändern zu können. Dazu würde ich aber ungern per Canvas die Gadgets zeichnen, das System kann das ja viel schöner und effizienter ...
Gruß Zim
Re: Mouse Events
Verfasst: 14.08.2015 15:28
von Andesdaf
du könntest alle Gadgets mit ihren Koordinaten in einer Liste speichern und anschließend mit der
Mouse-Bibliothek arbeiten (MouseButton, MouseX, MouseY, MouseDeltaX, MouseDeltaY), um das
angeklickte Gadgegt zu ermitteln und es nach den Mausbewegungen zu verschieben.
Re: Mouse Events
Verfasst: 14.08.2015 17:18
von The_Dark_Zim-.-
Also quasi einmal anklicken, Gadget raus suchen nochmal klicken und das Gadget dort hin verschieben?
Das klingt mir nicht nach einer schönen Lösung

Re: Mouse Events
Verfasst: 14.08.2015 18:57
von Sicro
Einfacher geht es mit einer Taste oder Tastenkombination auf der Tastatur:
Code: Alles auswählen
EnableExplicit
Enumeration
#Window_Main
EndEnumeration
Enumeration
#ButtonGadget
#CheckBoxGadget
#OptionGadget
#StringGadget
EndEnumeration
Procedure GetGadgetUnderMouseCursor(Window.i, List Gadgets())
Protected MouseX = WindowMouseX(Window)
Protected MouseY = WindowMouseY(Window)
ForEach Gadgets()
If MouseX > GadgetX(Gadgets()) And MouseX < GadgetX(Gadgets())+GadgetWidth(Gadgets())
If MouseY > GadgetY(Gadgets()) And MouseY < GadgetY(Gadgets())+GadgetHeight(Gadgets())
ProcedureReturn Gadgets()
EndIf
EndIf
Next
ProcedureReturn -1
EndProcedure
Define.i i, Event, Drag_Active, Drag_Gadget, Drag_x_Offset, Drag_y_Offset
NewList Gadgets.i()
OpenWindow(#Window_Main, 300, 300, 300, 300, "test", #PB_Window_SystemMenu|#PB_Window_TitleBar)
ButtonGadget(#ButtonGadget, 5, 5, 200, 30, "button")
CheckBoxGadget(#CheckBoxGadget, 5, 40, 200, 30, "checkbox")
OptionGadget(#OptionGadget, 5, 80, 200, 30, "option")
StringGadget(#StringGadget, 5, 120, 200, 30, "string")
For i = #ButtonGadget To #StringGadget
AddElement(Gadgets())
Gadgets() = i
Next
AddKeyboardShortcut(#Window_Main, #PB_Shortcut_C, 0)
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Menu And EventMenu() = 0
Drag_Active = Bool(Not Drag_Active)
If Drag_Active
Drag_Gadget = GetGadgetUnderMouseCursor(#Window_Main, Gadgets())
If IsGadget(Drag_Gadget)
Drag_x_Offset = WindowMouseX(#Window_Main)-GadgetX(Drag_Gadget)
Drag_y_Offset = WindowMouseY(#Window_Main)-GadgetY(Drag_Gadget)
EndIf
EndIf
EndIf
If Drag_Active And IsGadget(Drag_Gadget)
ResizeGadget(Drag_Gadget, WindowMouseX(#Window_Main)-Drag_x_Offset, WindowMouseY(#Window_Main)-Drag_y_Offset, #PB_Ignore, #PB_Ignore)
EndIf
Until Event = #PB_Event_CloseWindow
Bedienung: Mauszeiger auf das zu bewegende Gadget setzen und die "c"-Taste auf der Tastatur drücken. Danach mit der Maus das Gadget bewegen. Ist das Gadget wie gewünscht platziert, wird mit erneutem betätigen der "c"-Taste die Bewegung beendet.
Oder muss es unbedingt per Maus funktionieren?
Re: Mouse Events
Verfasst: 14.08.2015 19:07
von mk-soft
Hab ich bei mir gefunden. Author weiss ich nicht mehr...
Code: Alles auswählen
Procedure WindowMouseButton(Wnd, ButtonNr)
CompilerIf #PB_Compiler_OS = #PB_OS_Linux
;Linux Version
Protected gdkWnd.l, x.l, y.l, mask.l
Protected *Window.GTKWindow
If Wnd
*Window = Wnd
gdkWnd = *Window\bin\child\window
gdk_window_get_pointer_(gdkWnd, @x, @y, @mask)
Select ButtonNr
Case 0
If (mask & #GDK_BUTTON1_MASK)
ProcedureReturn #True
EndIf
Case 1
If (mask & #GDK_BUTTON3_MASK)
ProcedureReturn #True
EndIf
Case 2
If (mask & #GDK_BUTTON2_MASK)
ProcedureReturn #True
EndIf
EndSelect
EndIf
CompilerElse
;Windows Version
If Wnd And GetForegroundWindow_() = Wnd
Select ButtonNr
Case 0
If GetAsyncKeyState_(#VK_LBUTTON) > 0
ProcedureReturn #True
EndIf
Case 1
If GetAsyncKeyState_(#VK_RBUTTON) > 0
ProcedureReturn #True
EndIf
Case 2
If GetAsyncKeyState_(#VK_MBUTTON) > 0
ProcedureReturn #True
EndIf
EndSelect
EndIf
CompilerEndIf
ProcedureReturn #False
EndProcedure
P.S. Für X64 noch .I Long nach i. Integer ändern.
Re: Mouse Events
Verfasst: 16.08.2015 22:19
von The_Dark_Zim-.-
Ich danke dir mk-soft, das hilft mir weiter
@Sicro
Nur mit der Maus bedienen ist einfach benutzerfreundlicher, da man hier keine Taste auswendig lernen muss
Allerdings werde ich wohl noch die Möglichkeit bieten die Position auch eingeben zu können.
Gruß Zim