[5.20b13] Window-Repaint-Nachricht, nachdem Win geschlossen

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
Dibap2
Beiträge: 2
Registriert: 25.08.2013 17:26

[5.20b13] Window-Repaint-Nachricht, nachdem Win geschlossen

Beitrag von Dibap2 »

Hallo,

ich bin mir nicht sicher, ob das ein Bug ist, oder seit neuestem ein Feature. Bei Purebasic 5.11 trat dieses Verhalten jedenfalls nicht auf.

Folgendes passiert:
Nachdem ein Unterfenster geöffnet und dann mit CloseWindow geschlossen wurde, tritt für dieses Fenster noch ein Event auf, und zwar #PB_Event_Repaint.
Das erscheint mir unlogisch, da das Fenster zu diesem Zeitpunkt ja bereits geschlossen wurde und tritt unter PB5.11 nicht auf. Das Beispiel unten provoziert diesen Effekt.

Windows7; PB5.20b13

Code: Alles auswählen

;
Global WIsOpened.l
;
If OpenWindow(0, 100, 100, 300, 300, "Test", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar)
  ButtonGadget(10, 20, 20, 100, 35, "Test")
  TextGadget(11, 20, 60, 200, 35, ":")
  ;
EndIf
;
WIsOpened.l = 0
PRGQuit.l = 0
;
Repeat
  ;
  WinEvent.l = WaitWindowEvent()
  WinEventID.l = EventWindow()
  ;
  Select WinEventID.l
    Case 0                 ; Main Window
      ;
      Select WinEvent.l
        Case #PB_Event_Gadget
          If EventGadget() = 10 And WIsOpened.l = 0               ; Button Pressed
            If OpenWindow(1, 120, 120, 200, 200, "SubWindow", #PB_Window_SystemMenu, WindowID(0))
              TextGadget(12, 20, 20, 150, 35, "Test")
              WIsOpened.l = 1
              ;
            EndIf
            ;
          EndIf
          ;
        Case #WM_CLOSE
          PRGQuit.l = 1
          ;
      EndSelect
      ;
    Case 1                 ; SubWindow
      ;
      Select WinEvent.l
        Case #PB_Event_CloseWindow
          CloseWindow(1)
          WIsOpened.l = 0
          ;
      EndSelect
      ;
      If WIsOpened.l = 0
        SetGadgetText(11, "SubWinEvent: " + Str(WinEvent.l))
      EndIf
      ;
  EndSelect
  ;
Until PRGQuit.l
;
CloseWindow(0)
;
End
matbal
Beiträge: 246
Registriert: 30.03.2011 20:53

Re: [5.20b13] Window-Repaint-Nachricht, nachdem Win geschlos

Beitrag von matbal »

Offenbar liefert WindowEvent nicht mehr das richtige Window zum Event.

Dieser Code verhält sich auch unter PB 5.20 beta 13 falsch. Es sollte doch eigentlich immer die Nummer des Fensters unter dem Cursor angezeigt werden?

Code: Alles auswählen

OpenWindow(0, 100, 100, 300, 200, "Window 0")

OpenWindow(1, 450, 100, 300, 200, "Window 1")

Repeat
   event = WaitWindowEvent()
   
   Debug "Window: " + EventWindow() + " Event: " + event
   
Until event = #PB_Event_CloseWindow
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: [5.20b13] Window-Repaint-Nachricht, nachdem Win geschlos

Beitrag von ts-soft »

Beim erstem Code sehe ich keinen Unterschied zu älteren Versionen, habs bis runter nach PB4.31 getested.
Das Fenster liefert kein Repaint Event, nachdem es geschlossen wurde, sondern davor. Es ist nämlich nicht
sofort nach CloseWindow() geschlossen, vorher gibts noch ne Menge Messages :wink:

Der zweite Code funktioniert auch, so wie er sollte. Es werden nur Events auf Fenster 1 angezeigt, da
es das einzige Fenster mit Fokus ist. Einfach mal auf das Fenster 0 klicken und schon gibts die Messages
von Fenster 0 :wink:

Ihr solltet, statt solcher Tests, lieber Bugs melden, die Fehler in einer reallen Anwendung zeigen.
Nicht verstandenes EventHandling bringt hier nichts.

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
matbal
Beiträge: 246
Registriert: 30.03.2011 20:53

Re: [5.20b13] Window-Repaint-Nachricht, nachdem Win geschlos

Beitrag von matbal »

Ich gebe ja zu, daß ich nicht überprüft habe, was 512 und 160 für Events sind, und zu welchem Fenster sie gehören. Ich habe nur die Beta13 mit der aktuellen PB5.11 verglichen. Bis PB5.11 werden diese Events aber immer dem Fenster unter dem Cursor zugeordnet.

Und das fiel mir auch nur auf, weil im Code ganz oben EventWindow() nach dem Schließen des SubWindow bei allen weiteren Events immer noch die Nummer des geschlossenen Window zurückgibt (nur in Pb520b13), was eigentlich falsch sein sollte. (hatte da die gleiche Debugzeile eingebaut wie in meinem Code).
Dibap2
Beiträge: 2
Registriert: 25.08.2013 17:26

Re: [5.20b13] Window-Repaint-Nachricht, nachdem Win geschlos

Beitrag von Dibap2 »

@ts-soft: Ich möchte neben dem Hauptfenster ein Fenster mit Werkzeugen geöffnet haben. Dieses kann der Anwender nach belieben geöffnet haben oder mit den Menü-Einträgen arbeiten. Ich habe das bisher so verstanden, dass man dann zunächst ermittelt, zu welchem Fenster die Events gehören und dann in die Bearbeitung der Events geht.

Es würde mich jetzt interessieren, was an dem Ansatz falsch ist und warum Das falsch verstandenes Event-Handling ist und wie ich es besser machen kann.
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: [5.20b13] Window-Repaint-Nachricht, nachdem Win geschlos

Beitrag von ts-soft »

Falsch ist Deine Annahme, das Repaint Event erfolgt nach dem schliessen des Fensters. Richtig ist, es erfolgt nach dem Befehl CloseWindow() :wink:
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
matbal
Beiträge: 246
Registriert: 30.03.2011 20:53

Re: [5.20b13] Window-Repaint-Nachricht, nachdem Win geschlos

Beitrag von matbal »

Es gibt doch ein Problem mit EventWindow().

Nach dem Schließen des SubWindow wird zwar ein #PB_Event_Repaint ausgelöst, allerdings für das falsche Fenster. Es muß das Hauptfenster neu gezeichnet werden, nicht das geschlossene. Das läßt sich auch leicht zeigen:

Code: Alles auswählen

Global WIsOpened.l

Procedure DrawBlueBox(Window)
   If StartDrawing(WindowOutput(Window))
      Box(50,50,100,100, #Blue)
      StopDrawing()
   EndIf
EndProcedure

   
;
If OpenWindow(0, 100, 100, 300, 300, "Test", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar)
  ButtonGadget(10, 20, 20, 100, 35, "Test")
  TextGadget(11, 20, 60, 200, 35, ":")
  ;
EndIf
;
WIsOpened.l = 0
PRGQuit.l = 0
;
Repeat
  ;
  WinEvent.l = WaitWindowEvent()
  WinEventID.l = EventWindow()
  ;
  ;ShowEvent(WinEvent, WinEventID)
  
  Select WinEventID.l
    Case 0                 ; Main Window
      ;
      Select WinEvent.l
        Case #PB_Event_Gadget
          If EventGadget() = 10 And WIsOpened.l = 0               ; Button Pressed
            If OpenWindow(1, 120, 120, 200, 200, "SubWindow", #PB_Window_SystemMenu, WindowID(0))
              TextGadget(12, 20, 20, 150, 35, "Test")
              WIsOpened.l = 1
              ;
            EndIf
            ;
          EndIf
          ;
        Case #WM_CLOSE
          PRGQuit.l = 1
          ;
      EndSelect
      ;
    Case 1                 ; SubWindow
      ;
      Select WinEvent.l
        Case #PB_Event_CloseWindow
          CloseWindow(1)
          WIsOpened.l = 0
          ;
       Case #PB_Event_Repaint
          DrawBlueBox(1)
          
      EndSelect
      ;
      If WIsOpened.l = 0
        SetGadgetText(11, "SubWinEvent: " + Str(WinEvent.l))
      EndIf
      ;
  EndSelect
  ;
Until PRGQuit.l
;
CloseWindow(0)
;
End


Ich zeichne einfach auf dem SubWindow ein Quadrat. Der Code funktioniert nicht mehr in PB5.20b13, weil hier versucht wird, auf dem nicht mehr existierenden SubWindow zu zeichnen. Mit PB5.11 läuft der Code...

Die Events in meinem Code sind übrigens Windows-Konstanten (#WM_MOUSEMOVE=512 => Maus bewegt sich im Clientbereich und #WM_NCMOUSEMOVE=160 => Maus bewegt sich im Nicht-Clientbereich des Fensters). EventWindow() sollte demzufolge auch hier das richtige Fenster zurückgeben.

Ich denke, so verkehrt lag ich nicht mit meiner Analyse...

(getestet unter Windows XP SP3)
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: [5.20b13] Window-Repaint-Nachricht, nachdem Win geschlos

Beitrag von ts-soft »

Danke für den Code, damit läßt sich der Bug nachvollziehen.
Hab es im engl. Forum gemeldet: http://www.purebasic.fr/english/viewtop ... 84#p422784

PS: Gewöhnt euch bloß ab, alles als Long zu deklarieren, was kein Long ist. Es gibt eine Menge User, die
bereits den 64-Bit Compiler nutzen :mrgreen: . Also, entweder das .l weglassen (ausser, wenn es wirklich erforderlich ist)
oder .i nutzen :wink:

Desweiteren sollte zumindest bei Code, der Bugs anzeigt oder in der Tipps & Tricks sektion gepostet wird,
EnableExplicit genutzt werden.

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
Antworten