Hauptdialog schließen



  • Hi @all,

    um mein Programm flexibel anzupassen, habe ich mir meine eigene MessageBox erzeugt. Aber wie kann ich mir einen Wert davon zurückgeben lassen?

    Ich rufe in meinem Hauptdialog die Funktion BOOL MsgSenden(CString Msg)auf.

    BOOL CHauptDlg::MsgSenden(CString Msg, BOOL Ok_Abbruch)
    {
    	CMsgBox MyDlg;
    	if (Ok_Abbruch == FALSE)
    		MyDlg.m_bOkAbbruch = FALSE;
    	else
    		MyDlg.m_bOkAbbruch = TRUE;
    	MyDlg.m_strMessage = Msg;
    	MyDlg.DoModal();
    
    	if(MyDlg.OnOk2())   // hier das Problem, wie kriege ich zurück, dass dieser Button gedückt wurde.
    		return TRUE;
    	if(MyDlg.OnAbbruch())
    		return FALSE;
    }
    

    Ich habe versucht OnOk2() einen BOOL Rückgabewert zu geben, aber er reagiert nicht drauf. OnOk2() ist auch schon als public deklariert.
    Rauskommen soll, das mit Click des Buttons nicht nur MyDlg, sondern das ganze Programm geschlossen wird.



  • Die Dialogboxen geben nur IDOK und IDCANCEL zurück.
    Du kannst aber im Dialog eine int-Membervariable deklarieren und für jeden Button eine Funktion schreiben, die den int auf einen jeweiligen wert setzt. Nach DoModal fragst du dann über einen Funktion den intWert ab



  • Hab´s nun so probiert.

    MyDlg.m_strMessage = Msg;
    	MyDlg.DoModal();
    	UpdateData(FALSE); 
    	if(m_bFlag == TRUE)
    		return TRUE;
    	else
    		return FALSE;
    

    In MyDlg

    void CMsgBox::OnOk2() 
    {
    	CHauptDlg MyFirstDlg;
    	MyFirstDlg.m_bFlag = TRUE;
    	CDialog::OnOK();
    }
    

    Aber warum um alles in der Welt wird die Boolsche Variable m_bFlag nicht auf TRUE gesetzt?



  • Du erzeugst in dem zweiten Codefragment eine neue Instanz vom Hauptdialog und die fragst du später gar nicht ab. Wenn du das so machen willst, musst du einen Zeiger auf deinen Hauptdialog übergeben, z.B. im überschriebenen Konstruktor (nicht die zweite Zeile vom Standardkonstruktor vergessen einzubinden). Ich würd eher zu meiner Methode tendieren.



  • Kannst Du deine Methode etwas genauer beschreiben.
    Hab ich nicht so ganz verstanden. 😞



  • Hi,

    Eine MSG-Box gibt nur IDOK oder IDCANCEL zurück.

    if(MyDlg.DoModal() == IDOK)
    {
       return TRUE; // wurde OK gedrückt
    }
    return FALSE; // wurde Abbrechen gedrückt
    

    Was hat eigentlich OnOk2 in einer MSG-Box zu suchen.

    tomb



  • Also, so, wie ich dich verstanden hab, willst du nen Dialog öffnen und abfragen, welcher Button zum schließen gedrückt wurde.

    ////////Im Hauptfenster
    
    CMyDialog dlg;
    dlg.DoModal();
    switch(dlg.GetResult())
    {
       case 0:
            .....
       break;
        /// etc.
    }
    
    //////////in CMyDialog
    
    int m_iResult;
    
    int GetResult(){ return m_iResult;}/////Per Klassenassistent
    
    OnBn1(){ m_iResult=1; OnOK();}//////per KLassenassistent
    OnBn2(){ m_iResult=2; OnOK();}////////per Klassenassistent
    /////etc.
    


  • Hi @tomb,

    tomb schrieb:

    Was hat eigentlich OnOk2 in einer MSG-Box zu suchen.

    Es ist nicht die vorgefertigte MSG-Box von Microsoft. Ich habe den Dialog selber geschrieben, damit ich z.B. die Farbe der MSG-Box selber bestimmen kann.
    OnOk2() ist mein Button im Dialog, der gedrückt wird. Es soll sich in ungefähr so verhalten, wie der OK-Button der normalen MSG-Box bzw. in diesem Fall einfach das gesammte Programm schließen.



  • @CLoop

    Danke, das ist genau das was ich gesucht habe. 😃


Anmelden zum Antworten