Maus-Interaktion nach ResizeWindow() nicht möglich

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Maus-Interaktion nach ResizeWindow() nicht möglich

Beitrag von diceman »

Wenn ich mit ResizeWindow() die Fenstergröße ändere, verliert das Programm den kompletten Fokus, und ich kann nicht mehr mit der Maus im Fenster agieren. Das Sprite, welches an der aktuellen Mausposition gezeichnet wird, verbleibt an der aktuellen Stelle.
Was dagegen funktioniert ist CloseWindow, und dann ein neues Fenster öffnen - allerdings gehen hierbei sämtliche geladenen Sprite-Informationen verloren und müssen neu erstellt werden.
Gibt es hier Abhilfe? Danke!
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Re: Maus-Interaktion nach ResizeWindow() nicht möglich

Beitrag von DarkSoul »

Hast du ein Codebeispiel, wo der besagte Fehler auftritt? :mrgreen:
Bild
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Maus-Interaktion nach ResizeWindow() nicht möglich

Beitrag von diceman »

Ja klar, kommt morgen; ich bin gerade im Bereitschaftsdienst mit meinem Laptop am Coden, habe hier kein W-Lan - mit der Außenwelt kommuniziere ich am Firmen-PC und abtippen ist mir grad zu mühselig. Dachte jemand weiß was auf die Schnelle. ;-)

Es geht um mein Minesweeper-Programm - je nach Anzahl der Tiles soll die Fenstergröße angepasst werden.

Ich probiere noch etwas herum und poste dann morgen ein paar Details.
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Maus-Interaktion nach ResizeWindow() nicht möglich

Beitrag von ccode_new »

Hallo diceman,

Richtig, dies:
Was dagegen funktioniert ist CloseWindow, und dann ein neues Fenster öffnen - allerdings gehen hierbei sämtliche geladenen Sprite-Informationen verloren und müssen neu erstellt werden.
Gibt es hier Abhilfe? Danke!
kann keine Lösung sein.

Mmmh.
Wie (an welchen Stellen) setzt du ResizeWindow() ein ?

Wenn du mit Screens (Windows-Screen) arbeitest solltest du auch den Screen gleichzeitig mit anpassen.

Außerdem solltest du bei diesem Vorgang alle Zeichenoperation stoppen (Pausieren) und alle aktuellen Zustände abspeichern.
Danach setzt du die Zeichenoperationen weiter und lädst die gespeicherten Zustände.

Anbei: ExamineMouse() sollte vor ExamineKeyboard() und am Anfang des Event-Loops stehen (vor der Windows-Event-Abfrage))
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Maus-Interaktion nach ResizeWindow() nicht möglich

Beitrag von diceman »

So, ich habe die Lösung für den "Fehler" gefunden; der saß nämlich vor dem PC. ;-)
Die Sache ist die, daß ich nach der Erstellung des Fensters auch einen WindowedScreen erstellt habe, welchen ich - wie du bereits angemerkt hast - mitanpassen muß. Also erst CloseScreen(), dann ResizeWindow(), und dann einen neuen OpenWindowedScreen(). Dann klappt alles wie geschmiert, und auch die Maus, Keyboard, etc. und alle Sprites sind noch aktiv, ohne das irgendwas neu initialisiert werden muß. :allright:

Der einzig etwas doofe (aber nicht tragische) Nebeneffekt ist der, daß ich beim allerersten OpenWindow() diesen mit der #PB_Window_ScreenCentered Konstante initialisiert habe, die aber nicht zusammen mit ResizeWindow()-funktioniert, und so danach das Fenster nicht mehr schön in der Mitte ist. Ich habe mir dann so beholfen, daß ich (statt die #PB-Konstante zu verwenden) mittels ExamineDesktops(), DesktopWidth(0) und DesktopHeight(0) die Fensterbreite und Höhe manuell auslese, und so mittels bekannter Fenstergröße meine eigenen, 100% recyclebaren centered coordinates berechne. :)
Zuletzt geändert von diceman am 17.02.2018 23:19, insgesamt 2-mal geändert.
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Maus-Interaktion nach ResizeWindow() nicht möglich

Beitrag von ccode_new »

@diceman

Schön das es jetzt funktioniert, aber ich bin mit deiner radikalen CloseScreen() - Methode nicht ganz so einverstanden.

Hast du bei OpenWindowedScreen() das AutoStretch - Feature aktiviert ?
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Maus-Interaktion nach ResizeWindow() nicht möglich

Beitrag von diceman »

Oha, CloseScreen() habe ich nur eingesetzt, da ich in meiner Blitzbasic-induzierten Paranoia verhindern wollte, daß irgendwelche Speicher-Ressourcen im Hintergrund nicht freigegeben werden, wenn ich mit OpenWindowedScreen einfach einen neuen Screen öffne, ohne den aktiven vorher zu schließen (ich bin diesbezüglich sehr gewissenhaft geworden und lösche selbst temporäre "Hilfsgrafiken" mit dem FreeImage()-Befehl, sobald ich diese nicht mehr benötige). Notwendig scheint das aber nicht zu sein, und irgendwelche negativen Nebeneffekte scheints auch nicht zu haben ... wie gesagt, das Programm läuft einfach im angepassten Fenster weiter, alle Parameter und Grafiken sind weiter gültig. :?
"AutoStretch" hört sich nützlich an, das gucke ich mir gleich mal an. Danke für den Hinweis!
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Maus-Interaktion nach ResizeWindow() nicht möglich

Beitrag von Sicro »

diceman hat geschrieben:... OpenWindow() ... mit der #PB_Window_ScreenCentered Konstante initialisiert habe, die aber nicht zusammen mit ResizeWindow()-funktioniert, und so danach das Fenster nicht mehr schön in der Mitte ist.
Mach es einfach so:

Code: Alles auswählen

ResizeWindow(...)
HideWindow(0, #False, #PB_Window_ScreenCentered)
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Maus-Interaktion nach ResizeWindow() nicht möglich

Beitrag von ccode_new »

(ich bin diesbezüglich sehr gewissenhaft geworden und lösche selbst temporäre "Hilfsgrafiken" mit dem FreeImage()-Befehl, sobald ich diese nicht mehr benötige).
Sehr vorbildlich und genau richtig.
Notwendig scheint das aber nicht zu sein, und irgendwelche negativen Nebeneffekte scheints auch nicht zu haben ... wie gesagt, das Programm läuft einfach im angepassten Fenster weiter, alle Parameter und Grafiken sind weiter gültig.
Das ist naiv.
Da kann man sich nicht drauf verlassen.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Maus-Interaktion nach ResizeWindow() nicht möglich

Beitrag von diceman »

Sicro hat geschrieben:Mach es einfach so:

Code: Alles auswählen

ResizeWindow(...)
HideWindow(0, #False, #PB_Window_ScreenCentered)
Das ist auch ein schöner Trick, danke! :)
Ich rufe jetzt HideWindow() 2x mal auf, einmal vor der Resize()-Aktion (mit #True), und einmal danach (mit #False). Dadurch vermeidet man, daß man das Fenster kurz einmal an der falschen Stelle aufflackern sieht.
ccode_new hat geschrieben:Das ist naiv.
Da kann man sich nicht drauf verlassen.
Den Grund dafür habe ich doch geschrieben ... ;) Ich habe CloseScreen() genau aus dem Grund benutzt, WEIL ich es für gewissenhaft hielt (Ressourcen-Management 'n shit); wenn ich was Neues aufmache, muß erst das alte zu - so zumindest mein Gedanke. Wenn das falsch sein sollte, dann bin ich natürlich jederzeit aufnahme- und lernbereit. Und momentan scheint mir daran nichts verwerflich zu sein.
Danke!
Zuletzt geändert von diceman am 17.02.2018 23:37, insgesamt 2-mal geändert.
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Antworten