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:

Bild

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

Code: Alles auswählen

event = WaitWindowEvent()
einfach nur:

Code: Alles auswählen

event = WindowEvent()
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 :mrgreen:

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