Windowinhalt löschen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Windowinhalt löschen

Beitrag von ProgOldie »

Hallo,
ich zeichne Linien und schreibe formatierte Zahlen in ein Fenster. Diese Anzeige soll aktualisiert werden, wenn die Größe des Fensters geändert wird. Dazu ist in diesem Fall immer ein vollstängies Löschen des bisherigen Fensterinhalte nötig.

Wie macht man das am elegantesten? Fenster schließen und neu Öffnen? oder...?

Dank vorab!
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Re: Windowinhalt löschen

Beitrag von dysti »

Hallo ProgOldie,
ich weiß zwar nicht genau, worauf du hinaus willst. Ich denke, der Anwender soll möglichst wenig von den Neuaufbau mitbekommen.
Das machst du, in dem du die Anzeige deines Fensters bis zum Ende des Neuaufbaus einfriest.
Das geht so:

Code: Alles auswählen

Procedure SetRedraw(hWnd,state)
  SendMessage_(hWnd,#WM_SETREDRAW,state,0)
EndProcedure
Hier ein Aufrufbeispiel:

Einfrieren

Code: Alles auswählen

SetRedraw(GadgetID(#Window_0),0)
Wieder anzeigen

Code: Alles auswählen

SetRedraw(GadgetID(#Window_0),1)
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Windowinhalt löschen

Beitrag von bobobo »

direkt in (eigentlich auf) ein Fenster malen ist doch eh ungescheit da es das canvasgadget gibt.

Code: Alles auswählen

Enumeration
  #win
  #gad
EndEnumeration

Procedure malemal()
  Static m
  StartDrawing(CanvasOutput(#gad))
    Box(0,0,GadgetWidth(#gad),GadgetHeight(#gad),$ADDEFF)
    Line(0,0,GadgetWidth(#gad),GadgetHeight(#gad))
    Line(0,GadgetHeight(#gad),GadgetWidth(#gad),-GadgetHeight(#gad))
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawText(0,0,"Achje .. wie undynamisch",$808080)
    m+1
    dyntext.s=Str(m)+". Neubemalung, ganz schön dünamisch (und falsch)"
    tw=TextWidth(dyntext)
    th=TextHeight(dyntext)
    DrawText(GadgetWidth(#gad)-tw,GadgetHeight(#gad)-th,dyntext,$808080)
  StopDrawing() ; hier wird der Inhalt des Canvasgadgets sichtbar, das Bemalen selber sieht niemand
EndProcedure

OpenWindow(#win,0,0,500,500,"Fänstarr",#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_SizeGadget)
CanvasGadget(#gad,0,0,0,0) ;die Größe ist hier egal da unten in der EventSchleife die Größe gesetzt wird

Repeat
  event=WaitWindowEvent()
  eventtype=EventType()
  Select event
    Case #PB_Event_SizeWindow ;wenn die Fenstergröße geändert wird (das passiert auch einmal ganz am Programmanfang)
      ResizeGadget(#gad,0,0,WindowWidth(0),WindowHeight(0)) ;anpassen an die neue Fenstergröße
      ;
      ;hier wird dann auch das Canvas neu bemalt
      malemal()
    Case #PB_Event_CloseWindow
      quit+1
  EndSelect
Until quit
End
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: Windowinhalt löschen

Beitrag von ProgOldie »

Super!
Danke,bobobo.

Was ich so toll an PB finde, ist die enorme Geschwindigkeit, mit der sämtliche Zeichenelemente an die Fenstergröße angepasst werden.
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Windowinhalt löschen

Beitrag von bobobo »

Im Prinzip schon
aber das kommt sicher auch auf den Umfang der Elemente und die letztlichen Fenstergröße an.

Ich seh hier (Laptop mit lahmer Grafikkarte) schon den einen oder anderen Wackler beim Resizen des Fensters

Da man das Resizen auch einschränken kann windowbounds() ist das eventuell gar nicht so schlimm

Wenn es doll ruckelt, dann kann man ja auch nur den relevanten Teil neu malen.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Antworten