Event und/oder EventType Unterdrücken ?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

Event und/oder EventType Unterdrücken ?

Beitrag 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 ...
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
mk-soft
Beiträge: 3701
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Event und/oder EventType Unterdrücken ?

Beitrag 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
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

Re: Event und/oder EventType Unterdrücken ?

Beitrag 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.
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Event und/oder EventType Unterdrücken ?

Beitrag 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.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Event und/oder EventType Unterdrücken ?

Beitrag 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
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

Re: Event und/oder EventType Unterdrücken ?

Beitrag von Bisonte »

Wahnsinn... Auf sowas muss man erstmal kommen :allright:

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 ?
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Event und/oder EventType Unterdrücken ?

Beitrag 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
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

Re: Event und/oder EventType Unterdrücken ?

Beitrag 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)
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Event und/oder EventType Unterdrücken ?

Beitrag 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()
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Event und/oder EventType Unterdrücken ?

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten