Globaler Click event für Fenster
- The_Dark_Zim-.-
- Beiträge: 372
- Registriert: 18.03.2008 16:53
Globaler Click event für Fenster
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
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
Re: Globaler Click event für Fenster
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.
Ansonsten ohne CanvasGadget brauchst du ein Callback.
- The_Dark_Zim-.-
- Beiträge: 372
- Registriert: 18.03.2008 16:53
Re: Globaler Click event für Fenster
Klingt super, werde ich mir heute Abend mal ansehen.
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
- The_Dark_Zim-.-
- Beiträge: 372
- Registriert: 18.03.2008 16:53
Re: Globaler Click event für Fenster
Hey,
ich habe mir mal die neuste Demo Version geladen und folgenden Code ausprobiert.
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:
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
Log:
Ich sehe den Button nicht[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.
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Re: Globaler Click event für Fenster
Funktioniert bei mir auch nicht, bzw. nur mit Subsystem 'qt'.The_Dark_Zim-.- hat geschrieben:Das Funktioniert bei mir unter Linux nicht. Ist das nur bei mir so?
Es gibt einen Bugreport dazu:
https://www.purebasic.fr/english/viewto ... 23&t=69912
- 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
Wieso denn die Demo?The_Dark_Zim-.- hat geschrieben:[...]ich habe mir mal die neuste Demo Version geladen und folgenden Code ausprobiert.[...]
{Home}.:|:.{Codes}.:|:.{Downloads}.:|:.{History Viewer Online}
- The_Dark_Zim-.-
- Beiträge: 372
- Registriert: 18.03.2008 16:53
Re: Globaler Click event für Fenster
War zu Faul das Passwort raus zu suchen
Habe es jetzt aber auch mit der Vollversion Probiert. Unter Windows geht es, aber Linux halt nicht
Habe es jetzt aber auch mit der Vollversion Probiert. Unter Windows geht es, aber Linux halt nicht
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Re: Globaler Click event für Fenster
Den Kling musst du selber erzeugen, aber Maustasten kann man z.B so abfragen:ich suche eine Möglichkeit, wie ich sowohl unter Windows als auch Linux einen einfachen links- und rechts- kling mit der Maus abfragen kann.
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
no Keyboard, press any key
no mouse, you need a cat
- The_Dark_Zim-.-
- Beiträge: 372
- Registriert: 18.03.2008 16:53
Re: Globaler Click event für Fenster
Vielen Dank, ich gucke es mir heute Abend mal an.
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
- The_Dark_Zim-.-
- Beiträge: 372
- Registriert: 18.03.2008 16:53
Re: Globaler Click event für Fenster
Der Code von ccode_new funktioniert super. Vielen Dank
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64