Wie beende ich ein Dialogfenster-Programm?
-
Füg einen Button ein, mach nen Doppelklickdrauf, übernehme den Funktionsnamen den er Dir anbietet, und schreibe folgendes:
void CSystemzeitDlg::OnButton2() { OnOK(); }
-
Dann kommt:
error C3861: "OnOK": Bezeichner wurde nicht gefunden.
-
Wenn auch
CDialog::OnOK();nicht geht, dann ist das kein Dialog.
-
Naja, dann kommen eben zwei Fehlermeldungen:
-Kein Zugriff auf protected Member, dessen Deklaration in der CDialog-Klasse erfolgte
-nzulässiger Aufruf einer nicht statischen Memberfunktion
Gibt es dafür eigentlich keinen Standardbefehl wie exit/killapp/close usw.?
-
lol ? Also
CDialog::OnOK();kann in der tat nicht gehen -.-
OnOK();das muss gehen... solange du auch wirklich in einer von CDialog abgeleiteten Klasse bist...
PostQuitMessage(0)geht auch... unschön

SendMessage(WM_CLOSE);geht auch...
-
Dialoge werden mit EndDialog beendet. Letzten Endes rufen OnOk, OnCancel, und der OnClose Handler diese Funktion auf.
BTW: PostQuitMessage ist wieder mal einfach nur fehl am Platz. Ich verstehe nicht warum dies immer wieder hier empfohlen wird. Man muss nur die Klasse nochmal verwenden und schon beendet es einem die Nachrichtenschleife. Zudem kann man in diesem Fall nicht mal mehr ene Fehlermeldungsdialog anzeigen.
Just my 2 cents.
-
Hey Martin... kannst net mehr lesen? Was meinst de was ich mit Unschön meine? ... Aber hast recht... EndDialog hab ich glatt vergessen...
-
(D)Evil schrieb:
lol ? Also
CDialog::OnOK();kann in der tat nicht gehen -.-
Hmm?

Das muss ich Morgen früh mal nachgucken...
-
Normal sollte es nicht gehen... ist ja nicht static... also bei mir meckert er auch in nem Dlg

-
(D)Evil schrieb:
Normal sollte es nicht gehen... ist ja nicht static... also bei mir meckert er auch in nem Dlg

So, ich habe mal geguckt - bei mir geht es wirklich:
void FehlerDlg::OnOK() { // Der Rest der Funktion CDialog::OnOK(); }Wie willst du denn sonst Funktionen der Basisklasse aufrufen?

Würde ich da oben nur OnOK() aufrufen, hätte ich nen Stack Overflow. :pSchau mal z.B. in ne OnInitDialog, da siehst du das auch. (Und in zig anderen Funktionen, immer wenn explizit die Basisklasse gefordert wird.)

-
(D)Evil schrieb:
Hey Martin... kannst net mehr lesen? Was meinst de was ich mit Unschön meine?
Sry habe ich übersehen!
-
estartu
Jo hast recht... daran hatte ich jetzt nicht gedacht
-
ok, habe festgestellt dass jetzt garkeine Befehle mehr über das Menü ansteuerbar sind, obwohl es zuvor noch ging....sehr seltsam.
-
Mit welchem Befehl beende ich ein Dialogfenster-Programm?
Ist diese Frage jetzt zufriedenstellend beantwortet? Der Begriff Befehl ist nicht sonderlich angebracht, da es sich um Member-Funktionen der MFC handelt. Normalerweise beendet man ein Programm durch Anklicken des "Kreuzes" (rechts oben) , durch Auswahl von "Beenden" im Systemmenü oder durch Alt+F4. Das löst WM_CLOSE aus. Wenn Du eine Funktion hast, die auf diesen Befehl reagiert, z.B. OnClose(), dann wird die Standardkette bis zum Schließen des Fensters und Beenden des Hauptthreads eingeleitet.
WM_DESTROY wird gesendet, wenn das Fenster schließt. WM_QUIT stoppt die Nachrichtenschleife. Gut nachvollziehbar sieht man das bei einer WinAPI-Anwendung: http://www.henkessoft.de/C++/WinAPI/WinAPI Kapitel 1 bis 6/api4.htm