Zerstörte Fenster wiederherstellen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Gerhard
Beiträge: 37
Registriert: 29.09.2004 23:44
Wohnort: Zedtwitz

Zerstörte Fenster wiederherstellen

Beitrag 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
Benutzeravatar
Lars
Beiträge: 347
Registriert: 31.08.2004 23:53
Wohnort: Shanghai
Kontaktdaten:

Beitrag 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.).)
Lars
The only problem with troubleshooting is, that sometimes the trouble shoots back.
P4 2,6Ghz, 512MB RAM, GeForce 6200, WinXP Pro SP2, PB V3.94
Benutzeravatar
Gerhard
Beiträge: 37
Registriert: 29.09.2004 23:44
Wohnort: Zedtwitz

Beitrag 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
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag 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.
Forgotten Tomb
Beiträge: 21
Registriert: 23.09.2004 15:05
Wohnort: Im Norden
Kontaktdaten:

Beitrag 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.
Blabla, arbeit wieder aufgenommen
Benutzeravatar
Gerhard
Beiträge: 37
Registriert: 29.09.2004 23:44
Wohnort: Zedtwitz

Beitrag 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
Jürgen
Beiträge: 26
Registriert: 27.04.2005 18:04

Beitrag 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
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag 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.
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

Mit InvalidateRect_() (http://msdn.microsoft.com/library/defau ... w_7ano.asp) sollte das machbar sein...
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten