Seite 2 von 2

Re: Event und/oder EventType Unterdrücken ?

Verfasst: 25.02.2017 14:51
von Bisonte
Guter Einwand Code Commander :mrgreen:

Allerdings plane ich das ganze auch zu veröffentlichen, und du weisst auch,
dass man sowas dann beinahe absolut narrensicher machen muss... :?

Da ich alles bisher schön mit den nativen PB Funktionen steuern kann, wie SetGadgetColor usw.
wäre das natürlich umso besser, wenn man das ganze auch noch mit der eigenen Nummerierung
oder per #PB_Any hinhauen würde.

@Sicro : Es ist eigentlich nicht das Problem eine Zahl zu finden. Es ist das Problem eine Zahl zu finden,
die NICHT von PB für die GadgetNummerierung genutzt wird. Man stelle sich vor, eine umfangreiche Maske
mit mehr als 100 Gadgets und dann knallt es mit merkwürdigen Fehlern, weil PB die gleichen Nummern erwischt hat
wie die Zahlenspielerei.... Darum gehts.

Deswegen wäre das unterdrücken der restlichen EventTypes für ein Canvasgadget die bessere Wahl, dachte ich mir.
Eventuell über den Callback, wobei danach bestimmt noch ein weiterer Callback kommt... oder ist der GadgetCallback
in der VT vom PB SDK der letzte oder gar der einzige, den das Gadget hat.... bzw. werden dann komplett alle Funktionen
des Gadgets ausgehebelt... wenn ich den ersetze ?
An den hab ich mich noch nicht rangewagt....

Re: Event und/oder EventType Unterdrücken ?

Verfasst: 25.02.2017 17:36
von Sicro
Bisonte hat geschrieben:@Sicro : Es ist eigentlich nicht das Problem eine Zahl zu finden. Es ist das Problem eine Zahl zu finden,
die NICHT von PB für die GadgetNummerierung genutzt wird.
Ja, stimmt. :coderselixir:
Im folgenden Code wird die Problematik nun gelöst, indem echte Gadgets anstatt virtuelle Gadgets erstellt und diese unsichtbar geschaltet werden. Der aktuelle Status kann jetzt per GetGadgetState() ermittelt werden.

Code: Alles auswählen

Enumeration Gadget
  #MyOwnCheckbox_1
  #MyOwnCheckbox_2
  #MyOwnCheckbox_5
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())))
    SetGadgetState(CanvasGadgets(Str(EventGadget()))\Checkbox, Bool(Not GetGadgetState(CanvasGadgets(Str(EventGadget()))\Checkbox)))
    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()))
    PostEvent(#PB_Event_Gadget, EventWindow(), CanvasGadgets(Str(EventGadget()))\Checkbox)
  EndIf
EndProcedure

Procedure.i CreateMyOwnCheckbox(Gadget, x, y, Text$)
  Protected Result
  
  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
    
    Result = CheckBoxGadget(Gadget, 0, 0, 10, 10, "")
    If Gadget = #PB_Any : Gadget = Result : EndIf
    HideGadget(Gadget, #True)
    CanvasGadgets()\Checkbox = Gadget
  EndIf
  
  ProcedureReturn Gadget
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")
  Define MyOwnCheckbox_3 = CreateMyOwnCheckbox(#PB_Any, 10, 90, "Checkbox 3")
  Define MyOwnCheckbox_4 = CreateMyOwnCheckbox(#PB_Any, 10, 130, "Checkbox 4")
  CreateMyOwnCheckbox(#MyOwnCheckbox_5, 10, 170, "Checkbox 5")
  
  Repeat
    Event = WaitWindowEvent()
    
    If Event = #PB_Event_Gadget
      Select EventGadget()
        Case #MyOwnCheckbox_1 : Debug "Checkbox 1 ("+ Str(EventGadget()) +") wurde angeklickt -- Wert: " + GetGadgetState(EventGadget()) ;EventData()
        Case #MyOwnCheckbox_2 : Debug "Checkbox 2 ("+ Str(EventGadget()) +") wurde angeklickt -- Wert: " + GetGadgetState(EventGadget()) ;EventData()
        Case MyOwnCheckbox_3  : Debug "Checkbox 3 ("+ Str(EventGadget()) +") wurde angeklickt -- Wert: " + GetGadgetState(EventGadget()) ;EventData()
        Case MyOwnCheckbox_4  : Debug "Checkbox 4 ("+ Str(EventGadget()) +") wurde angeklickt -- Wert: " + GetGadgetState(EventGadget()) ;EventData()
        Case #MyOwnCheckbox_5 : Debug "Checkbox 5 ("+ Str(EventGadget()) +") wurde angeklickt -- Wert: " + GetGadgetState(EventGadget()) ;EventData()
      EndSelect
    EndIf
    
  Until Event = #PB_Event_CloseWindow
EndIf
Mit den PB-internen Funktionen habe ich mich noch nicht beschäftigt.

Re: Event und/oder EventType Unterdrücken ?

Verfasst: 25.02.2017 18:35
von mk-soft
Mit PB-Internen funktionen habe ich es für Windows und Linux am laufen.
Nur MacOS bekomme ich es nicht hin. Die SDK für Mac gibt es jetzt auch. Steige da aber nicht hinter wie es geht...

http://www.purebasic.fr/german/viewtopi ... =8&t=27851

Re: Event und/oder EventType Unterdrücken ?

Verfasst: 25.02.2017 21:58
von Bisonte
@Sicro: Das ist eine Idee. Es wird zwar alles doppelt, aber das bisschen Speicherverlust kann man verschmerzen. :allright:

@mk-soft:
Genauso hab ich das ganze aufgebaut und erweitert. Bei Mac hab ich auch nix hinbekommen. Aber wenn ich
mir das SDK vom Mac so anschaue, sieht das aus wie OOP... das ist eh nicht meine Welt ;)

Re: Event und/oder EventType Unterdrücken ?

Verfasst: 26.02.2017 12:54
von mk-soft
Bin auch kein fan mehr davon intern die VT zu verbiegen. Sollte sich mal intern etwas ändern funktioniert alles nicht mehr.

OOP finde ich manchmal aber sinnvoll da die Daten immer an den Objekt gebunden sind.
Siehe Beispiel ButtonColorGadget. Link http://www.purebasic.fr/german/viewtopi ... =8&t=28903

Ich selber arbeite auch gerne mit Maps um die zurückgegebene ID zu verwalten. Muss aber jedesmal erst in eine String gewandelt werden.
Dazu hatte ich heute Morgen eine Idee. Der Integer ist bei x86 immer vier byte lang und bei x64 immer acht Byte lang.
Diesen kann man auch direkt als String betrachten und als MapKey übergeben. Muss ja nicht als Mensch leserlich sein.

Mache dafür mal einen neuen Thread auf...

Link http://www.purebasic.fr/german/viewtopi ... =8&t=30065