Drei Dialogfragen



  • 1. Ich habe in meine C..View einen Dialog als Membervariable und muss nun an einer Stelle prüfen, ob dieser Dialog gerade offen ist oder nicht. Wie mache ich das?

    2. Ist es OK, den Dialog, wenn ich ihn von außen beende, einfach mit EndDialog(...) zu schließen oder sollte man da eine andere Funktion bevorzugen?

    3. Ich starte einen Dialog aus einem (Arbeits-)Thread heraus. Leider ist dieser dann nicht im Vordergrund. Wie mache ich ihn zum obersten Fenster?
    [Wie mache ich zum obersten Fenster meiner Anwendung und wie zum obersten Fenster allgemein in Windows?]



  • 1. ein dialog hat immer ein hWnd prüfe das ob es gültig ist

    if(m_MyDlg.m_hWnd != NULL)
    

    2. EndDialog ist zwar winapi wenn mich nicht alles täuscht aber warum soll man es nicht verwenden können,

    SendMessage(hwnd,WM_DLGCANCEL,0,0)
    

    zum schließenden Dialog wäre auch ne möglichkeit.

    3. SetForegroundWindow bringt das Fenster in den Fordergrund


  • Mod

    Evolver schrieb:

    1. Ich habe in meine C..View einen Dialog als Membervariable und muss nun an einer Stelle prüfen, ob dieser Dialog gerade offen ist oder nicht. Wie mache ich das?

    Für mich wäre hier schon die Frage: Modal oder nicht. Wenn Modal, warum willst Du wissen ob der Dialog offen ist?
    Denn in diesem Fal läuft ja eine eigene Nachrichtenschleife und jedes andere Fenster (Mainframe) könnte kontrollieren ob es gerade per EnableWndow deaktiviert wurde weil ein Dialog aupoppt.

    Evolver schrieb:

    2. Ist es OK, den Dialog, wenn ich ihn von außen beende, einfach mit EndDialog(...) zu schließen oder sollte man da eine andere Funktion bevorzugen?

    Modal oder nicht? Modale Dialoge müssen unbedingt mit EndDialog beendet werden. (BTW @LowFly, das ist auch eine Memberfunktion in der MFC!)

    Evolver schrieb:

    3. Ich starte einen Dialog aus einem (Arbeits-)Thread heraus. Leider ist dieser dann nicht im Vordergrund. Wie mache ich ihn zum obersten Fenster?

    Du könntest das bestehende CMainFrame Window, oder den bestehenden Dialog einfach als Parent angeben. Dann wird automatisch korrekt kaskadiert. Ob anderer Thread oder nicht spielt keine Rolle.



  • SetForgroundWindow erzeugt beim Ausführen leider immer einen Fehler (der Debugger meckert, sagt mir etwas von 'User Breakpoint' nach der Stelle des Aufrufens).

    Wenn ich einen Parent angeben will, brauche ich einen CWnd-Zeiger, der mir aber eigentlich nicht zur Verfügung steht. Aber ein FensterHandle hätte ich anzubieten. Kann ich damit auch irgendwie den Parent festlegen, um das gewünschte Resultat zu erhalten?



  • Weiß denn niemand Rat?


  • Mod

    Beschäftige dich doch mal mit den Basics:
    1. Wie bekomme ich ein CWnd von einem HWND?
    Mit CWnd::FromHandle!
    2. Mein Programm stürzt ab, warum hilft mir keiner?
    Weil Du keinen Code zeigst und uns nicht sagst in welchem Kontext (Stracktrace) es kracht!

    Just my 2 cents! :xmas1:



  • CDlgConnectionAsk askDlg;
    CWnd parent;
    parent.FromHandle(OuterThis->mParent->mWindowHandle);
    askDlg.SetParent(&parent);
    int dlgReturnID = askDlg.DoModal();
    

    Der Code steht nun in meinem Thread und bricht ebenso zur Laufzeit ab, mit selber Meldung wie bei SetForgroundWindow. (Lasse ich den Fehler ignorieren, so wird danach der Dialog wie gewünscht im Vordergrund angezeigt.)


  • Mod

    😡 😮 Lies doch mal bitte ein Sückchen Doku!
    1. SetParent kann nur auf ein bestehendes Fenster ausgeführt werden!
    2. Dann sag uns doch mal wo es kracht. Es ist mit Sicherheit eine Stelle an der ein m_hWnd!=NULL erwartet wird.

    CWnd *pPrarent = CWnd::FromHandle(OuterThis->mParent->mWindowHandle);
    CMyDialog askDialog(pParent);
    int dlgReturnID = askDlg.DoModal();
    

    :xmas2:



  • Ah, mit deinem Code passt dieser Teil jetzt. Leider tritt ein neues Problem auf. Bitte nicht beschweren, ich denke Code zu posten bringt nur bedingt etwas, es ist wohl eher wieder eine Grundsatzfrage. Falls ich mich täusche, sagen!

    Also es kann passieren, dass ein zum Zeitpunkt des Öffnens von obigem Dialog [D1] ein anderer modaler Dialog [D2] geöffnet ist (dieser wird aus der C..View heraus erstellt). Schließe ich nun D1, so ist der Fokus auf meinem Hauptfenster und nicht auf dem modalen Dialog D2. Ich kann nun im Hauptfenster arbeiten, obwohl ein modaler Dialog offen ist! Wie kann ich dies verhindern?



  • Es wäre nichtmal so schlimm, dass sich der Dialog dann wie ein nichtmodaler verhält, aber natürlich liegt dann ein Fehlverhalten vor und es kann zu damit verbundenen Programmfehlern kommen.
    Schließe ich beispielsweise das Hauptfenster, wenn der Dialog noch offen ist, meldet mir der Debugger einen Fehler in der Funktion CWnd::RunModalLoop und ich schätze der passiert genau dort, wo versucht wird den Dialog zu schließen.


  • Mod

    Auch hier bringt dich lesen weiter:
    Jeder Dialog hat einen Initialisierungsparameter, einen Zeiger auf das Parent Window.
    Ich verstehe nur nicht ganz wie ein neurer modaler Dialog geöffnet werden kann der separat geschlossen werden kann? Modal, heißt eben, kein anderes Fenster darf aktiv sein.


Anmelden zum Antworten