Seite 1 von 2
WindowedScreen ständig aktualisieren
Verfasst: 20.09.2004 11:27
von Lebostein
Hi,
folgendes Problem: Ich arbeite an einem Editor (ganz normales Fenster mit Menüs und Gadgets..), mit dem ich unter anderem Sprites auf einem virtuellen Screen direkt auf dem Fenster darstelle. Öffne ich jetzt zum Beispiel einen FileRequester oder einen Inputrequester, so wird der Screen zerstört bzw. nicht mehr aktualisiert:
Meine Hauptschleife im Editor sieht ungefähr so aus:
Code: Alles auswählen
Procedure UpdateScreen()
UpdateWindow_(Window_ID)
ClearScreen(70,70,70)
...
...
FlipBuffers()
EndProcedure
;Hauptschleife
Repeat
UpdateScreen()
event = WaitWindowEvent()
...
...
Until event = #PB_Event_CloseWindow
Kann man irgendwie ein ständiges Update des Screens erzwingen? Oder irgendwie ständig die Prozedur UpdateScreen() aufrufen? Oder ist vielleicht meine Vorgehensweise etwas stümperhaft

und es gibt eine viel elegantere Lösung?
Danke schon mal im vorraus.
Verfasst: 20.09.2004 12:08
von benny
@Lebostein:
Hmm .. schonmal probiert anstatt:
einfach nur:
zu nehmen
Sollte es helfen, dann schau Dir diesbezüglich auch mal folgenden Thread
an:
http://www.robsite.de/php/pureboard/viewtopic.php?t=141
Verfasst: 20.09.2004 13:10
von Lebostein
Nein, das bringt ja nichts. Sobald ich einen Requester aufrufe, wird ja mein Programm quasi angehalten. Wenn ein Requester offen ist, steht ja meine Hauptschleife still... und da ist es egal, ob hier ein WaitWindowEvent() oder nur ein WindowEvent() steht.
Verfasst: 20.09.2004 13:58
von THEEX
@Lebo
Du könntest hin gehn und selbst eigene Requester Programmieren, die ein Abarbeiten Deiner Schleife mit FlipBuffers usw. weiterhin zulassen. Das ist natürlich mit Arbeit verbunden, aber halt machbar. Ansonsten wird ja Dein Bildschirm eh wieder aktuallisiert, sobald ein Requester wieder geschlossen wurde.
Verfasst: 20.09.2004 13:58
von sbehrens
Hast du schonmal probiert anstatt einem Requester ein Window selber zu machen? Wird bestimmt nicht allzu schwer sein

Aber ich glaube eigentlich doch nicht, dass das helfen wird...
mfG
Basti
Verfasst: 20.09.2004 14:02
von AndyMars
Ich würde mal behaupten, dies sei ein Fall für SetWindowCallback()...
Verfasst: 20.09.2004 14:16
von ChaOsKid
hi Lebostein,
vielleicht hilft es wenn du den requester in einem eigenem thread öffnest.
Code: Alles auswählen
Procedure Window_Screen_Run(Breite.l, Hoehe.l)
PB_Flags.l = #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered
If OpenWindow(0, 0, 0, Breite + 10, Hoehe + 10, PB_Flags, "")
If InitSprite()
If OpenWindowedScreen(WindowID(0), 5, 5, Breite, Hoehe, 1, 10, 10)
Repeat
ClearScreen(0,0,0)
FlipBuffers()
Select WindowEvent()
Case #PB_Event_CloseWindow
Quit = 1
EndSelect
Delay(3)
Until Quit
Else : MessageRequester("Fehler", "OpenWindowedScreen fehler !", 0)
End
EndIf
Else : MessageRequester("Fehler", "InitSprite fehler !", 0)
End
EndIf
Else : MessageRequester("Fehler", "OpenWindow fehler !", 0)
End
EndIf
CloseScreen()
CloseWindow(0)
EndProcedure
Procedure msgbox()
MessageRequester("","")
EndProcedure
CreateThread(@msgbox(),"")
Window_Screen_Run(800,600)
mfG
ChaOsKid
Verfasst: 20.09.2004 15:07
von Lebostein
Wow! Vielen Dank!
Mit den Themen WindowCallback und Threads hab ich mich bisher noch gar nicht beschäftigt... da eröffnen sich ja ganz neue Möglichkeiten
Danke nochmal
Verfasst: 20.09.2004 15:41
von AndyMars
Noch ein Code für die WindowCallback Variante (klicke auf den Screen, um den Requester zu öffnen):
Code: Alles auswählen
Procedure UpdScreen(WindowID, message, wParam, lParam)
Result = #PB_ProcessPureBasicEvents
If message=#WM_PAINT
ClearScreen(0,0,0)
FlipBuffers()
EndIf
ProcedureReturn Result
EndProcedure
If OpenWindow(0,0,0,800,600,#PB_Window_SystemMenu,"Test")=0:End:EndIf
If InitSprite()=0:End:EndIf
If OpenWindowedScreen(WindowID(), 0, 0, 800, 600, 0, 0, 0)=0:End:EndIf
SetWindowCallback(@UpdScreen())
ClearScreen(0,0,0)
FlipBuffers()
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Ende=1
Case #WM_LBUTTONUP
MessageRequester("NervRequester","Klicke OK!")
EndSelect
Until Ende
End
Verfasst: 27.10.2004 12:14
von nco2k
@AndyMars
auch wenns etwas spät kommt:
Code: Alles auswählen
Procedure UpdScreen(WindowID, message, wParam, lParam)
Result = #PB_ProcessPureBasicEvents
If message=#WM_PAINT
;ClearScreen(0,0,0) <----------------------------------- das ist überflüssig
FlipBuffers()
EndIf
ProcedureReturn Result
EndProcedure
If OpenWindow(0,0,0,800,600,#PB_Window_SystemMenu,"Test")=0:End:EndIf
If InitSprite()=0:End:EndIf
If OpenWindowedScreen(WindowID(), 0, 0, 800, 600, 0, 0, 0)=0:End:EndIf
SetWindowCallback(@UpdScreen())
;ClearScreen(0,0,0) <----------------------------------- das gehört hier nicht hin
;FlipBuffers() <----------------------------------- das gehört hier nicht hin
Repeat
FlipBuffers() ;<----------------------------------- das hat hier gefehlt
ClearScreen(0,0,0) ;<----------------------------------- das hat hier gefehlt
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Ende=1
Case #WM_LBUTTONUP
MessageRequester("NervRequester","Klicke OK!")
EndSelect
Until Ende
End
c ya,
nco2k