Wie kann ich meine Dialogfenster unterscheiden?



  • Hallo.
    In meinem MFC-Programm erzeuge ich durch einen Mausklick zwei Dialogfenster mit jeweils einem „OK“ und einem „Abbrechen“ Button.

    Wenn ich nun auf den „OK“-Button in einem Dialogfenster klicke schicke ich mit
    m_pView->PostMessage(WM_GOODBYE, IDOK);

    eine Message an das übergeordnete Fenster.

    Im Übergeordneten Fenster werte ich die Message mit
    LRESULT CEx07aView::OnGoodbye(WPARAM wParam, LPARAM lParam)
    {
    TRACE("CEx07aView::OnGoodbye %x, %lx\n", wParam, lParam);

    m_pDlg[0]->DestroyWindow();
    m_pDlg[1]->DestroyWindow();

    return 0L;
    }

    aus und schliesse beide Dialogfenster.

    Wie kann ich herausbekommen in welchem Dialogfenster ich den „OK“-Button geklickt habe um nur dieses Dialogfenster zu schliessen?

    Die „TRACE("C...“ Anweisung zeigt mir mit "wParam" nur an welchen Button ich angeklickt habe aber nicht in welchem Dialogfenster er sich befindet.
    Nur wenn ich weis in welchem der Dialogfenster ich den Button angeklickt habe kann ich das entsprechende Dialogfenster schliessen.

    plutonium2



  • Warum schreibst du nicht einfach OnOK(); in die Funktion, die aufgerufen wird, wenn man auf den Button klickt?



  • OnOK schrieb:

    Warum schreibst du nicht einfach OnOK(); in die Funktion, die aufgerufen wird, wenn man auf den Button klickt?

    Und wenns die OnOK ist, dann besser CDialog::OnOK(); sonst gibts nen Stackoverflow. ⚠



  • Hallo OnOK.
    Ich hätte wohl dazu schreiben sollen das es sich um Nicht-Modale Dialogfenster handelt.
    In meinem "Inside Visual C++" Buch steht das mann bei Nicht-Modalen Dialogfenstern
    auf keinen Fall OnOK und OnCancel aufrufen soll.
    Man soll eine Message an die zugehörige Ansicht schicken und die übernimmt dann das löschen.

    plutonium2



  • Du kannst ja auch ne eigene Message definieren.
    WM_GOODBYE_1
    und
    WM_GOODBYE_2
    🙂

    Oder, du gibst this mit statt IDOK.



  • Hey, ja das sollte gehen.
    Bin nicht darauf gekommen.
    Danke.
    Werde ich ausprobieren.
    Es würde mich aber trozdem interesieren ob es eine möglichkeit gibt die Dialogfenster noch anders zu unterscheiden mit nur eine WM_GOODBYE.
    Trozdem vielen Dank.

    plutonium2



  • Nein, Nein, Nein das geht nicht.
    Ich erzeuge zwar zwei Dialogfenster aber es sind zwei Instanzen der selben Klasse.
    Beide greifen also auf das selbe WM_GOODBYE zu und ich muss in der
    einen WM_GOODBYE unterscheiden welche Instanz die Message geschickt hat.

    plutonium2



  • Hallo Estartu
    Ich habe das mal mit der Übergabe von „this“ versucht.
    “m_pView->PostMessage(WM_GOODBYE, this);”
    Bekomme die Fehlermeldung „Konvertierung des Parameters 2 von ‚class CEx07aDialog *const’ in ‚unsignd int’nicht möglich.

    plutonium2



  • Ups, hatte ich nicht dran gedacht, sorry.
    Aber theretisch kannst du einfach ne 1 oder ne 2 mitgeben. Oder die Dialog IDD. 🙂



  • Kannst aber Casten

    m_pView->PostMessage(WM_GOODBYE, 0, (LPARAM)this);

    und in der Message Funktion wieder zurück, (CWnd*) lParam, ein Pointer sollte nichts anderes sein als ein 4 Byte Wert.
    Solltest aber bei LParam casten nicht bei WParam da dieser bei Win95 ? auch nur 2 Byte groß sein darf.

    Damit kannst Du bei bedarf direkt auf den Dialog zugreifen.

    Also in Deinem Fall sollte es so gehen :

    CWnd* pDia = (CWnd*) lParam;
    pDia->DestroyWindow();

    gruss
    Marcus



  • Hallo UserMarcus.

    Das mit dem this übergeben und dann caste’n funktioniert super.
    Ich kann meine verschiedenen Dialogfenster unterscheiden und dementsprechend auch löschen oder sonst was machen.
    Vielen Dank.

    plutonium2


Anmelden zum Antworten