mfc hauptappl



  • hi,
    ich hatte voher den nen anderen dialog hier drinnen, der beim start aufgerufen wird, nun wollte ich einen anderen dialog vor dem starten...
    ich hab 2 buttons im dialog: chancel, next
    wenn ich auf next klicke will ich den alten dialog aufmachen, den ich vorher hier drinnen hatte... aber weder next noch chancel reagieren auf etwas;-(
    was kann da sein?

    // Client_Hauptdialog.cpp : Definiert das Klassenverhalten für die Anwendung.
    //
    
    // inlcudes...
    
    // Client_HauptdialogApp
    
    BEGIN_MESSAGE_MAP(Client_HauptdialogApp, CWinApp)
    	ON_COMMAND(ID_HELP, CWinApp::OnHelp)
    END_MESSAGE_MAP()
    
    // Client_HauptdialogApp-Erstellung
    
    Client_HauptdialogApp::Client_HauptdialogApp()
    {
    	// TODO: Hier Code zur Konstruktion einfügen
    	// Alle wichtigen Initialisierungen in InitInstance positionieren
    }
    
    // Das einzige Client_HauptdialogApp-Objekt
    
    Client_HauptdialogApp theApp;
    
    // Client_HauptdialogApp Initialisierung
    
    BOOL Client_HauptdialogApp::InitInstance()
    {
    	// InitCommonControls() ist für Windows XP erforderlich, wenn ein Anwendungsmanifest
    	// die Verwendung von ComCtl32.dll Version 6 oder höher zum Aktivieren
    	// von visuellen Stilen angibt. Ansonsten treten beim Erstellen von Fenstern Fehler auf.
    	InitCommonControls();
    
    	CWinApp::InitInstance();
    
    	AfxEnableControlContainer();
    
    	// Standardinitialisierung
    	// Wenn Sie diese Features nicht verwenden und die Größe
    	// der ausführbaren Datei verringern möchten, entfernen Sie
    	// die nicht erforderlichen Initialisierungsroutinen.
    	// Ändern Sie den Registrierungsschlüssel unter dem Ihre Einstellungen gespeichert sind.
    	// TODO: Ändern Sie diese Zeichenfolge entsprechend,
    	// z.B. zum Namen Ihrer Firma oder Organisation.
    	SetRegistryKey(_T("Vom lokalen Anwendungs-Assistenten generierte Anwendungen"));
    
    	Client_Registration1Dlg dlg_reg1;
    	m_pMainWnd = &dlg_reg1;
    	INT_PTR nResponse = dlg_reg1.DoModal();
    	if (nResponse == ID_Button_Next_Reg1)
    	{
    		// TODO: Fügen Sie hier Code ein, um das Schließen des
    		//  Dialogfelds über "Next" zu steuern
                      // Hier will ich einen neuen Dialog aufmachen...
    		// kann ich das so machen??
                      Client_Registration1Dlg dlg_reg2;
    		m_pMainWnd = &dlg_reg2;
    		INT_PTR nResponse = dlg_reg2.DoModal();
    
    		if (nResponse == ID_Button_Next_Reg2)
    		{
    			// TODO: Fügen Sie hier Code ein, um das Schließen des
    			//  Dialogfelds über "Next" zu steuern
    
    		}
    		else if (nResponse == ID_Button_Cancel_Reg2)
    		{
    			// TODO: Fügen Sie hier Code ein, um das Schließen des
    			//  Dialogfelds über "Abbrechen" zu steuern
    		}
    
    	}
    	else if (nResponse == ID_Button_Cancel_Reg1)
    	{
    		// TODO: Fügen Sie hier Code ein, um das Schließen des
    		//  Dialogfelds über "Abbrechen" zu steuern
    	}
    
    	// Da das Dialogfeld geschlossen wurde, FALSE zurückliefern, so dass wir die
    	//  Anwendung verlassen, anstatt das Nachrichtensystem der Anwendung zu starten.
    	return FALSE;
    }
    


  • Hast du denn in Client_Registration1Dlg für die Buttons überhaupt Behandlungsfunktionen? Wenn du willst, dass DoModal mit einem bestimmten Wert zurückkommt, musst du dort EndDialog aufrufen.



  • Hast du die Todo-Kommentare geschrieben? 😕

    Naja, mir kommen die Rückgabewerte von DoModal ziemlich seltsam vor.
    IMHO kriegt man da nur IDOK oder IDCANCEL - und nix anderes.



  • Hast du denn in Client_Registration1Dlg für die Buttons überhaupt Behandlungsfunktionen? Wenn du willst, dass DoModal mit einem bestimmten Wert zurückkommt, musst du dort EndDialog aufrufen.
    Hast du die Todo-Kommentare geschrieben?
    Naja, mir kommen die Rückgabewerte von DoModal ziemlich seltsam vor.
    IMHO kriegt man da nur IDOK oder IDCANCEL - und nix anderes.

    nö, das mit DoModal hab ich von vorher übernommen...
    das hab ich geschrieben:
    // Dialogfelds über "Next" zu steuern
    // Hier will ich einen neuen Dialog aufmachen...
    // kann ich das so machen??

    // Dialogfelds über "Abbrechen" zu steuern

    ich hab in dem dialog 2 buttons, chancel und next, wenn ich auf chancel drücke will ich die Appl beenden, wenn ich auf next drücke, dann will ich einen anderen dialog aufmachen und den aktuellen
    schliessen....wie mach ich das am einfachsten...brauch ja bei button klick einen rückgabewert..

    bye



  • Also, wenn du Next die ID IDOK gibst und Cancel die IDCANCEL, dann wären die Rückgabewerte geklärt.
    Aber mit den selbstdefinierten, ich glaube das geht so nicht, wäre mir wirklich neu.

    Grundlagen:
    Beende den Dialog mit CDialog::OnOK() -> der Rückgabewert ist IDOK.
    Beende den Dialog mit CDialog::OnCancel() -> der Rückgabewert ist IDCANCEL.

    Ansonsten guck doch mal per Debugger, was du in welchem Fall zurückbekommst. 🙂



  • estartu_de schrieb:

    Also, wenn du Next die ID IDOK gibst und Cancel die IDCANCEL, dann wären die Rückgabewerte geklärt.
    Aber mit den selbstdefinierten, ich glaube das geht so nicht, wäre mir wirklich neu.

    Grundlagen:
    Beende den Dialog mit CDialog::OnOK() -> der Rückgabewert ist IDOK.
    Beende den Dialog mit CDialog::OnCancel() -> der Rückgabewert ist IDCANCEL.

    Ansonsten guck doch mal per Debugger, was du in welchem Fall zurückbekommst. 🙂

    also, weil ich will bei ID IDOK einen anderen dialog aufmachen...und macht das nichts wenn ich 2 gleiche dialog mit ID OK und ID Chancel habe? das war eigentlich der grund warum ich das geändert habe..

    cu



  • Nein, so lange die IDs pro Dialog eindeutig sind, ist das okay. 🙂 (Und sonst würdest du ja vom Editor auch angemeckert werden.)

    Die einzige ID, die sogar pro Dialog mehrfach vorkommen darf ist IDC_STATIC.

    Achja: Resource-IDs schreibt man eigentlich komplett groß, das ist Standard.
    Also ID_BUTTON_NEXT_REG2 statt ID_Button_Next_Reg2.
    So erkennt auch jemand, der den Code zum ersten Mal liest gleich, was das ist. 🙂



  • hi,
    ich hab jetzt das problem das er bei dlg_reg2.DoModal(); nicht blockiert;-( läuft einfach drüber...hm
    aber das erste IDOK wird schon mal erkannt...

    cu

    Client_Registration1Dlg dlg_reg1;
    	m_pMainWnd = &dlg_reg1;
    	INT_PTR nResponse = dlg_reg1.DoModal();
    	if (nResponse == IDOK)
    	{
    		// TODO: Fügen Sie hier Code ein, um das Schließen des
    		//  Dialogfelds über "Next" zu steuern
    		Client_Registration2Dlg dlg_reg2;
    		m_pMainWnd = &dlg_reg2;
    		INT_PTR nResponse = dlg_reg2.DoModal();
    
    		if (nResponse == IDOK)
    		{
    			// TODO: Fügen Sie hier Code ein, um das Schließen des
    			//  Dialogfelds über "Next" zu steuern
    
    		}
    		else if (nResponse == IDCANCEL)
    		{
    			// TODO: Fügen Sie hier Code ein, um das Schließen des
    			//  Dialogfelds über "Abbrechen" zu steuern
    		}
    	}
    	else if (nResponse == IDCANCEL)
    	{
    		// TODO: Fügen Sie hier Code ein, um das Schließen des
    		//  Dialogfelds über "Abbrechen" zu steuern
    	}
    


  • Er läuft einfach drüber? 😮

    Hmm, drück mal "Alles neu erstellen" - nur damit DIE Fehlerquelle ausgeschlossen ist. (VC hat manchmal ne Macke...)

    Dann setz mal einen Breakpoint in die Client_Registration2Dlg::OnInitDialog.
    Wenn er DA schon nicht hinkommt, wirds schwierig. 😞

    Und benenn mal die Variable um, mich wundert eh, dass der Compiler nicht wegen einer Neudeklaration meckert.
    [cpp]INT_PTR nResponse2 = dlg_reg2.DoModal();[/cpp]



  • estartu_de schrieb:

    Aber mit den selbstdefinierten, ich glaube das geht so nicht, wäre mir wirklich neu.

    Und ob das geht.

    Grundlagen:
    Beende den Dialog mit CDialog::OnOK() -> der Rückgabewert ist IDOK.
    Beende den Dialog mit CDialog::OnCancel() -> der Rückgabewert ist IDCANCEL.

    Beende den Dialog mit EndDialog(x) -> der Rückgabewert ist x.



  • Okay, danke! 👍
    Ehrlich gesagt, hatten mir die beiden Möglichkeiten noch immer gereicht. 😉



  • hi, ich hab keine OnInitDialog! beim Client_Registration1Dlg ist auch das gleiche...den hab ich auch selber mit add dialog hinzugefügt... muss ich die selber hinzufügen? komisch sonst ging das doch automatisch?

    cu

    // Client_Registration2Dlg.cpp : implementation file
    //
    
    #include "stdafx.h"
    #include "Client_Hauptdialog.h"
    #include "Client_Registration2Dlg.h"
    #include ".\client_registration2dlg.h"
    
    // Client_Registration2Dlg dialog
    
    IMPLEMENT_DYNAMIC(Client_Registration2Dlg, CDialog)
    Client_Registration2Dlg::Client_Registration2Dlg(CWnd* pParent /*=NULL*/)
    	: CDialog(Client_Registration2Dlg::IDD, pParent)
    {
    }
    
    Client_Registration2Dlg::~Client_Registration2Dlg()
    {
    }
    
    void Client_Registration2Dlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    }
    
    BEGIN_MESSAGE_MAP(Client_Registration2Dlg, CDialog)
    	ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel)
    	ON_BN_CLICKED(IDOK, OnBnClickedOk)
    END_MESSAGE_MAP()
    
    // Client_Registration2Dlg message handlers
    
    void Client_Registration2Dlg::OnBnClickedCancel()
    {
    	// TODO: Add your control notification handler code here
    	OnCancel();
    }
    
    void Client_Registration2Dlg::OnBnClickedOk()
    {
    	// TODO: Add your control notification handler code here
    	OnOK();
    }
    


  • Da ist ja noch gar nix drin, was Fehler machen kann. 😕

    Tja, da fallen mir jetzt zwei Sachen ein:
    1. Anderen Dialog erstellen und versuchen aufzurufen. Wenns geht rüberbauen.
    2. Mit F11 in DoModal reindebuggen und gucken, ob man findet, wo der Fehler ist.



  • hi,
    jetzt läuft es...

    ich hab

    //m_pMainWnd = &dlg_reg1; 
    //m_pMainWnd = &dlg_reg2;
    

    auskommentiert jetzt läuft es....was ist dieses m_pMainWnd???

    cu



  • Übersetz es doch mal stumpf. 😃

    Es ist ein Zeiger auf das Hauptfenster der Anwendung. Falls du den mal von irgendwo brauchst, kommst du mit AfxGetMainWnd wieder dran (musst nur noch casten). 🙂


Log in to reply