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 :allright:

@Sicro
Nur mit der Maus bedienen ist einfach benutzerfreundlicher, da man hier keine Taste auswendig lernen muss :wink:
Allerdings werde ich wohl noch die Möglichkeit bieten die Position auch eingeben zu können.

Gruß Zim