Seite 1 von 2

Noch einmal SetWindowsColor :-(

Verfasst: 20.04.2019 22:57
von SDL
Nach dem Update auf 5.70 wird wie gewünscht der Fensterhintergrund geändert , da gibt es ein neues Problem

Code: Alles auswählen

OpenWindow(0,0,0,100,100," ",#PB_Window_BorderLess|#PB_Window_WindowCentered|#PB_Window_Maximize )
SetWindowColor(0,$000000);Fensterhintergrund OK
If StartDrawing(WindowOutput(0)) 
    DrawingMode(#PB_2DDrawing_Default)
     Box(50,50,300,300,#Red)
    StopDrawing()
EndIf

ShowCursor_(0)         ;:Cursor aus
Repeat :Until WaitWindowEvent() = #PB_Event_LeftClick
ShowCursor_(1) ;: Cursor an
CloseWindow(0)  
Box ist nicht zu sehen!?

Code: Alles auswählen

OpenWindow(0,0,0,100,100," ",#PB_Window_BorderLess|#PB_Window_WindowCentered|#PB_Window_Maximize )
If StartDrawing(WindowOutput(0)) 
    DrawingMode(#PB_2DDrawing_Default)
    Box(50,50,300,300,#Red)
    StopDrawing()
EndIf

ShowCursor_(0)         ;:Cursor aus
Repeat :Until WaitWindowEvent() = #PB_Event_LeftClick
ShowCursor_(1) ;: Cursor an
CloseWindow(0)  
Box wird angezeigt .!

Code: Alles auswählen

OpenWindow(0,0,0,100,100," ",#PB_Window_BorderLess|#PB_Window_WindowCentered|#PB_Window_Maximize )

SetWindowColor(0,$000000);Fensterhintergrund
ButtonGadget(1000,0,0,0,0,"",0)
If StartDrawing(WindowOutput(0)) 
    DrawingMode(#PB_2DDrawing_Default)
    Box(50,50,300,300,#Red)
    StopDrawing()
EndIf

ShowCursor_(0)         ;:Cursor aus
Repeat :Until WaitWindowEvent() = #PB_Event_LeftClick
ShowCursor_(1) ;: Cursor an
CloseWindow(0)  
Box wird angezeigt ;-)

Win 7 pro / Win 10 / PB 5.70

Käfer oder übersehe ich etwas? Kann jemand ein Tip geben?

Re: Noch einmal SetWindowsColor :-(

Verfasst: 21.04.2019 08:03
von Nino
Problem auch für PB 5.62 und 5.71 beta 1 bestätigt (unter Windows 10).
Ist offenbar ein Bug.

Re: Noch einmal SetWindowsColor :-(

Verfasst: 21.04.2019 22:49
von silbersurfer
@Nino
Ist offenbar ein Bug.
das ist kein Bug
es ist doch klar das der Bildschirm schwaz bleibt, da das Fenster erst in der event schleife seine hintergrundfarbe ändert (erst wenn es gezeichnet wird).
Und StartDrawing() sendet kein Event and das Fenster, also wird es von der Hintergrundfarbe übermalt.

Code: Alles auswählen

OpenWindow(0,0,0,100,100," ",#PB_Window_BorderLess|#PB_Window_WindowCentered|#PB_Window_Maximize )
SetWindowColor(0,$000000);Fensterhintergrund OK
UpdateWindow_(WindowID(0))
If StartDrawing(WindowOutput(0))
    DrawingMode(#PB_2DDrawing_Default)
     Box(50,50,300,300,#Red)
    StopDrawing()
EndIf

ShowCursor_(0)         ;:Cursor aus
Repeat :Until WaitWindowEvent() = #PB_Event_LeftClick
ShowCursor_(1) ;: Cursor an
@SDL
Box wird angezeigt .!
durch das setzen eines ButtonGadget wird ebenso ein event an das geöffnete Fenster gesendet deshalb ist die box hier sichtbar,
da darduch auch der SetWindowColor gleich ausgeführt wird.

Re: Noch einmal SetWindowsColor :-(

Verfasst: 21.04.2019 23:16
von SDL
@silbersurfer

danke für den Tip :allright:

API: UpdateWindow --> das ist die Lösung:-) :praise:

aber so klar ist das für mich noch nicht. SetWindowsColor ist doch ein Event bzw. sollte eins auslösen und nicht erst auf ein anderes Ereignis warten. Der Refresch sollte nach SetWindowsColor, nach meinem Verständnis, erfolgen.
In PB habe ich kein passenden Befehl gefunden um hier nachzuhelfen. :bluescreen:

Re: Noch einmal SetWindowsColor :-(

Verfasst: 21.04.2019 23:42
von Nino
silbersurfer hat geschrieben:es ist doch klar das der Bildschirm schwaz bleibt
Wie schön, dass dir das klar ist.
SDL hat geschrieben:SetWindowsColor ist doch ein Event bzw. sollte eins auslösen und nicht erst auf ein anderes Ereignis warten.
Das finde ich auch.

Re: Noch einmal SetWindowsColor :-(

Verfasst: 22.04.2019 00:43
von Sicro
Probiere das mal:

Code: Alles auswählen

OpenWindow(0,0,0,100,100," ",#PB_Window_BorderLess|#PB_Window_WindowCentered|#PB_Window_Maximize )
SetWindowColor(0,$000000);Fensterhintergrund OK
While WindowEvent() : Wend ; Events abarbeiten
If StartDrawing(WindowOutput(0))
    DrawingMode(#PB_2DDrawing_Default)
     Box(50,50,300,300,#Red)
    StopDrawing()
EndIf

ShowCursor_(0)         ;:Cursor aus
Repeat :Until WaitWindowEvent() = #PB_Event_LeftClick
ShowCursor_(1) ;: Cursor an
CloseWindow(0)

Re: Noch einmal SetWindowsColor :-(

Verfasst: 22.04.2019 08:30
von Nino
Sicro hat geschrieben:Probiere das mal:

Code: Alles auswählen

OpenWindow(0,0,0,100,100," ",#PB_Window_BorderLess|#PB_Window_WindowCentered|#PB_Window_Maximize )
SetWindowColor(0,$000000);Fensterhintergrund OK
While WindowEvent() : Wend ; Events abarbeiten
If StartDrawing(WindowOutput(0))
    DrawingMode(#PB_2DDrawing_Default)
     Box(50,50,300,300,#Red)
    StopDrawing()
EndIf

ShowCursor_(0)         ;:Cursor aus
Repeat :Until WaitWindowEvent() = #PB_Event_LeftClick
ShowCursor_(1) ;: Cursor an
CloseWindow(0)
Das funktioniert hier nicht (PB 5.71 beta 1 unter Windows 10).

Re: Noch einmal SetWindowsColor :-(

Verfasst: 22.04.2019 11:05
von SDL
Danke @Sicro

Funktioniert nicht unter 5.70 /win7 und Win10 .
Hat den gleichen Effekt, zeichnet die Box und dann den schwarzen Hintergrund drüber.

UpdateWindow_(WindowID(Fenster)) hat den gewünschten Effekt.

Wenn ein Gadget gezeichnet wird ist es kein Problem, wenn aber nicht, schon.
Ein Hinweis in der Hilfe wäre schön . bzw eventuell eine Änderung.

Re: Noch einmal SetWindowsColor :-(

Verfasst: 22.04.2019 11:46
von silbersurfer
@SDL
aber so klar ist das für mich noch nicht. SetWindowsColor ist doch ein Event
ja SetWindowColor() sendet ein Event, was aber erst im sichtbaren Fenster ausgeführt wird (das Fenster wird refresht)
sonst würde sich die Farbe ja nicht ändern.
Deshalb ist ja noch lange kein Bug.
z.b

Code: Alles auswählen

SetWindowColor(0,$000000)  ;meldet die Farbe an das Fenster
SendMessage_(WindowID(0),#WM_NCPAINT,1,0) ; Fenster soll neu gezeichnet werden
mit dem SendMessage sende ich nun auch das Repaint Event und denoch bleibt das Fenster schwarz,
weil auch dieser befehl erst bei einen sichtbaren Fenster verarbeitet wird (bei mir unter Windows 10)

Ich denke es liegt an der Event verarbeitung an sich, was auch sicherlich mit dem laufenden Betriebsystem zu tun hat.

@Nino
Wie schön, dass dir das klar ist
Sorry Nino das war wohl etwas falsch von mir formuliert,
aber da beim öffnen von einen Fenster einige Event gesendet werden die eventuell auch erst verarbeitet werden müssen, damit das Fenster dann auch sichtbar dargestellt werden kann, woher willst du denn wissen wann SetWindowColor an der Reihe ist ?

hier ein Auszug von Microsoft Help
Die UpdateWindow-Funktion aktualisiert den Clientbereich des angegebenen Fensters, indem eine WM_PAINT-Nachricht an das Fenster gesendet wird, wenn der Aktualisierungsbereich des Fensters nicht leer ist. Die Funktion sendet eine WM_PAINT-Nachricht direkt an die Fensterprozedur des angegebenen Fensters, wobei die Anwendungswarteschlange umgangen wird. Wenn der Aktualisierungsbereich leer ist, wird keine Nachricht gesendet.

Re: Noch einmal SetWindowsColor :-(

Verfasst: 22.04.2019 15:10
von SDL
@silbersurfer

Code: Alles auswählen

OpenWindow(0,0,0,100,100," ",#PB_Window_BorderLess|#PB_Window_WindowCentered|#PB_Window_Maximize )
ok. Fenster ist geöffnet und alle Systemevents sind raus.

Code: Alles auswählen

If StartDrawing(WindowOutput(0))
    DrawingMode(#PB_2DDrawing_Default)
     Box(50,50,300,300,#Red)
    StopDrawing()
EndIf
Ich zeichne eine Box --> ergo alle Events sind raus mit StopDrawing

Code: Alles auswählen

SetWindowColor(0,$000000)
Alles wird mit schwarz überschrieben, upps.

es ist egal wann SetWindowsColor benutzt wird. Vor dem zeichnen der Box oder danach. Es wird immer erst die Box gezeichnet und dann der Bildschirm gefärbt.
Soweit stimme ich Dir zu.
Es scheint so als wenn erst das schreiben eines Gadget oder UpdateWindow_(WindowID(fenster)) Ordnung in der Darstellungsreihenfolge bringt. Die "Hintergrundfolie" wird erst dann zum Hintergrund. Und das ist so logisch nicht richtig. Ich schreibe die "Hintergrundfolie" außerhalb des Fensters und schiebe sie hinter das Fenster. So kann ich dann auch die Warteschlange umgehen.