Seite 1 von 2
Event und/oder EventType Unterdrücken ?
Verfasst: 24.02.2017 14:55
von Bisonte
Hallo.
Ich habe mit einem CanvasGadget eine CheckBox gebaut.
Diese hab ich brav per BindGadgetEvent() an eine Prozedur gebunden, die alle Auswertungen
und die Zeichnerei erledigt.
Soweit so gut. Nun haben wir in der Event Schleife des Fensters folgendes stehen :
Code: Alles auswählen
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case 1
Debug GetGadgetState(1)
EndSelect
EndSelect
Alles funktioniert tadellos. Der Haken ist jetzt, das bei jedem Event des CanvasGadgets (MouseMove usw.)
natürlich die Debugausgabe stattfindet.
Wie kann ich nun alle anderen EventTypes die ich nicht brauche unterdrücken ?
Ein einfaches ProcedureReturn #Null als Rückgabe in der gebundenen EventProzedure reicht
da leider nicht aus ?
(Und Nein : Ein If EventType() = #PB_EventType_LeftButtonDown soll nicht in der Event Schleife stehen !)
So wie halt das originale CheckBoxGadget().
Weiss jemand Rat ?
Vorrangig für Windows... allerdings wäre eine "cross" Variante wünschenswerter ...
Re: Event und/oder EventType Unterdrücken ?
Verfasst: 24.02.2017 18:00
von mk-soft
Nicht das CanvasGadget abfragen, sondern das CheckboxGadget...
Code: Alles auswählen
If OpenWindow(0, 0, 0, 220, 220, "Canvas container example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CanvasGadget(0, 10, 10, 200, 200, #PB_Canvas_Container)
CheckBoxGadget(1, 10, 10, 80, 30, "Check")
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
Debug GetGadgetState(1)
EndSelect
EndIf
Until Event = #PB_Event_CloseWindow
EndIf
Re: Event und/oder EventType Unterdrücken ?
Verfasst: 24.02.2017 18:23
von Bisonte
Es geht ja darum, dass ich komplett ein Gadget NEU gebaut habe (per Canvas ohne den Container aus der Beta!).
Das gleiche wäre z.B. wenn ich einen simplen Button baue.
Da muss man eigentlich auch per If EventType() = .... abfragen, aber der originale Button
gibt keine zusätzlichen EventTypes aus... so etwas meinte ich mit unterdrücken.
Re: Event und/oder EventType Unterdrücken ?
Verfasst: 24.02.2017 21:08
von Sicro
Eigenes EventType?
Code: Alles auswählen
Enumeration Gadget
#CanvasGadget
EndEnumeration
Enumeration #PB_EventType_FirstCustomValue
#Checkbox_Clicked
EndEnumeration
Procedure CanvasGadgetEventHandler()
Protected MouseX = GetGadgetAttribute(EventGadget(), #PB_Canvas_MouseX)
Protected MouseY = GetGadgetAttribute(EventGadget(), #PB_Canvas_MouseY)
If MouseX > 4 And MouseX < 26 And MouseY > 4 And MouseY < 26
SetGadgetData(EventGadget(), Bool(Not GetGadgetData(EventGadget())))
If StartDrawing(CanvasOutput(EventGadget()))
Box(5, 5, 20, 20)
FrontColor(#Black)
DrawingMode(#PB_2DDrawing_Outlined)
Box(5, 5, 20, 20)
If GetGadgetData(EventGadget())
LineXY(5, 5, 25, 25)
LineXY(25, 5, 5, 25)
EndIf
StopDrawing()
EndIf
PostEvent(#PB_Event_Gadget, EventWindow(), EventGadget(), #Checkbox_Clicked)
EndIf
EndProcedure
If OpenWindow(0, 0, 0, 220, 220, "Canvas example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CanvasGadget(#CanvasGadget, 10, 10, 200, 200)
BindGadgetEvent(#CanvasGadget, @CanvasGadgetEventHandler(), #PB_EventType_LeftClick)
; Zeichne Checkbox
If StartDrawing(CanvasOutput(#CanvasGadget))
FrontColor(#Black)
DrawingMode(#PB_2DDrawing_Outlined)
Box(5, 5, 20, 20)
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(30, 5, "My own checkbox")
StopDrawing()
EndIf
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget And EventGadget() = #CanvasGadget And EventType() = #Checkbox_Clicked
Debug "Checkbox wurde angeklickt -- Wert: " + GetGadgetData(#CanvasGadget)
EndIf
Until Event = #PB_Event_CloseWindow
EndIf
Du hättest es aber gerne ohne EventType, damit nur Events vom Gadget gefeuert werden, wenn die linke Maustaste gedrückt wurde, ich weiß.
Vielleicht setze ich mich nachher nochmal dran.
Re: Event und/oder EventType Unterdrücken ?
Verfasst: 24.02.2017 21:55
von Sicro
Ok, hier nun eine Möglichkeit ohne EventType (die Checkboxes sind virtuelle Gadgets):
Code: Alles auswählen
Enumeration Gadget
#MyOwnCheckbox_1
#MyOwnCheckbox_2
EndEnumeration
Structure CanvasGadgetStruc
Checkbox.i
EndStructure
Global.CanvasGadgetStruc NewMap CanvasGadgets()
Procedure CanvasGadgetEventHandler()
Protected MouseX = GetGadgetAttribute(EventGadget(), #PB_Canvas_MouseX)
Protected MouseY = GetGadgetAttribute(EventGadget(), #PB_Canvas_MouseY)
; Ist der Mauszeiger innerhalb der Checkbox?
If MouseX > 4 And MouseX < 26 And MouseY > 4 And MouseY < 26
SetGadgetData(EventGadget(), Bool(Not GetGadgetData(EventGadget())))
If StartDrawing(CanvasOutput(EventGadget()))
Box(5, 5, 20, 20)
FrontColor(#Black)
DrawingMode(#PB_2DDrawing_Outlined)
Box(5, 5, 20, 20)
If GetGadgetData(EventGadget())
; Zeichne ein Kreuz in die Checkbox
LineXY(5, 5, 25, 25)
LineXY(25, 5, 5, 25)
EndIf
StopDrawing()
EndIf
; Sende Klick-Event der virtuellen Checkbox
PostEvent(#PB_Event_Gadget, EventWindow(), CanvasGadgets(Str(EventGadget()))\Checkbox, 0, GetGadgetData(EventGadget()))
EndIf
EndProcedure
Procedure CreateMyOwnCheckbox(Gadget, x, y, Text$)
If AddMapElement(CanvasGadgets(), Str(CanvasGadget(#PB_Any, x, y, 200, 30)))
BindGadgetEvent(Val(MapKey(CanvasGadgets())), @CanvasGadgetEventHandler(), #PB_EventType_LeftClick)
; Zeichne Checkbox
If StartDrawing(CanvasOutput(Val(MapKey(CanvasGadgets()))))
FrontColor(#Black)
DrawingMode(#PB_2DDrawing_Outlined)
Box(5, 5, 20, 20)
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(30, 5, Text$)
StopDrawing()
EndIf
CanvasGadgets()\Checkbox = Gadget
EndIf
EndProcedure
If OpenWindow(0, 0, 0, 220, 220, "Canvas example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreateMyOwnCheckbox(#MyOwnCheckbox_1, 10, 10, "Checkbox 1")
CreateMyOwnCheckbox(#MyOwnCheckbox_2, 10, 50, "Checkbox 2")
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget
Select EventGadget()
Case #MyOwnCheckbox_1 : Debug "Checkbox 1 wurde angeklickt -- Wert: " + EventData()
Case #MyOwnCheckbox_2 : Debug "Checkbox 2 wurde angeklickt -- Wert: " + EventData()
EndSelect
EndIf
Until Event = #PB_Event_CloseWindow
EndIf
Re: Event und/oder EventType Unterdrücken ?
Verfasst: 24.02.2017 23:52
von Bisonte
Wahnsinn... Auf sowas muss man erstmal kommen
Ich leg die Dinger ja auch in einer Map ab... Allerdings dann bei mir direkt, also GadgetID = MapKey.
Aber so rum hätt ich jetzt nicht gedacht ....
Danke.
Edit: Eine Frage hätt ich noch ....
Wie realisiere ich denn jetzt die Gadgeterstellung per #PB_Any ?
Ich erstelle zur zeit so :
Code: Alles auswählen
Procedure FlatBox(Gadget, x, y, Width, Height, Flags = 0)
ID = CanvasGadget(Gadget, x, y, Width, Height)
If Gadget = #PB_Any : Gadget = ID : EndIf
nun würde ich ja eigentlich ein Canvas per #PB_Any erstellen und mir eine Nummer zuweisen lassen,
aber es wurde schon ein #PB_Any angegeben ?
Re: Event und/oder EventType Unterdrücken ?
Verfasst: 25.02.2017 01:14
von Sicro
Bisonte hat geschrieben:Wie realisiere ich denn jetzt die Gadgeterstellung per #PB_Any ?
So müsste es sicher sein:
Code: Alles auswählen
Enumeration Gadget
#MyOwnCheckbox_1
#MyOwnCheckbox_2
EndEnumeration
; WICHTIG: Die nachfolgende Code-Zeile muss hinter der letzten Gadget-Enumeration stehen
Global NextFreeGadgetNumber = #PB_Compiler_EnumerationValue
Structure CanvasGadgetStruc
Checkbox.i
EndStructure
Global.CanvasGadgetStruc NewMap CanvasGadgets()
Procedure CanvasGadgetEventHandler()
Protected MouseX = GetGadgetAttribute(EventGadget(), #PB_Canvas_MouseX)
Protected MouseY = GetGadgetAttribute(EventGadget(), #PB_Canvas_MouseY)
; Ist der Mauszeiger innerhalb der Checkbox?
If MouseX > 4 And MouseX < 26 And MouseY > 4 And MouseY < 26
SetGadgetData(EventGadget(), Bool(Not GetGadgetData(EventGadget())))
If StartDrawing(CanvasOutput(EventGadget()))
Box(5, 5, 20, 20)
FrontColor(#Black)
DrawingMode(#PB_2DDrawing_Outlined)
Box(5, 5, 20, 20)
If GetGadgetData(EventGadget())
; Zeichne ein Kreuz in die Checkbox
LineXY(5, 5, 25, 25)
LineXY(25, 5, 5, 25)
EndIf
StopDrawing()
EndIf
; Sende Klick-Event der virtuellen Checkbox
PostEvent(#PB_Event_Gadget, EventWindow(), CanvasGadgets(Str(EventGadget()))\Checkbox, 0, GetGadgetData(EventGadget()))
EndIf
EndProcedure
Procedure.i CreateMyOwnCheckbox(Gadget, x, y, Text$)
If AddMapElement(CanvasGadgets(), Str(CanvasGadget(#PB_Any, x, y, 200, 30)))
BindGadgetEvent(Val(MapKey(CanvasGadgets())), @CanvasGadgetEventHandler(), #PB_EventType_LeftClick)
; Zeichne Checkbox
If StartDrawing(CanvasOutput(Val(MapKey(CanvasGadgets()))))
FrontColor(#Black)
DrawingMode(#PB_2DDrawing_Outlined)
Box(5, 5, 20, 20)
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(30, 5, Text$)
StopDrawing()
EndIf
If Gadget = #PB_Any
Gadget = NextFreeGadgetNumber
NextFreeGadgetNumber + 1
EndIf
CanvasGadgets()\Checkbox = Gadget
EndIf
ProcedureReturn Gadget
EndProcedure
If OpenWindow(0, 0, 0, 220, 220, "Canvas example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
Define Checkbox_1 = CreateMyOwnCheckbox(#PB_Any, 10, 10, "Checkbox 1")
Define Checkbox_2 = CreateMyOwnCheckbox(#PB_Any, 10, 50, "Checkbox 2")
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget
Select EventGadget()
Case Checkbox_1 : Debug "Checkbox 1 wurde angeklickt -- Wert: " + EventData()
Case Checkbox_2 : Debug "Checkbox 2 wurde angeklickt -- Wert: " + EventData()
EndSelect
EndIf
Until Event = #PB_Event_CloseWindow
EndIf
Re: Event und/oder EventType Unterdrücken ?
Verfasst: 25.02.2017 01:50
von Bisonte
Leider klappt das so nicht...
Mache nach der Gadget eine andere Enumeration die kürzer oder extrem hoch ist und schon ist das Dilemma da....
da muss es doch noch was anderes geben....
Ich sollte vielleicht noch erwähnen, das ich das PB-SDK von wegen Eigene Gadgets erstellen benutze (ähnlich wie mk-soft mit seinem Button)
Re: Event und/oder EventType Unterdrücken ?
Verfasst: 25.02.2017 11:30
von Sicro
Bisonte hat geschrieben:Mache nach der Gadget eine andere Enumeration die kürzer oder extrem hoch ist und schon ist das Dilemma da....
Deshalb kommentierte ich die Code-Zeile mit:
WICHTIG: Die nachfolgende Code-Zeile muss hinter der letzten Gadget-Enumeration stehen
Die Gadget-Nummerierung ist ja zwischen den Fenstern durchgehend und fängt nicht bei jedem Fenster von vorne an. Die Variante ist aber unhandlich und kann schnell zu Fehlern führen, das stimmt.
Am Morgen ist die Welt schon wieder klarer und ich habe eine wesentlich bessere Möglichkeit gefunden:
Code: Alles auswählen
; Wie hoch das Maximum einer Gadget-Nummer wirklich ist, weiß ich gerade nicht
CompilerSelect #PB_Compiler_Processor
CompilerCase #PB_Processor_x86
#MaxGadgetNumber = 2147483647 ; Maximum eines Longs
CompilerCase #PB_Processor_x64
#MaxGadgetNumber = 9223372036854775807 ; Maximum eines Quads
CompilerEndSelect
Procedure.i GetNextFreeGadgetNumber()
Protected i
For i = 0 To #MaxGadgetNumber
If Not IsGadget(i)
ProcedureReturn i
EndIf
Next
EndProcedure
OpenWindow(0, 1, 1, 200, 200, "Test")
ButtonGadget(0, 1, 1, 50, 50, "")
ButtonGadget(#PB_Any, 1, 1, 50, 50, "")
ButtonGadget(1, 1, 1, 50, 50, "")
ButtonGadget(2, 1, 1, 50, 50, "")
Debug GetNextFreeGadgetNumber()
Re: Event und/oder EventType Unterdrücken ?
Verfasst: 25.02.2017 11:48
von ts-soft
Ohne hier alles gelesen zu haben, aber das Problem mit der Gadget-Nummerierung sollte keins sein,
siehe hier:
http://www.purebasic.fr/german/viewtopi ... 32#p339232