BUG: Gadget Reihenfolge

Für allgemeine Fragen zur Programmierung mit PureBasic.
HCB
Beiträge: 4
Registriert: 09.09.2004 12:08

BUG: Gadget Reihenfolge

Beitrag von HCB »

Hallo,

ich musste feststellen das, nachdem ich ein Programm von mir mit der aktuellen Version (win3.93) neu Kompiliert habe, die Gadget nicht mehr anklicken konnte, nach längeren probieren hab ich herausgefunden das es an dem ImageGadget im Hintergrund lag ...

Nehmen wir das Beispiel aus der PureArea:

Code: Alles auswählen

; www.purearea.net (Sourcecode collection by cnesm)
; Author:
; Date: 22. November 2003


;- Window Constants 
; 
#Window_0 = 0 

;- Gadget Constants 
; 
#Gadget_0 = 0 
#Gadget_1 = 1 

CreateImage(0 ,600,300) 
StartDrawing(ImageOutput()) 
  Box(0,0,600,300) 
  Circle(300,150,50,RGB(255,255,255)) 
StopDrawing() 
Procedure Open_Window_0() 
  If OpenWindow(#Window_0, 221, 0, 600, 300,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "New window ( 0 )") 
    If CreateGadgetList(WindowID()) 
      ImageGadget(#Gadget_0, 0, 0, 600, 300, UseImage(0)) 
      ButtonGadget(#Gadget_1, 200, 80, 200, 40, "Hintergrundbild abschalten") 
          
    EndIf 
  EndIf 
EndProcedure 


Open_Window_0() 

Repeat 
  Event = WaitWindowEvent() 
    If event=#PB_event_gadget 
      Select EventGadgetID() 
        Case #Gadget_1 
          If Hide=0 
            HideGadget(#Gadget_0,1) 
            SetGadgetText(#Gadget_1, "Hintergrundbild anschalten") 
            Hide=1 
          Else 
            HideGadget(#Gadget_0,0) 
            SetGadgetText(#Gadget_1, "Hintergrundbild abschalten") 
            Hide=0 
          EndIf 
      EndSelect 
    EndIf 
Until Event = #PB_EventCloseWindow 
End
; ExecutableFormat=Windows
; EnableXP
; EOF
Ich kann den "Hintergrundbild abschalten"-Knopf nicht mit der Maus anklicken!
Wenn ich aber die Reihenfolge von

Code: Alles auswählen

      ImageGadget(#Gadget_0, 0, 0, 600, 300, UseImage(0)) 
      ButtonGadget(#Gadget_1, 200, 80, 200, 40, "Hintergrundbild 
in

Code: Alles auswählen

      ButtonGadget(#Gadget_1, 200, 80, 200, 40, "Hintergrundbild 
      ImageGadget(#Gadget_0, 0, 0, 600, 300, UseImage(0)) 
abändere kann ich den Knopf drücken ... aber nicht unbedingt sehen, da er ja jetzt unter dem ImageGadget ist ...

Habt ihr das selbe Problem?

Ich benutze Win2000 mit PB v 3.93

Ciao,
HCB

PS: Was ist eigentlich mit der Mittleren Maustaste?!?! Die Sache hat doch langsam 'nen Bart ... wenn man die Mittlere Maustaste in einem Scrollbereich gedrückt hält kann man mit dem Mauszeiger frei Scrollen ... ist Standart unter Windows ... trotzdem werden PB Programme immernoch Beendet wenn man die Taste loslässt ... das nervt ... vorallem da man manchmal versehentlich drauf kommt ...
THEEX
Beiträge: 804
Registriert: 07.09.2004 03:13

Beitrag von THEEX »

Das Verhalten des Buttons ist bei mir mit XP auch.
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

Beitrag von ts-soft »

Als dieser Beispiel-Code erstellt wurde, hatte das ImageGadget noch keine Ereignisse erzeugt, was sich inzwischen aber geändert hat. Hintergrundbild dem Window zuordnen, dann funktioniert der Button auch wie gewünscht. Beispiel-Code: http://forums.purebasic.com/german/viewtopic.php?t=2454
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
HCB
Beiträge: 4
Registriert: 09.09.2004 12:08

Beitrag von HCB »

Danke für den Tip :-) ... ändert aber leider nichts an der Tatsache das es ein Bug ist. Denn wenn der Button hinter den ImageGadget ist funktioniert er ja, wird dafür aber nicht unbedingt korreckt/immer angezeigt. Ist er jedoch vor dem ImageGadget wird er korreckt angezeigt, funktioniert aber nicht. :freak:
Ich schätze da stimmt was mit der internen Gadget-Reihenfolge überhaupt nicht ... ich hab erlich gesagt keine Lust auf ein Workaround ... es müsste ja funktionieren ... ;-)

Ciao,
HCB
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

Beitrag von ts-soft »

Ein ImageGadget ist als Container für andere Gadgets seit Version 3.93 nicht mehr geeignet. Das ist kein Bug
Gruß
Thomas
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
HCB
Beiträge: 4
Registriert: 09.09.2004 12:08

Beitrag von HCB »

Jetzt hab ich's kapiert ... nicht das ImageGadget ist das Problem sondern der Bug liegt in den Gadgets allgemein ... naja ... Bug ist Bug ... ;-)

Also zur Erläuterung:
Man hat zum Beispiel 3 überlappende Buttons, die werden dann in der richtigen Reihenfolge angezeigt, also der letzte als Oberster ... diese reagieren aber Falsch auf die Maus ... sprich in der selben Reihenfolge wie sie angezeigt werden, also reagiert der unterste Button zuerst ... das ist der Bug!

Damit's anschaulicher wird ein PB-Programm mit drei überlappenden Buttons:

Code: Alles auswählen

  If OpenWindow(0,0,0,222,200,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"ButtonGadgets") And CreateGadgetList(WindowID(0))
    ButtonGadget(0, 10, 10, 100, 100, "Button 1")
    ButtonGadget(1, 50, 50, 100, 100, "Button 2")
    ButtonGadget(2, 90, 90, 100, 100, "Button 3")
    Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
  EndIf
Und zum Vergleich ein VB5-Programm mit drei überlappenden Buttons: http://www.hcb-server.de/privat/gadgetvb0.exe (Virengeprüft und auf DE-Domain ... also keine Sorge ... ;-) ... Falls VB-Runtime nötig: http://www.hallihallo.de/download.php?id=10 )

Der Unterschied ist offensichtlich ... also doch ein Bug ... :cry:

N8,
HCB
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

Beitrag von ts-soft »

>> 3 überlappende Buttons
Diese Aufgabenstellung ist mir noch nicht vorgekommen. Bei diesem Problem werde ich dir wohl nicht helfen können. :D
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
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

Poste doch einen vollständigen, auf diesen Bug begränzten Code im englischen Bug-Forum.
Da wird darauf am schnellsten reagiert.
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

HCB hat geschrieben:Damit's anschaulicher wird ein PB-Programm mit drei überlappenden Buttons:

Code: Alles auswählen

  If OpenWindow(0,0,0,222,200,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"ButtonGadgets") And CreateGadgetList(WindowID(0))
    ButtonGadget(0, 10, 10, 100, 100, "Button 1")
    ButtonGadget(1, 50, 50, 100, 100, "Button 2")
    ButtonGadget(2, 90, 90, 100, 100, "Button 3")
    Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
  EndIf
Hier mal ein Workaround für Buttons.

Löst natürlich nicht das eigentliche Problem in PB, aber man kann
zumindest sehen worum es geht.

Der zuletzt erstellte Button wird an vorderste Stelle gesetzt,
und dazu noch die 2 Flags #WS_CLIPSIBLINGS und #WS_CLIPCHILDREN
für das korrekte zeichnen.
Wobei in diesem Beispiel nur #WS_CLIPSIBLINGS relevant ist -
dadurch werden sich überlappende Ausschnitte beim zeichnen
des Controls ausgeblendet, wodurch die Darstellung danach
wieder korrekt ist.

Code: Alles auswählen

;
; Gadget order bug test for buttons, PB3.93
;
; by Danilo, 20th March 2005
;
Procedure ButtonGadget2_(ID,X,Y,W,H,TEXT$,FLAGS)

  CompilerIf #PB_Compiler_OS = #PB_OS_Windows

    ;
    ; Workaround for PB/Windows v3.93
    ;
    Gadget=ButtonGadget(ID,X,Y,W,H,TEXT$,#WS_CLIPSIBLINGS|#WS_CLIPCHILDREN|FLAGS)
    If Gadget
      If ID=#PB_ANY
        handle=GadgetID(Gadget)
      Else
        handle=Gadget
      EndIf
      SetWindowPos_(handle,#HWND_TOP,0,0,0,0,#SWP_NOMOVE|#SWP_NOSIZE)
      ProcedureReturn Gadget
    EndIf

  CompilerElse

    ;
    ; other operating systems: no workaround needed
    ; (tested on linux, PB/Linux v3.92)
    ;
    ProcedureReturn ButtonGadget(ID,X,Y,W,H,TEXT$,FLAGS)

  CompilerEndIf
    
EndProcedure


Procedure ButtonGadget_(ID,X,Y,W,H,TEXT$)
  ProcedureReturn ButtonGadget2_(ID,X,Y,W,H,TEXT$,0)
EndProcedure



If OpenWindow(0,0,0,222,400,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"ButtonGadgets")
  CreateGadgetList(WindowID())

  ButtonGadget_ (0,10, 10,100,100,"Button 1")
  ButtonGadget_ (1,50, 50,100,100,"Button 2")
  ButtonGadget_ (2,90, 90,100,100,"Button 3")

  ButtonGadget2_(3,10,210,100,100,"Button 4",#PB_Button_Toggle)
  ButtonGadget2_(4,50,250,100,100,"Button 5",#PB_Button_Toggle)
  ButtonGadget2_(5,90,290,100,100,"Button 6",#PB_Button_Toggle)

  Repeat:Until WaitWindowEvent()=#PB_Event_CloseWindow
EndIf
Getestet auf Windows und Linux.

Auf Linux funktioniert es von Haus aus schon korrekt, so daß
ein Workaround nur auf Windows nötig ist.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
HCB
Beiträge: 4
Registriert: 09.09.2004 12:08

Beitrag von HCB »

@bluejoke: Leider ist mein Englisch mehr als mieserabel ... :-(

@Danilo: Herzlichen Dank ... das Funktioniert super! Aber ein Problem habe ich noch ... ich würde das gern auf ein "PanelGadget" über einem "ImageGadget" anwenden ... und habe leider keine Ahnung wie ... beim "PanelGadget" kann man keine Flags angeben und wenn man's beim "ImageGadget" angibt ist es nicht vorhanden ... ich weis wirklich nicht mehr weiter ... bitte helft mir ... :roll:

Danke,
HCB
Antworten