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
Mouse Events
- The_Dark_Zim-.-
- Beiträge: 372
- Registriert: 18.03.2008 16:53
Mouse Events
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Re: Mouse Events
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.
Mouse-Bibliothek arbeiten (MouseButton, MouseX, MouseY, MouseDeltaX, MouseDeltaY), um das
angeklickte Gadgegt zu ermitteln und es nach den Mausbewegungen zu verschieben.
Win11 x64 | PB 6.20
- The_Dark_Zim-.-
- Beiträge: 372
- Registriert: 18.03.2008 16:53
Re: Mouse Events
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
Das klingt mir nicht nach einer schönen Lösung

PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Re: Mouse Events
Einfacher geht es mit einer Taste oder Tastenkombination auf der Tastatur:
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?
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
Oder muss es unbedingt per Maus funktionieren?
Zuletzt geändert von Sicro am 17.08.2015 00:47, insgesamt 2-mal geändert.

Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Re: Mouse Events
Hab ich bei mir gefunden. Author weiss ich nicht mehr...
P.S. Für X64 noch .I Long nach i. Integer ändern.
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
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
- The_Dark_Zim-.-
- Beiträge: 372
- Registriert: 18.03.2008 16:53
Re: Mouse Events
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

@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
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64