Seite 1 von 1

Globaler Click event für Fenster

Verfasst: 05.11.2018 01:55
von The_Dark_Zim-.-
Hey,

ich suche eine Möglichkeit, wie ich sowohl unter Windows als auch Linux einen einfachen links- und rechts- kling mit der Maus abfragen kann. Dabei will ich den Event unabhängig von Gadgets bekommen, da einige einfach den eventtyp nicht unterstützen. Das ganze soll nur im eigenen Fenster funktionieren.
Ich will mir ein Werkzeug zum Erstellen von Benutzeroberflächen erstellen. Dazu will ich in einer Scrollarea verschiedene Gadgets positionieren können. Das raus suchen, ob und welches gadget gerade angeklickt wurde, sollte ich dann hin bekommen.

Hat da jemand eine Idee, wie ich an den Event komme? Mausposition bekomme ich ja so abgefragt, wenn auch nicht über einen direkten Event.

Mit freundlichen grüßen
Zim

Re: Globaler Click event für Fenster

Verfasst: 05.11.2018 10:06
von RSBasic
Du kannst CanvasGadget verwenden. Mit #PB_Canvas_Container kannst du auch Gadgets hinzufügen. Ich denke mal, damit lässt sich besser plattformunabhngig die Gadgets positionieren.
Ansonsten ohne CanvasGadget brauchst du ein Callback.

Re: Globaler Click event für Fenster

Verfasst: 05.11.2018 14:23
von The_Dark_Zim-.-
Klingt super, werde ich mir heute Abend mal ansehen.

Re: Globaler Click event für Fenster

Verfasst: 05.11.2018 23:52
von The_Dark_Zim-.-
Hey,

ich habe mir mal die neuste Demo Version geladen und folgenden Code ausprobiert.

Code: Alles auswählen

  If OpenWindow(0, 0, 0, 220, 220, "Canvas container example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
    CanvasGadget(22, 10, 10, 200, 200, #PB_Canvas_Container)
;     ButtonGadget(1, 10, 10, 80, 30, "Clean up")
    CloseGadgetList()
    OpenGadgetList(22)
    ButtonGadget(1, 10, 10, 80, 30, "Clean up")
    CloseGadgetList()
  
    Repeat
      Event = WaitWindowEvent()
    
      If Event = #PB_Event_Gadget
        Select EventGadget() 
          Case 0
            If EventType() = #PB_EventType_LeftButtonDown Or (EventType() = #PB_EventType_MouseMove And GetGadgetAttribute(0, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
              If StartDrawing(CanvasOutput(0))
                x = GetGadgetAttribute(0, #PB_Canvas_MouseX)
                y = GetGadgetAttribute(0, #PB_Canvas_MouseY)
                Circle(x, y, 10, RGB(Random(255), Random(255), Random(255)))
                StopDrawing()
              EndIf
            EndIf
          
          Case 1
            If StartDrawing(CanvasOutput(0))
              Box(0, 0, 200, 200, #White)
              StopDrawing()
            EndIf
        EndSelect
      EndIf
    
    Until Event = #PB_Event_CloseWindow
  EndIf
Das ist der Code aus der Hilfe, nur das ich open das Canvas sofort zu mache und danach per openGadgetlist() wieder auf mache. Das Funktioniert bei mir unter Linux nicht. Ist das nur bei mir so?
Log:
[22:51:12] Waiting for executable to start...
[22:51:12] Executable type: Linux - x64 (64bit, Unicode)
[22:51:12] Executable started.
[22:51:12] [WARNING] Line: 7
[22:51:12] [WARNING] Gtk (CRITICAL): gtk_layout_put: assertion 'GTK_IS_LAYOUT (layout)' failed
[22:51:12] [WARNING] Line: 7
[22:51:12] [WARNING] Gtk (CRITICAL): gtk_widget_realize: assertion 'widget->priv->anchored || GTK_IS_INVISIBLE (widget)' failed
[22:51:14] The Program execution has finished.
Ich sehe den Button nicht :(

Re: Globaler Click event für Fenster

Verfasst: 06.11.2018 09:38
von #NULL
The_Dark_Zim-.- hat geschrieben:Das Funktioniert bei mir unter Linux nicht. Ist das nur bei mir so?
Funktioniert bei mir auch nicht, bzw. nur mit Subsystem 'qt'.
Es gibt einen Bugreport dazu:
https://www.purebasic.fr/english/viewto ... 23&t=69912

Re: Globaler Click event für Fenster

Verfasst: 06.11.2018 21:10
von HeX0R
The_Dark_Zim-.- hat geschrieben:[...]ich habe mir mal die neuste Demo Version geladen und folgenden Code ausprobiert.[...]
Wieso denn die Demo? :|

Re: Globaler Click event für Fenster

Verfasst: 06.11.2018 22:38
von The_Dark_Zim-.-
War zu Faul das Passwort raus zu suchen :lol:
Habe es jetzt aber auch mit der Vollversion Probiert. Unter Windows geht es, aber Linux halt nicht :cry:

Re: Globaler Click event für Fenster

Verfasst: 06.11.2018 23:28
von ccode_new
ich suche eine Möglichkeit, wie ich sowohl unter Windows als auch Linux einen einfachen links- und rechts- kling mit der Maus abfragen kann.
Den Kling musst du selber erzeugen, aber Maustasten kann man z.B so abfragen:

Code: Alles auswählen

;Für Linux _ Einfach an den Anfang des Quellcodes (Bedarf min. ein Fenster und funktioniert nur mit GTK)
CompilerIf #PB_Compiler_OS = #PB_OS_Linux
  ImportC ""
    gdk_display_get_default()
    gdk_display_get_pointer(*display.GdkDisplay, *screen.GdkScreen, *x, *y, *mask)
  EndImport
CompilerEndIf

Enumeration
  #MWin
  #BtnMove
EndEnumeration

Structure WinPos
  x.i
  y.i
  h.i
  w.i
EndStructure

Global MWin.WinPos
MWin\x = 0
MWin\y = 0
MWin\w = 800
MWin\h = 600

Structure MPoint
  x.d
  y.d
EndStructure

Global CMouse.MPoint

Global IsMove.b = #False

Procedure.b ScreenMouseButton(Wnd, ButtonNr)
  
  CompilerIf #PB_Compiler_OS = #PB_OS_Linux
    ;Linux Version
    If Wnd
      gdk_display_get_pointer(gdk_display_get_default(), #Null, @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) > 1
            ProcedureReturn #True
          EndIf
        Case 1
          If GetAsyncKeyState_(#VK_RBUTTON) > 1
            ProcedureReturn #True
          EndIf
        Case 2
          If GetAsyncKeyState_(#VK_MBUTTON) > 1
            ProcedureReturn #True
          EndIf
      EndSelect
    EndIf
  CompilerEndIf
  ProcedureReturn #False
EndProcedure

Procedure.b OverGadget(*MousePos.MPoint, GID)
  If ((*MousePos\x >= GadgetX(GID)) And (*MousePos\x <= (GadgetX(GID) + GadgetWidth(GID))) And (*MousePos\y >= GadgetY(GID)) And (*MousePos\y <= GadgetY(GID) + GadgetHeight(GID)))
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure

;Main
If OpenWindow(#MWin,MWin\x,MWin\y,MWin\w,MWin\h,"Move-Test",#PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)   
  ButtonGadget(#BtnMove, 30, 30, 120, 30, "Bewege mich")
  Repeat
    EventID = WindowEvent()
    
    CMouse\x = WindowMouseX(#MWin)
    CMouse\y = WindowMouseY(#MWin)
    
    If OverGadget(CMouse, #BtnMove) = #True And ScreenMouseButton(WindowID(#MWin), 0) = #True
      DisableGadget(#BtnMove, #True)
      IsMove = #True
    EndIf
    
    If IsMove = #True And ScreenMouseButton(WindowID(#MWin), 0) = #True
      ResizeGadget(#BtnMove, CMouse\x, CMouse\y, #PB_Ignore, #PB_Ignore)
    EndIf
    
    If IsMove = #True And ScreenMouseButton(WindowID(#MWin), 0) = #False
      ResizeGadget(#BtnMove, CMouse\x, CMouse\y, #PB_Ignore, #PB_Ignore)
      IsMove = #False
      DisableGadget(#BtnMove, #False)
    EndIf
    
    
  Until EventID = #PB_Event_CloseWindow
  
EndIf

Re: Globaler Click event für Fenster

Verfasst: 07.11.2018 16:14
von The_Dark_Zim-.-
:) Vielen Dank, ich gucke es mir heute Abend mal an.

Re: Globaler Click event für Fenster

Verfasst: 07.11.2018 22:57
von The_Dark_Zim-.-
Der Code von ccode_new funktioniert super. Vielen Dank :)