Seite 1 von 1
Windowinhalt löschen
Verfasst: 11.12.2012 12:06
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!
Re: Windowinhalt löschen
Verfasst: 11.12.2012 13:31
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
Wieder anzeigen
Re: Windowinhalt löschen
Verfasst: 11.12.2012 14:25
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
Re: Windowinhalt löschen
Verfasst: 12.12.2012 16:33
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.
Re: Windowinhalt löschen
Verfasst: 12.12.2012 20:41
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.