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
Habe es jetzt aber auch mit der Vollversion Probiert. Unter Windows geht es, aber Linux halt nicht

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
