WindowedScreen ständig aktualisieren

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Lebostein
Beiträge: 674
Registriert: 13.09.2004 11:31
Wohnort: Erzgebirge

WindowedScreen ständig aktualisieren

Beitrag 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.
Benutzeravatar
benny
Beiträge: 383
Registriert: 29.08.2004 09:18
Wohnort: Am Ende des www's
Kontaktdaten:

Beitrag 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
So long,
benny!
.
nur t0te f1sche schw1mmen m1t dem str0m - 00100 !
Benutzeravatar
Lebostein
Beiträge: 674
Registriert: 13.09.2004 11:31
Wohnort: Erzgebirge

Beitrag 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.
THEEX
Beiträge: 804
Registriert: 07.09.2004 03:13

Beitrag 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.
sbehrens
Beiträge: 274
Registriert: 08.09.2004 18:41
Kontaktdaten:

Beitrag 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
enjoy life... while you can!
Benutzeravatar
AndyMars
Beiträge: 141
Registriert: 08.09.2004 11:59
Computerausstattung: Win11 Prof 64bit, i5-13500 @ 4.8 GHz, 32GB RAM, Nvidia RTX 4070 TI
Wohnort: Zürich, Schweiz
Kontaktdaten:

Beitrag von AndyMars »

Ich würde mal behaupten, dies sei ein Fall für SetWindowCallback()...
Grüsse von AndyMars
Benutzeravatar
ChaOsKid
Beiträge: 66
Registriert: 29.08.2004 15:07
Wohnort: Oktoberfest

Beitrag 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
Benutzeravatar
Lebostein
Beiträge: 674
Registriert: 13.09.2004 11:31
Wohnort: Erzgebirge

Beitrag 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
Benutzeravatar
AndyMars
Beiträge: 141
Registriert: 08.09.2004 11:59
Computerausstattung: Win11 Prof 64bit, i5-13500 @ 4.8 GHz, 32GB RAM, Nvidia RTX 4070 TI
Wohnort: Zürich, Schweiz
Kontaktdaten:

Beitrag 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
Grüsse von AndyMars
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag 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
Antworten