Dialoge
-
Hallo zusammen
ich habe ein Problem. Ich habe mir ein Dialogbasierendes MFC Projekt erzeugt und dort zwei Dialoge erstellt. Mit dem Startdialog springe ich nun durch drücken eines Buttons in den anderen Dialog. (Nicht modaler Dialog).
void CUpdaterDlg::OnBnClickedUpdate() { MessageBox(L"Lizenzpruefung wird gestartet.\nBitte warten"); CUpdaterDlg *UpdateMenu = new CUpdaterDlg; UpdateMenu->Create(IDD_DIALOG1, this); UpdateMenu->ShowWindow(SW_SHOW); // TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein. }
Soweit geht auch alles. nun möchte ich vom zweiten Dialog wieder zurück in den ersten springen und da liegt mein Problem. Es schein so als würde der zweite Dialog nicht reagieren wenn ich einen Button drücke. Ich habe schon versucht zu debuggen aber er durchläuft die nachfolgende Funktion nicht.
void CUpdaterDlg2::OnBnClickedUpdate() { MessageBox(L"Lizenzpruefung wird gestartet.\nBitte warten"); CUpdaterDlg2 *UpdateMenu = new CUpdaterDlg2; UpdateMenu->Create(IDD_DIALOG2, this); UpdateMenu->ShowWindow(SW_SHOW); // TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein. }
Könnt Ihr mir helfen?
-
Was meinst Du mit 'springen'? Soll der 2. geschlossen werden?
Soweit ich das sehe, erzeugst Du jeweils zwei nicht modale Dialog von genau dem Dialog der sie erzeugt. Achte hier auch auf Memleaks.
Hast Du den Sourcecode genau so in Deinem Projekt?
Grüsse
foodax
-
Danke erst einmal für deine Antwort. Ich möchte den Dialog schließen oder wieder in den Vordergrund holen.
Anbei der original Code.
void CUpdaterDlg::OnBnClickedUpdate() { MessageBox(L"Lizenzpruefung wird gestartet.\nBitte warten"); CUpdaterDlg *dlg = new CUpdaterDlg; dlg->Create(IDD_READ_DEVICE_ID, this); dlg->ShowWindow(SW_SHOW); // TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein. }
Hier öffne ich den Dialog "ReadDevice"
void CReadDeviceDlg::OnBnClickedZurueck() { CReadDeviceDlg *dlg = new CReadDeviceDlg; dlg->Create(IDD_UPDATER_DIALOG, this); dlg->ShowWindow(SW_SHOW); // TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein. }
Hier möchte ich mit dem Button "Zurück" wieder in den vorherigen Dialog
-
Es ist sicherlich einfacher in einer Schleife jeweils den einen oder den anderen Dialog per DoModal aufzurufen.
Man beendet jeden Dialog mit EndDialog, setzt ein Flag in seine Dialog Klasse. In der Schleife wird geprüft was der Anwedner will und evtl. der andere Dialog gestartet. Man kann theoretisch sogar eigene Werte für EndDialog verwenden, oder Windows ID... Werte verwenden und selbst entsprechend interpretieren.
-
Ich hatte noch nicht viele Berührungspunkte mit der Oberflächenprogrammierung. Kannst du mir evtl. ein kleines Beispiel für deine Beschreibung geben??
-
Ist doch eigentlich klar, was ich schreibe ...
UINT rc = IDDIALOG1; do { if (rc==IDDIALOG1) { CDialog1 dlg; rc = dlg.DoModal(); } else if (rc==IDDIALOG2) { CDialog2 dlg; rc = dlg.DoModal(); } } while (rc==IDDIALOG1 || rc==IDDIALOG2);
Die Dialog beenden sich mit EndDialog(IDOK) wenn man das Programm beenden will. Wenn man einen anderen Dialog will, dann beendet man den Dialog mit EndDialog(IDDIALOGn)
Die Konstanten IDDIALOGn definiert man passend (>1000 z.B.)
-
Vielen vielen Dank das hat mir sehr geholfen.
-
Hallo noch einmal
ich bin wieder auf ein neues Problem gestoßen. Ich habe aus einem Dialog (erster) ein anderen Dialog (zweiter) geöffnet und aus diesem wieder einen anderen Dialog (dritter) geöffnet. wenn ich nun mit EndDialog den Dialog schließe möchte ich in den ersten Dialog und nicht in den zweiten. Könnt ihr mir helfen?
Gruß Rick0035
-
Wenn Du den 3. zumachst,landest Du doch im zweiten irgendwo bei
void ClassFromDialog2::ShowDialog3() { int rc = dlg3.DoModal(); // ... EndDialog(WHATYOUWANT); // return; // ggfls. }
Gruss
foo
-
Danke vielen Dank!
läuft