Noch einmal SetWindowsColor :-(

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
SDL
Beiträge: 65
Registriert: 15.09.2006 05:19
Computerausstattung: MSI 990FXA-GD80
AMD FX-8350(3,1GHz) 4-4,4GHz
Corsair Dominator Platinum 8GB 2133 (2240)
2 Nvidia GeForce GTX 550Ti
Xilence XQ semipassives Netzteil 750Watt
SATA III WDC WD10 1TB
SATA III SSD Toshiba 128 GB
SATA III SSD Samsung 840 EVO 250 GB
eSATA WDC WD SE16 500 GB

Wassergekühlt

Win 7 pro
Leistungsindex 7,8
Wohnort: Hansestadt Stendal

Noch einmal SetWindowsColor :-(

Beitrag 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?
Zu meiner Schulzeit war die Bildung kostenlos, für einige aber Umsonst.
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Noch einmal SetWindowsColor :-(

Beitrag von Nino »

Problem auch für PB 5.62 und 5.71 beta 1 bestätigt (unter Windows 10).
Ist offenbar ein Bug.
Benutzeravatar
silbersurfer
Beiträge: 174
Registriert: 06.07.2014 12:21

Re: Noch einmal SetWindowsColor :-(

Beitrag 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.
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Benutzeravatar
SDL
Beiträge: 65
Registriert: 15.09.2006 05:19
Computerausstattung: MSI 990FXA-GD80
AMD FX-8350(3,1GHz) 4-4,4GHz
Corsair Dominator Platinum 8GB 2133 (2240)
2 Nvidia GeForce GTX 550Ti
Xilence XQ semipassives Netzteil 750Watt
SATA III WDC WD10 1TB
SATA III SSD Toshiba 128 GB
SATA III SSD Samsung 840 EVO 250 GB
eSATA WDC WD SE16 500 GB

Wassergekühlt

Win 7 pro
Leistungsindex 7,8
Wohnort: Hansestadt Stendal

Re: Noch einmal SetWindowsColor :-(

Beitrag 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:
Zu meiner Schulzeit war die Bildung kostenlos, für einige aber Umsonst.
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Noch einmal SetWindowsColor :-(

Beitrag 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.
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Noch einmal SetWindowsColor :-(

Beitrag 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)
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Noch einmal SetWindowsColor :-(

Beitrag 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).
Benutzeravatar
SDL
Beiträge: 65
Registriert: 15.09.2006 05:19
Computerausstattung: MSI 990FXA-GD80
AMD FX-8350(3,1GHz) 4-4,4GHz
Corsair Dominator Platinum 8GB 2133 (2240)
2 Nvidia GeForce GTX 550Ti
Xilence XQ semipassives Netzteil 750Watt
SATA III WDC WD10 1TB
SATA III SSD Toshiba 128 GB
SATA III SSD Samsung 840 EVO 250 GB
eSATA WDC WD SE16 500 GB

Wassergekühlt

Win 7 pro
Leistungsindex 7,8
Wohnort: Hansestadt Stendal

Re: Noch einmal SetWindowsColor :-(

Beitrag 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.
Zu meiner Schulzeit war die Bildung kostenlos, für einige aber Umsonst.
Benutzeravatar
silbersurfer
Beiträge: 174
Registriert: 06.07.2014 12:21

Re: Noch einmal SetWindowsColor :-(

Beitrag 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.
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Benutzeravatar
SDL
Beiträge: 65
Registriert: 15.09.2006 05:19
Computerausstattung: MSI 990FXA-GD80
AMD FX-8350(3,1GHz) 4-4,4GHz
Corsair Dominator Platinum 8GB 2133 (2240)
2 Nvidia GeForce GTX 550Ti
Xilence XQ semipassives Netzteil 750Watt
SATA III WDC WD10 1TB
SATA III SSD Toshiba 128 GB
SATA III SSD Samsung 840 EVO 250 GB
eSATA WDC WD SE16 500 GB

Wassergekühlt

Win 7 pro
Leistungsindex 7,8
Wohnort: Hansestadt Stendal

Re: Noch einmal SetWindowsColor :-(

Beitrag 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.
Zu meiner Schulzeit war die Bildung kostenlos, für einige aber Umsonst.
Antworten