Allgemeine Fragen zur PROFAN Programmierung
Views (Heute): 243008 (4444)
  Suchen
 Zurück zur Übersicht
 AutorThema: Wie Dialogbox bis zum Schliessen im Vordergrund halten?
Kai Ebersbach
Datum:27.04.02 17:08 Antwortenals Email verschicken (k.ebersbach@gmx.de) 


Hallo,

ich habe folgende Frage:

Gibt es eine Möglichkeit, ein mit @createdialog erzeugtes Dialogfenster solange im Vordergund zu halten, bis es durch ein @destroywindow geschlossen wird?

Hintergrund: In einem Spiel muss im Verlauf eine Dialogbox eingeblendet werden. Das Spielfenster ist ein Window mit dem WindowStyle 64 (also ohne Titelzeile), welches ausserdem den kompletten Bildschirm mit 1024x768 Punkten belegt (damit keine Taskleiste). Klickt nun der Benutzer aus Versehen neben die Dialogbox, so verschwindet diese im Hintergrund (Spielbildschirm im Vordergrund) und die Buttons zum Schliessen der Dialogbox sind nicht mehr erreichbar. Ohne Beenden der Dialogbox kann das Spiel aber nicht fortgesetzt werden.

Vielen Dank für alle Ideen und Vorschläge zur Problemlösung!

Kai


Sven Schmidts
Datum:27.04.02 17:20 Antwortenals Email verschicken (schmidts@flat2serv.de) 


Hallo,

wenn Du das Handle hast, dann kannst Du es mit "SetWindowPos" permanent im Vordergrund behalten.

Mfg.
Sven Schmidts


Kai Ebersbach
Datum:27.04.02 18:15 Antwortenals Email verschicken (k.ebersbach@gmx.de) 


Hallo Sven,

Danke für Deine schnelle Antwort!

Ich habe es gleich mal ausprobiert:

---
declare _dlg2%
let _dlg2%=@createdialog(%Hwnd,"Text",100,100,824,568)
SetWindowPos _dlg2%=100,100-824,568;-1
---

-1 soll laut Profan Hilfe für "immer im Vordergrund" stehen.
Leider verschwindet die Dialogbox nach wie vor hinter dem Spielfenster mit dem Handle %Hwnd, sobald auf dieses geklickt wird :-(

Komischerweise bleibt eine andere Dialogbox auch ohne SetWindowPos im Vordergrund obwohl ich auf den Spielbildschirm am restlichen verbleibenden Rand klicke. Da habe ich aber nichts anders gemacht, die Dialogbox ist lediglich grösser:
let _dlg%=@createdialog(%Hwnd,"Text",10,10,1004,758)

Mache ich was flasch oder bin ich nur zu dusselig?

Kai


Rolf Koch
Datum:27.04.02 23:38 Antwortenals Email verschicken (webmaster@rokosoft.de) 


Jetzt, wo Du dies bestätigst -
Kann es sein, das ein Bug in Profan vorliegt?
Denn niemals hat es bei mir richtig funktioniert mit
dem letzten Parameter in SetwindowPos.
Testet mal hiermit - oder hab ich auch nen Denkfehler?

' CODE ERZEUGT MIT ROKO'S OBJECT CREATOR V 2.5
' DATUM  27.04.2002    um  23:25 Uhr
' VERWENDETE PROFANVERSION IST 7.0 ODER HÖHER
'********************** DATEN ***********************************
SETTRUECOLOR 1
DECLARE ENDE%
DECLARE DLG&
DECLARE BUTTON1%
Windowstyle 64
WINDOW 0,0-800,600
DLG&=CREATE("DIALOG",%HWND,"Testfenster",83,82,568,348)
USEFONT "MS Sans Serif",13,0,0,0,0
SETDIALOGFONT 1
BUTTON1% =@CREATE("BUTTON",DLG&,"Ende",0247,0126,0070,0030)
print "Dialog sollte nun in den Hintergrund - TASTE"
Waitinput
SetWindowPos dlg&=83,82-568,348;-2
print "Dialog sollte nun in den Vordergrund - TASTE"
Waitinput
SetWindowPos dlg&=83,82-568,348;-1
WHILENOT ENDE%
WAITINPUT
   If @EQU(%KEY,2)
      LET ENDE%= 1
   ELSEIF GETFOCUS(BUTTON1%) 'BUTTON
      Let Ende%=1
   ENDIF
WEND

Rolf


Uwe ''Pascal'' Niemeier
Datum:28.04.02 10:36 Antwortenals Email verschicken (Pascalxd@owl-online.de) 


Hallo Rolf!

Da sind tatsächlich ein paar Denkfehler versteckt:

Ein Dialog kann (normalerweise) nicht von seinem Elternfenster verdeckt werden.
Setze mal als übergeordnetes Fenster 0 ein, dann sieht das schon anders aus.

Selbst ein Dialog mit der Eigenschaft BOTTOM-MOST kommt nach vorn, wenn er den Focus
hat/kriegt (es sei denn, ein Fenster mit TOP-MOST liegt noch darüber).

Wenn der Dialog den Focus hat, kann das Hauptfenster mit WaitInput keine Ereignisse
mehr empfangen, weil es ja den Focus nicht hat; da muss man auf GetMessage ausweichen.

Solche Sachen können einen zur Verzweifelung treiben, vor Allem, wenn man dann auch
noch die Fensterstile ins Spiel bringt... ;-}

HTH
Pascal


Kai Ebersbach
Datum:28.04.02 11:05 Antwortenals Email verschicken (k.ebersbach@gmx.de) 


Hallo Rolf, hallo Uwe,

Rolf: Ich habe Dein Beispiel getestet. Bei mir bleibt die Dialogbox immer im Vordergrund, obwohl der Parameter -2 zuerst angegeben ist und die Textausgabe sagt, dass das Fenster eigentlich im Hintergrund sein sollte. Lediglich die Farbe der Titelzeile ändert sich von blau auf grau, wenn auf das Hauptfenster geklickt wird (das ist auch normal so).
Ein Klick neben das Hauptfenster bringt andere geöffnete Tasks in den Vordergrund, auch das ist wohl normal.

Ich werde mal die andere Schreibwiese der CREATE Funktion in meinem Proggi testen, vielleicht macht das ja was aus...

Uwe: Du schreibst normalerwiese sollte eine Dialogbox nicht vom Elternfenster verdeckt werden können, leider ist aber genau das bei mir der Fall und zwar verhält sich im selben Programm die @createdialog Funktion offenbar unterschiedlich...

Wie kann ich denn als übergeordnetes Fenster 0 einsetzen? Meinst Du damit den Wert des Handles vom Hauptfenster (%Hwnd)?

Du hast recht, es ist zum Verzeifeln, da will man einen Registrierhinweis einblenden und wenn der Anwender daneben klickt geht gar nix mehr *mifft* :-)

Schönen Sonntag Euch allen!

Kai


Kai Ebersbach
Datum: 28.04.02 11:42 Antwortenals Email verschicken (k.ebersbach@gmx.de) 


Hallo nochmal,

ich habe meinen Quelltext noch einmal durchgesehen... *schäm*

Ein vergessenes @destroywindow an der falschen Stelle schloss meinen Dialog bei einem Klick neben das Fenster... dadurch konnten die im Dialogfeld enthaltenen Buttons keine Werte zurückliefern und die while-Schleife wurde nicht beendet...

Auf die Spur kam ich dem Ganzen, als ich das Spiel mal in einem anderen WindowStyle bei höherer Bildschirmauflösung laufen liess... da verschwand die Dialogbox nicht etwa hinter dem Spielfenster, sondern ganz...

Sorry für die ganze Mühe, die ich Euch durch meine Dusseligkeit verursacht habe, bei inzwischen ca. 6400 Zeilen Code habe ich wohl den Überblick etwas verloren...

Viele Grüsse

Kai


 Zurück zur Übersicht