Dialog-Fesnter aus anderem Thread heraus schließen ?



  • Re,

    also compilieren kann ich es jetzt, aber das Fenster schließt sich nicht...Ich muß den Befehl ja aus dme Thread heraus aufrufen, dieser Thread hat einen Pointer zum Hauptdialig, aber nicht zu diesem Neuen Popup-Fenster. Kann es daran liegen ?

    Thx
    ray



  • IDD_DIALOG muß die ID des zu schließenden Dialogs sein.
    Ich weis nicht ob die ID in der Thread Funktion gültig ist.
    Du kannst einen Zeiger des zu schließenden Dialogs
    der Thread Funk. übergeben.

    Mit diesem Zeiger hast du auch die Möglichkeit
    in der Thread Funk. mit

    p_dialog->SendMessage(WM_CLOSE,0...

    den Dialog zu schließen.

    tomb



  • Ich glaube das IDD_DIALOG als 1 Parameter blödsinn ist.
    Kann jetzt leider nicht in der msdn nachsehen.

    Versuch doch mal als ersten Parameter
    das Fenster bzw. Dialog Handle anzugeben.

    tomb



  • Hi

    tomb schrieb:

    IDD_DIALOG muß die ID des zu schließenden Dialogs sein.
    Ich weis nicht ob die ID in der Thread Funktion gültig ist.
    Du kannst einen Zeiger des zu schließenden Dialogs
    der Thread Funk. übergeben.

    Mit diesem Zeiger hast du auch die Möglichkeit
    in der Thread Funk. mit

    p_dialog->SendMessage(WM_CLOSE,0...

    den Dialog zu schließen.

    tomb

    So würde ich es machen 👍

    Ich glaube das IDD_DIALOG als 1 Parameter blödsinn ist.

    Stimmt, der 1. Parameter ist ein HWND

    Grüße Rapha



  • Das Problem ist nur daß ich mit diesen Pointern noch nie richtig gearbeitet habe (außer diesem einen Pointer in dem Thread-Ding, Rapha weiß Bescheid *g*).

    Könnt ihr mir vielleicht kurz ein beispiel zeigen wie cih so einen pointer erstelle, dann werde ich versuchen das umzusetzen 🙂

    thx
    ray



  • CDialog MyDialog;
    //DlgPtr in der hautpklasse speichern und mittels DlgPtr-> benutzen
    CDialog* DlgPtr=&MyDialog;
    MyDialog.DoModal();



  • Hi sovok,

    klappt leider nicht bei mir 😞 Also ich will das Fenster ja schließen, nicht öffnen also muß ich OnOK(); ausführen, wenn ich aber den pointer so setze wie von Dir beschrieben:

    CDialog* DlgPtr=&CTestDlg;

    error C2275: 'CTestDlg' : illegal use of this type as an expression

    ..habe noch einen Beitrag auf CodeGuru gelesen, da wird So gemacht:

    CTestDlg* m_TestDlg;
    m_TestDlg=new CTestDlg;

    So kann ich wenigstens z.B. eine Memberfunktion von CTestdlg aufrufen (m_TestDlg->test();) aber wenn ich dann OnOK() aufrufe stürtzt das Program mit einem Assertion Fehler ab 😞

    thx
    Ray



  • Hi, du darfst OnOK nicht auserhalb der Dialogklasse aufrufen, da es protected deklariert ist. Benutze die SendMessage-Methode

    CDialog* DlgPtr=&CTestDlg;
    

    Dieser Code kann nicht gehen, da du den Zeiger ja auf einen Typ (=>CTestDlg) zeigen lässt.
    Das ist Schwachsinn, da du ja auch nicht schreibst:

    int = 7;
    cout << int;
    

    Du musst den Zeiger entweder auf eine bestehende "normale" Variable/auf ein Objekt zeigen lassen (wie in dem Beispiel von Sovok), oder du erstelllst mit new ein Objekt dynamisch (dann aber nicht vergessen es mit delete zu löschen).

    Grüße Rapha



  • Hi,

    also nochmal, das wird mir alles zuviel *G*, zumal das ja auch noch Thread-Übergreifend laufen muß:

    Ich habe bisher einfach sowas in der art:

    CTestDlg myDialog; //CtestDlg ist meine KLasse
    myDialog.DoModal();

    Somit wird mein Dialog angezeigt., Nun will ich eben daß dieses ding von einem 2. Thread wieder geschlossen wird. Wenn ich den Pointer jetzt NICHT im Thread2 setze (sondern z.B. noch eine Zeile Vor dem DoModal) und mit
    pPointername->SendMessage(..) das Ding aus Thread2 schließen will kennt er den Pointer nicht (logisch).

    Will ich im Thread mein Pointer setzen kennt er die Klasse CTestDlg nicht. Also dachte ich ich setzte ne Membervariable als Typ CTestDlg, als Name myDialog und die dann als Public ?! dann kann ich wohl im Thread2 den Pointer erzeugen, und erhalte zwar keinen Fehler mehr beim Kompilieren aber mein Hauptdialog erscheint nicht mehr ??? Er kompiliert und fertig....der Dialog kommt einfach nicht mehr ?!

    Und zuletzt, wenn ich das Beispiel von codeguru umbau:

    CTestDlg* pTestDialog = new CTestDlg;
    pTestDialog->SendMessage(WM_CLOSE,0,0);

    Dann bekomme ich wieder diesen Assertion Fehler, aber ich kann andereseits z.b. ein Funktion derCTestDlg Klasse mit

    pTestDialog->Test();

    starten und erhalte keinen Fehler.

    thx
    ray



  • Hi,

    du machst einfach folgendes:

    CTestDlg myDialog; //CtestDlg ist meine KLasse
    CTestDlg* pDialog = &myDialog;
    myDialog.DoModal();
    

    Den Zeiger pDialog übergibst du der Threadfunktion als Parameter.
    in der ThreadFunktion kannst du dann mit pDialog->SendMessage(WM_CLOSE,...
    den Dialog beenden

    rayden5_ schrieb:

    CTestDlg* pTestDialog = new CTestDlg;
    pTestDialog->SendMessage(WM_CLOSE,0,0);

    Dieses Beispiel kann nicht funktionieren, da der Dialog initialisiert sein muss (=>InitDialog). Der Dialog wird initialisiert, sobald du DoModal aufrufst (d.h. InitDialog wird aufgerufen).

    Grüße Rapha


Anmelden zum Antworten