Globaler Click event für Fenster

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Globaler Click event für Fenster

Beitrag 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
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Globaler Click event für Fenster

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Re: Globaler Click event für Fenster

Beitrag von The_Dark_Zim-.- »

Klingt super, werde ich mir heute Abend mal ansehen.
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Re: Globaler Click event für Fenster

Beitrag 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 :(
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Re: Globaler Click event für Fenster

Beitrag 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
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: Globaler Click event für Fenster

Beitrag von HeX0R »

The_Dark_Zim-.- hat geschrieben:[...]ich habe mir mal die neuste Demo Version geladen und folgenden Code ausprobiert.[...]
Wieso denn die Demo? :|
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Re: Globaler Click event für Fenster

Beitrag 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:
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Globaler Click event für Fenster

Beitrag 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
Zuletzt geändert von ccode_new am 07.11.2018 21:07, insgesamt 1-mal geändert.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Re: Globaler Click event für Fenster

Beitrag von The_Dark_Zim-.- »

:) Vielen Dank, ich gucke es mir heute Abend mal an.
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Re: Globaler Click event für Fenster

Beitrag von The_Dark_Zim-.- »

Der Code von ccode_new funktioniert super. Vielen Dank :)
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Antworten