Seite 1 von 2

Zerstörte Fenster wiederherstellen

Verfasst: 30.09.2004 20:44
von Gerhard
Hallo liebe PureBasic Freunde,
ich bin dabei, ein Amateurfunk Logbuchprogramm zu schreiben. Einige Teile sind schon fertig, unter anderem wende ich in 2 Fenstern auch Grafik an. Damit jedes Fenster auch beim Zerstören refreshed wird, benutze ich vorzugsweise die PureBasic Konstante #PB_EventRepaint. Das heißt, sollte ein Fenster zerstört sein, müsste es wieder hergestellt werden. Wenn der WaitWindowEvent also den Event=#PB_EventRepaint liefert, verzweigt das Programm in der Fensterschleife zu #PB_EventRepaint und dort stehen meine Prozeduren zum Repainten. Jetzt kommts aber…
Die so für einen Refresh eingerichteten Fenster werden nur dann richtig refreshed, wenn ich unter Windows folgende Funktion deaktiviert habe, also dort KEIN Häkchen gemacht habe:
START>EINSTELLUNGEN>SYSTEMSTEUERUNG>ANZEIGE>EFFEKTE>FENSTERINHALT BEIM ZIEHEN ANZEIGEN
Wenn ich in o.g. Windows Einstellung ein Häkchen mache, also das die Fenster beim Ziehen angezeigt werden, dann werden meine Fenster nur refreshed, wenn mal ein anderes Fenster über meinem lag und wieder entfernt wird. Wenn ich mein Fenster aber über den Bildschirmrand hinausziehe und dann wieder zurück in Bildschirmmitte, erfolgt bei dieser Einstellung kein Refresh.
Was soll ich jetzt noch machen? Komme ich da noch mit PureBasic weiter? Wenn jemand die
Lösung weiß, könnte er mir dann die Lösung (evtl. mit Windows Befehlen usw.) aufschreiben? Bitte so einfach wie möglich. Vielen Dank
Gerhard

Verfasst: 30.09.2004 21:34
von Lars
Am einfachsten ist es vielleicht, einfach ein großes ImageGadget zu
nehmen und dieses zu aktualisieren, wenn die Grafiken aktualisiert
werden müssen.

Das heißt dann, dass du auf ein Image malst, anstatt direkt auf das
Fenster und dann dieses Image im ImageGagdet refreshst, wenn sich die
Grafik ändert.

Um das Repaint musst du dich dann nicht kümmern und alles ist bestens :)

(Bevor Zweifel kommen: Die Mögliche Refreshrate eines ImageGadgets
reicht mehr als locker aus, um darauf Filme darzustellen (vorrausgesetzt,
die Auflösung ist nicht zu groß, 1280*1024 oder derartige Scherze sind
also etwas extrem für so hohe Refreshraten.).)

Verfasst: 30.09.2004 23:00
von Gerhard
Lars, danke für Deine Antwort.
Ja, ich habe direkt in das Fenster gemalt, also dann gibt es wohl keine
andere Möglichkeit des Refreshes...hmm. Die Idee mit dem Malen auf
ein Image habe ich noch nicht überlegt. Das klingt interessant. Ich werde
das mal probieren. Kann man aber trotzdem mit Window-Befehlen
dieses Refresh trotzdem erzwingen? Die C-Leute (Arbeitskollegen von
mir) hatten mich mitleidvoll belächelt. Scheinbar geht das in C mit
dem Refresh besser. Schade
ALso danke gell für die Antwort, diese Lösung scheint mir auch gut zu sein.
Gruß
Gerhard

Verfasst: 01.10.2004 03:50
von Zaphod
mit einem callback geht das wohl, ich habe aber vergessen wie (wahrscheinlich über WM_PAINT oder WM_REFRESH oder sowas). das ist ein gradezu antiker bug in purebasic... und mitlerweile glaube ich nichtmehr dran, dass der nochmal gefixt wird.

Verfasst: 01.10.2004 11:58
von Forgotten Tomb
... und was ist wenn ich ein gitter erstelle, so wie im Visual Designer, ich werde doch die Gadgets nicht auf einem Image Gadget plazieren, wie kann man sowas machen.

Verfasst: 01.10.2004 19:30
von Gerhard
Hallo vielen Dank an alle für die Antworten.
Aha, dann ist das mit dem manuellen Refresh evtl. ein Bug in PureBasic.
Naja, ok, ich habe jetzt aber schon den Vorschlag von Lars einmal
ausprobiert und der geht ausgezeichnet. Damit braucht man nie
wieder selbst für den Refresh zu sorgen.
Habt vielen Dank miteinander

Gruß
Gerhard

Verfasst: 31.07.2005 08:33
von Jürgen
Hallo,
ich hatte auch das Problem welches Gerhard hatte. Ich habe mich dann auch mit einem Image beholfen. Nun trat ein neues Problem auf, ich will auf dem Image z.B. ButtonGadgets plazieren. Diese werden leider nicht wiederhergestellt.
Gibt es auch dafür eine Lösung ?

Vielen Dank im voraus....

Jürgen

Verfasst: 31.07.2005 13:56
von Zaphod
ja du kannst du den manuellen refresh machen, in dem du das passende event in einem callback abfängst. leider weiß ich nicht mehr genau, wie das event heißt, dass man abfangen muß... #WM_PAINT oder #WM_REFRESH oder sowas. aber das weiß bestimmt ein anderer hier.

Verfasst: 31.07.2005 17:04
von hardfalcon
Mit InvalidateRect_() (http://msdn.microsoft.com/library/defau ... w_7ano.asp) sollte das machbar sein...

Verfasst: 31.07.2005 17:31
von ts-soft
Entweder so:

Code: Alles auswählen

InvalidateRect_(hWnd, 0, 0)
UpdateWindow_(hWnd)
oder so:

Code: Alles auswählen

RedrawWindow_(hWnd, 0, 0, #RDW_FRAME | #RDW_INVALIDATE | #RDW_ALLCHILDREN | #RDW_UPDATENOW | #RDW_INTERNALPAINT)
Einfach mal probieren ob's klappt. hWnd ist das Händel zum Fenster oder Control