MFC Focus/Sichtbarkeit bei Dialogen



  • Hallo,

    folgende Ausgangsituation:
    Ich habe eine auf Dialogen basierende Anwendung.
    Es gibt einen Haupt-Dialog und mehrere Child-Dialoge. Die Child-Dialoge werden mittels "Create" initiiert und mittels "ShowWindow" angezeigt.

    ich habe folgendes Problem:
    Wenn ein Child-Dialog geöffnet ist und ich den Focus auf den Haupt-Dialog zurücksetze(manuell per Mausklick) wird zwar der Focus scheinbar richtig gesetzt (TAB funktioniert korrekt und Menü-Tastenkürzel etc auch), ABER der Haupt-Dialog bleibt im Hintergrund und überlagert NICHT den Child-Dialog !

    Ich habe schon einige Dialog Eigenschaften durchprobiert komme aber zu keinem Ergebnis ... woran liegt ? Geht das überhaupt oder habe ich da einen grundlegenden Fehler ?

    Gruß
    Mike


  • Mod

    Wie immerist in der MSDN alles dokumentiert:
    http://msdn.microsoft.com/en-us/library/ms632680(vs.85).aspx

    Lies bitte speziell den Abschnitt zu WS_EX_CONTROLPARENT



  • Ich habe mich vllt falsch ausgedrückt ...
    Ich habe einen Haupt-Dialog. Aus diesem werden mehrere andere Dialoge modal geöffnet (Popups) und nicht im Sinne von Parent-Child in den Parent eingebettet!

    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 besteht darin, dass dieser 'Unterdialog' den Hauptdialog anzeigentechnisch überlagert!
    Ich habe nun schon einiges ausprobiert mit TopMostStyle usw aber ohne Erfolg.

    Der Aufruf des Unterfensters(Dialog)

    it_ScheduleDlg *dlgSchedule = new it_ScheduleDlg(this);
    
    dlgSchedule->Create(it_ScheduleDlg::IDD);
    dlgSchedule->ShowWindow(SW_SHOW);
    

    Kopfzeilen des Hauptdialogs aus dem Res.Editor

    IDD_IT_LANDSCAPE_DIALOG DIALOGEX 0, 0, 697, 405
    STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
    EXSTYLE WS_EX_TOPMOST | WS_EX_CONTROLPARENT | WS_EX_APPWINDOW
    

    Kopfzeilen des Unterdialogs aus dem Res.Editor

    IDD_SCHEDULE DIALOGEX 0, 0, 703, 413
    STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
    EXSTYLE WS_EX_APPWINDOW
    

    DS_MODALFRAME und DS_SETFOREGROUND habe ich auch schonmal weggelassen aber ohne Erfolg ...

    Hoffe ich habe mein Problem einiger Massen verständlich beschrieben und jemand weiss was ich evtl falsch gemacht haben könnte mir gehen nämlich langsam die Ideen aus!

    Gruß
    Mike



  • "modal" bedeutet afaik doch, dass die dialoge immer im vordergrund sind, oder nicht? versuch mal, die dialoge nicht-modal zu öffnen.



  • 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!


  • Mod

    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 ?


  • Mod

    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 lassen

    folglich: 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 ?


  • Mod

    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;
    

Log in to reply