PureBoard
https://www.purebasic.fr/german/

Noch einmal SetWindowsColor :-(
https://www.purebasic.fr/german/viewtopic.php?f=16&t=31415
Seite 1 von 2

Autor:  SDL [ 20.04.2019 22:57 ]
Betreff des Beitrags:  Noch einmal SetWindowsColor :-(

Nach dem Update auf 5.70 wird wie gewünscht der Fensterhintergrund geändert , da gibt es ein neues Problem

Code:
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:
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:
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?

Autor:  Nino [ 21.04.2019 08:03 ]
Betreff des Beitrags:  Re: Noch einmal SetWindowsColor :-(

Problem auch für PB 5.62 und 5.71 beta 1 bestätigt (unter Windows 10).
Ist offenbar ein Bug.

Autor:  silbersurfer [ 21.04.2019 22:49 ]
Betreff des Beitrags:  Re: Noch einmal SetWindowsColor :-(

@Nino
Zitat:
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:
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
Zitat:
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.

Autor:  SDL [ 21.04.2019 23:16 ]
Betreff des Beitrags:  Re: Noch einmal SetWindowsColor :-(

@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:

Autor:  Nino [ 21.04.2019 23:42 ]
Betreff des Beitrags:  Re: Noch einmal SetWindowsColor :-(

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.

Autor:  Sicro [ 22.04.2019 00:43 ]
Betreff des Beitrags:  Re: Noch einmal SetWindowsColor :-(

Probiere das mal:
Code:
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)

Autor:  Nino [ 22.04.2019 08:30 ]
Betreff des Beitrags:  Re: Noch einmal SetWindowsColor :-(

Sicro hat geschrieben:
Probiere das mal:
Code:
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).

Autor:  SDL [ 22.04.2019 11:05 ]
Betreff des Beitrags:  Re: Noch einmal SetWindowsColor :-(

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.

Autor:  silbersurfer [ 22.04.2019 11:46 ]
Betreff des Beitrags:  Re: Noch einmal SetWindowsColor :-(

@SDL
Zitat:
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:
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
Zitat:
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
Zitat:
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.

Autor:  SDL [ 22.04.2019 15:10 ]
Betreff des Beitrags:  Re: Noch einmal SetWindowsColor :-(

@silbersurfer

Code:
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:
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:
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.

Seite 1 von 2 Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/