MFC Focus/Sichtbarkeit bei Dialogen
-
bitte lesen ...
Einen dieser Dialoge öffne ich nicht modal sondern mittels 'Create' und lasse in mit ShowWindow anzeigen. Das funktioniert auch alles soweit ganz gut ich kann in diesen beiden Fenstern getrennt arbeiten, Focus, Tab usw geht alles.
-
Das Problem ist scheinbar, dass der Main-Dialog modal aufgerufen wird. Nun bereitet meine Lösung dafür aber weitere Probleme
Ich rufe den Dialog nun direkt aus der Application wie folgt auf:
it_landscapeDlg *dlgLandscape = new it_landscapeDlg; dlgLandscape->Create(it_landscapeDlg::IDD); dlgLandscape->ShowWindow(SW_SHOW);
Der Dialog erscheint, es wird kurzzeitig der Rahmen angezeigt (nur der Rahmen + Menü alle anderen Schaltflächen etc fehlen) und dann schließ sich das ganze wieder von selbst ! Woran kann das liegen ? Ein Parent-Window kann ich ja schlecht übergeben da keins existiert ... ansonsten sehe ich keinen Unterschied zu der Art wie ich den Dialog mittels Create aus einem anderen Dialog öffne!
Hoffe irgendjemand weiss hier eine Lösung für mich!
-
Schau doch selbst wer im Callstack auftaucht, wenn WM_DESTROY ankommt.
-
warum nicht der arufuf wie bisher blos kein parent uebergeben - also das this weg lassen #gg
-
@Mr Evil: genau dass habe ich doch getan ... wann lernen hier manche erst mal zu lesen und dann zu posten ?!
@Martin: kannst du mir das bitte etwas genauer erklären ? Ich Debugge sehr selten über den Callstack und habe da auch nicht wirklich viel Erfahrung mit. Wie sehe ich wenn WM_DESTROY gesendet wird ? Im Call Stack konnte ich nichts dazu finden.
Desweiteren habe ich getestet, was passiert wenn man den Dialog eines neu erstellten Dialog-Projekts (über den MFC-Assistenten) auf meine Weise aufruft.
Es passiert exakt das selbe ... mir drängt sich da der Verdacht auf dass man Dialoge direkt aus der App nur über DoModal und nicht über Create aufrufen kann!
Kann das jemand bestätigen ?
-
1. Bau Dir einen OnDestroy Handler, der wird ja aufgerufen wenn der Dialog zerstört wird.
2. Setze einen Breakpoint auf diesem Handler
3. Lass Dir den Callstack anzeigen. In dem wirst Du den Aufrufer finden, der Deinen Dialog zerstört.
-
Sharik schrieb:
@Mr Evil: genau dass habe ich doch getan ... wann lernen hier manche erst mal zu lesen und dann zu posten ?!
ich habe gelesen - aber anscheinend weisst du selber nicht mehr was du sagst {o;
Sharik schrieb:
Ich rufe den Dialog nun direkt aus der Application wie folgt auf: ...
Sharik schrieb:
Ein Parent-Window kann ich ja schlecht übergeben da keins existiert
Sharik schrieb:
ansonsten sehe ich keinen Unterschied zu der Art wie ich den Dialog mittels Create aus einem anderen Dialog öffne
dh du hast die aufruf funktion verschoben
darum
selbe position wie vorher, wo es einen this gab - nur diesen einfach weg lassenfolglich: dialog aufruf in dem anderen dialog belassen - nur ohne this aufrufen da es kein parent bekommen soll {o;
-
@Mr Evil: ich glaube du verstehst einfach die Problemstellung nicht. Es geht gerade nicht mehr um irgendeinen Unterdialog sondern um den Hauptdialog. Und diesem kann man aus ersichtlichen Gründen kein Parent übergeben
Ganz davon abgesehen habe ich deine Variante gerade getestet mit dem Erfolg dass exakt das selbe passiert ... es stürzt ab. Damit lässt sich bei mir KEIN Dialog ohne Parent öffnen, was es aber eigentlich sollte ...
Ich werde nun mal noch Martins Tipp ausprobieren vllt lässt da besser erkennen voran es liegt!
-
Also ich habe das nun getestet. Und was soll ich sagen ... es wird immer verwirrender! Mit DoModal funktioniert alles bestens, sobald ich Create verwende passiert ... genau garnichts! Auf WM_DESTROY springt er auch nicht an. Er verabschiedet sich schlicht mit ExitCode 0 ...
Im CallStack sieht im wesendlichen auch alles normal aus (zumin ist mir zu DoModal kein großer Unterschied aufgefallen). Martin weisst da da evtl weiter ?
-
Und keine Exception im Debugger?
Wird das Programm oder nur das Fenster beendet?
Ist Dein Object evtl. im Scope auf dem Stack angelegt?
-
1. Nein keine Exceptions.
2. Das ganze Programm.
3. Damit verstehe ich nicht ganz was du meinst ?!Das einzig aufällige ist dass massig Speicherlecks auftreten, was aber denke ich auch mit den nicht richtig ausgeführten Destructoren zusammenhängen kann.
PS:
so habe das jetzt nochmals mit einem Neu erstellten MFC-Dialog-Project (über Assistent) versucht und dieses verhält sich genauso! D.h. springt ebenfalls nicht auf WM_DESTROY an usw ...
einiziger Unterschied ist dass es nur 1 Speicherleck gibt das auf folgenden Code weisst
Ctest2Dlg *dlgLandscape = new Ctest2Dlg;